194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#ifdef ANDROID 294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez #include "include/valgrind.h" 394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* -*- c -*- 594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ---------------------------------------------------------------- 694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Notice that the following BSD-style license applies to this one 894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez file (valgrind.h) only. The rest of Valgrind is licensed under the 994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez terms of the GNU General Public License, version 2, unless 1094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez otherwise indicated. See the COPYING file in the source 1194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez distribution for details. 1294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ---------------------------------------------------------------- 1494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez This file is part of Valgrind, a dynamic binary instrumentation 1694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez framework. 1794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Copyright (C) 2000-2010 Julian Seward. All rights reserved. 1994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Redistribution and use in source and binary forms, with or without 2194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez modification, are permitted provided that the following conditions 2294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez are met: 2394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 1. Redistributions of source code must retain the above copyright 2594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez notice, this list of conditions and the following disclaimer. 2694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 2. The origin of this software must not be misrepresented; you must 2894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez not claim that you wrote the original software. If you use this 2994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez software in a product, an acknowledgment in the product 3094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez documentation would be appreciated but is not required. 3194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3. Altered source versions must be plainly marked as such, and must 3394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez not be misrepresented as being the original software. 3494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 4. The name of the author may not be used to endorse or promote 3694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez products derived from this software without specific prior written 3794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez permission. 3894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 3994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 4094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 4194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 4394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 4594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 4694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 4794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 4894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 4994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 5194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ---------------------------------------------------------------- 5294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 5394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Notice that the above BSD-style license applies to this one file 5494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (valgrind.h) only. The entire rest of Valgrind is licensed under 5594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez the terms of the GNU General Public License, version 2. See the 5694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez COPYING file in the source distribution for details. 5794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 5894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ---------------------------------------------------------------- 5994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 6094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 6194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 6294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This file is for inclusion into client (your!) code. 6394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 6494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez You can use these macros to manipulate and query Valgrind's 6594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez execution inside your own programs. 6694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 6794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The resulting executables will still run without Valgrind, just a 6894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez little bit more slowly than they otherwise would, but otherwise 6994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unchanged. When not running on valgrind, each client request 7094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez consumes very few (eg. 7) instructions, so the resulting performance 7194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez loss is negligible unless you plan to execute client requests 7294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez millions of times per second. Nevertheless, if that is still a 7394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez problem, you can compile with the NVALGRIND symbol defined (gcc 7494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez -DNVALGRIND) so that client requests are not even compiled in. */ 7594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 7694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#ifndef __VALGRIND_H 7794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_H 7894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 7994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 8094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 8194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* VERSION NUMBER OF VALGRIND */ 8294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 8394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 8494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Specify Valgrind's version number, so that user code can 8594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez conditionally compile based on our version number. Note that these 8694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez were introduced at version 3.6 and so do not exist in version 3.5 8794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez or earlier. The recommended way to use them to check for "version 8894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez X.Y or later" is (eg) 8994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(__VALGRIND_MAJOR__) && defined(__VALGRIND_MINOR__) \ 9194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez && (__VALGRIND_MAJOR__ > 3 \ 9294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) 9394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 9494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_MAJOR__ 3 9594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __VALGRIND_MINOR__ 6 9694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 9894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <stdarg.h> 9994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Nb: this file might be included in a file compiled with -ansi. So 10194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez we can't use C++ style "//" comments nor the "asm" keyword (instead 10294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez use "__asm__"). */ 10394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 10494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Derive some tags indicating what the target platform is. Note 10594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that in this file we're using the compiler's CPP symbols for 10694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez identifying architectures, which are different to the ones we use 10794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez within the rest of Valgrind. Note, __powerpc__ is active for both 10894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 32 and 64-bit PPC, whereas __powerpc64__ is only active for the 10994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez latter (on Linux, that is). 11094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 11194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Misc note: how to find out what's predefined in gcc by default: 11294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez gcc -Wp,-dM somefile.c 11394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_aix5 11594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_aix5 11694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_darwin 11794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_darwin 11894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_win32 11994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_linux 12094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_linux 12194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_linux 12294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_linux 12394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_arm_linux 12494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 12594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_AIX) && defined(__64BIT__) 12694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_ppc64_aix5 1 12794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(_AIX) && !defined(__64BIT__) 12894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_ppc32_aix5 1 12994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__APPLE__) && defined(__i386__) 13094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_x86_darwin 1 13194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__APPLE__) && defined(__x86_64__) 13294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_amd64_darwin 1 13394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__MINGW32__) || defined(__CYGWIN32__) || defined(_WIN32) && defined(_M_IX86) 13494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_x86_win32 1 13594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__i386__) 13694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_x86_linux 1 13794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__x86_64__) 13894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_amd64_linux 1 13994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) 14094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_ppc32_linux 1 14194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) 14294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_ppc64_linux 1 14394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#elif defined(__linux__) && defined(__arm__) 14494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define PLAT_arm_linux 1 14594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 14694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* If we're not compiling for our target platform, don't generate 14794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez any inline asms. */ 14894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# if !defined(NVALGRIND) 14994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define NVALGRIND 1 15094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# endif 15194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 15294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 15394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 15494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 15594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ 15694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* in here of use to end-users -- skip to the next section. */ 15794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 15894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 15994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND) 16094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 16194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Define NVALGRIND to completely remove the Valgrind magic sequence 16294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez from the compiled code (analogous to NDEBUG's effects on 16394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez assert()) */ 16494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 16594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 16694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 16794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { \ 16894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (_zzq_rlval) = (_zzq_default); \ 16994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 17094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 17194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /* ! NVALGRIND */ 17294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 17394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* The following defines the magic code sequences which the JITter 17494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez spots and handles magically. Don't look too closely at them as 17594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez they will rot your brain. 17694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 17794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The assembly code sequences for all architectures is in this one 17894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez file. This is because this file must be stand-alone, and we don't 17994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez want to have multiple files. 18094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 18194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default 18294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez value gets put in the return slot, so that everything works when 18394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez this is executed not under Valgrind. Args are passed in a memory 18494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez block, and so there's no intrinsic limit to the number that could 18594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez be passed, but it's currently five. 18694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 18794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The macro args are: 18894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval result lvalue 18994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_default default value (result returned when running on real CPU) 19094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_request request code 19194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1..5 request params 19294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 19394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The other two macros are used to support function wrapping, and are 19494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the 19594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez guest's NRADDR pseudo-register and whatever other information is 19694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez needed to safely run the call original from the wrapper: on 19794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ppc64-linux, the R2 value at the divert point is also needed. This 19894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez information is abstracted into a user-visible type, OrigFn. 19994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 20094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_* behaves the same as the following on the 20194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez guest, but guarantees that the branch instruction will not be 20294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: 20394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a 20494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez complete inline asm, since it needs to be combined with more magic 20594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez inline asm stuff to be useful. 20694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 20794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 20894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-{linux,darwin} ---------------- */ 20994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 21094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \ 21194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez || (defined(PLAT_x86_win32) && defined(__GNUC__)) 21294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 21394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 21494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 21594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int nraddr; /* where's the code? */ 21694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 21794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 21894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 21994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 22094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "roll $3, %%edi ; roll $13, %%edi\n\t" \ 22194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "roll $29, %%edi ; roll $19, %%edi\n\t" 22294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 22394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 22494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 22594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 22694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile unsigned int _zzq_args[6]; \ 22794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned int _zzq_result; \ 22894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned int)(_zzq_request); \ 22994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 23094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 23194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 23294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 23394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 23494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 23594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %EDX = client_request ( %EAX ) */ \ 23694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgl %%ebx,%%ebx" \ 23794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=d" (_zzq_result) \ 23894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 23994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 24094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 24194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 24294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 24394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 24494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 24594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 24694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned int __addr; \ 24794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 24894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %EAX = guest_NRADDR */ \ 24994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgl %%ecx,%%ecx" \ 25094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=a" (__addr) \ 25194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 25294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 25394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 25494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 25594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 25694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 25794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_EAX \ 25894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 25994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* call-noredir *%EAX */ \ 26094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgl %%edx,%%edx\n\t" 26194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_linux || PLAT_x86_darwin || (PLAT_x86_win32 && __GNUC__) */ 26294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 26394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-Win32 ------------------------- */ 26494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 26594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_win32) && !defined(__GNUC__) 26694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 26794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 26894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 26994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int nraddr; /* where's the code? */ 27094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 27194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 27294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 27394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 27494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 27594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 27694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm rol edi, 3 __asm rol edi, 13 \ 27794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm rol edi, 29 __asm rol edi, 19 27894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 27994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 28094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 28194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 28294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile uintptr_t _zzq_args[6]; \ 28394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned int _zzq_result; \ 28494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (uintptr_t)(_zzq_request); \ 28594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (uintptr_t)(_zzq_arg1); \ 28694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (uintptr_t)(_zzq_arg2); \ 28794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (uintptr_t)(_zzq_arg3); \ 28894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (uintptr_t)(_zzq_arg4); \ 28994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (uintptr_t)(_zzq_arg5); \ 29094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default \ 29194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 29294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %EDX = client_request ( %EAX ) */ \ 29394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm xchg ebx,ebx \ 29494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm mov _zzq_result, edx \ 29594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } \ 29694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 29794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 29894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 29994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 30094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 30194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned int __addr; \ 30294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm { __SPECIAL_INSTRUCTION_PREAMBLE \ 30394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %EAX = guest_NRADDR */ \ 30494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm xchg ecx,ecx \ 30594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm mov __addr, eax \ 30694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } \ 30794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 30894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 30994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 31094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_EAX ERROR 31194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 31294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 31394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#error Unsupported compiler. 31494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 31594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 31694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_win32 */ 31794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 31894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ amd64-{linux,darwin} --------------- */ 31994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 32094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) 32194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 32294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 32394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 32494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long long int nraddr; /* where's the code? */ 32594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 32694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 32794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 32894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 32994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ 33094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" 33194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 33294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 33394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 33494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 33594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile unsigned long long int _zzq_args[6]; \ 33694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long long int _zzq_result; \ 33794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 33894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 33994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 34094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 34194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 34294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 34394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 34494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %RDX = client_request ( %RAX ) */ \ 34594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgq %%rbx,%%rbx" \ 34694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=d" (_zzq_result) \ 34794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 34894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 34994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 35094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 35194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 35294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 35394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 35494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 35594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long long int __addr; \ 35694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 35794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %RAX = guest_NRADDR */ \ 35894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgq %%rcx,%%rcx" \ 35994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=a" (__addr) \ 36094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 36194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 36294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 36394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 36494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 36594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 36694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CALL_NOREDIR_RAX \ 36794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 36894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* call-noredir *%RAX */ \ 36994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "xchgq %%rdx,%%rdx\n\t" 37094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ 37194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 37294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-linux ------------------------ */ 37394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 37494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_linux) 37594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 37694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 37794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 37894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int nraddr; /* where's the code? */ 37994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 38094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 38194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 38294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 38394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 38494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 38594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 38694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 38794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 38894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 38994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez \ 39094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { unsigned int _zzq_args[6]; \ 39194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int _zzq_result; \ 39294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int* _zzq_ptr; \ 39394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned int)(_zzq_request); \ 39494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 39594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 39694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 39794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 39894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 39994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_ptr = _zzq_args; \ 40094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile("mr 3,%1\n\t" /*default*/ \ 40194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 4,%2\n\t" /*ptr*/ \ 40294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 40394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = client_request ( %R4 ) */ \ 40494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 1,1,1\n\t" \ 40594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" /*result*/ \ 40694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (_zzq_result) \ 40794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "b" (_zzq_default), "b" (_zzq_ptr) \ 40894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory", "r3", "r4"); \ 40994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 41094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 41194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 41294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 41394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 41494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int __addr; \ 41594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 41694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR */ \ 41794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 2,2,2\n\t" \ 41894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 41994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (__addr) \ 42094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 42194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory", "r3" \ 42294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 42394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 42494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 42594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 42694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 42794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 42894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* branch-and-link-to-noredir *%R11 */ \ 42994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 3,3,3\n\t" 43094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_linux */ 43194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 43294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-linux ------------------------ */ 43394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 43494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_linux) 43594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 43694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 43794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 43894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long long int nraddr; /* where's the code? */ 43994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long long int r2; /* what tocptr do we need? */ 44094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 44194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 44294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 44394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 44494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 44594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 44694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 44794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 44894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 44994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 45094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez \ 45194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { unsigned long long int _zzq_args[6]; \ 45294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int _zzq_result __asm__("r3"); \ 45394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int* _zzq_ptr __asm__("r4"); \ 45494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 45594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 45694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 45794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 45894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 45994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 46094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_ptr = _zzq_args; \ 46194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 46294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = client_request ( %R4 ) */ \ 46394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 1,1,1" \ 46494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=r" (_zzq_result) \ 46594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "0" (_zzq_default), "r" (_zzq_ptr) \ 46694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory"); \ 46794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 46894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 46994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 47094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 47194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 47294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int __addr __asm__("r3"); \ 47394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 47494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR */ \ 47594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 2,2,2" \ 47694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=r" (__addr) \ 47794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 47894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 47994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 48094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 48194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 48294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR_GPR2 */ \ 48394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 4,4,4" \ 48494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=r" (__addr) \ 48594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 48694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory" \ 48794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 48894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->r2 = __addr; \ 48994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 49094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 49194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 49294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 49394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* branch-and-link-to-noredir *%R11 */ \ 49494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 3,3,3\n\t" 49594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 49694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_linux */ 49794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 49894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- arm-linux ------------------------- */ 49994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 50094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_arm_linux) 50194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 50294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 50394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 50494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int nraddr; /* where's the code? */ 50594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 50694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 50794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 50894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 50994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ 51094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" 51194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 51294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 51394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 51494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 51594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez \ 51694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile unsigned int _zzq_args[6]; \ 51794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned int _zzq_result; \ 51894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned int)(_zzq_request); \ 51994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 52094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 52194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 52294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 52394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 52494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile("mov r3, %1\n\t" /*default*/ \ 52594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov r4, %2\n\t" /*ptr*/ \ 52694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 52794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* R3 = client_request ( R4 ) */ \ 52894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "orr r10, r10, r10\n\t" \ 52994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r3" /*result*/ \ 53094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=r" (_zzq_result) \ 53194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r" (_zzq_default), "r" (&_zzq_args[0]) \ 53294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc","memory", "r3", "r4"); \ 53394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 53494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 53594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 53694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 53794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 53894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int __addr; \ 53994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 54094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* R3 = guest_NRADDR */ \ 54194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "orr r11, r11, r11\n\t" \ 54294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r3" \ 54394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=r" (__addr) \ 54494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 54594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "cc", "memory", "r3" \ 54694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 54794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 54894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 54994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 55094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 55194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 55294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* branch-and-link-to-noredir *%R4 */ \ 55394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "orr r12, r12, r12\n\t" 55494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 55594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_arm_linux */ 55694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 55794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-aix5 ------------------------- */ 55894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 55994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_aix5) 56094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 56194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 56294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 56394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int nraddr; /* where's the code? */ 56494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned int r2; /* what tocptr do we need? */ 56594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 56694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 56794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 56894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 56994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 57094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 57194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 57294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 57394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 57494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 57594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez \ 57694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { unsigned int _zzq_args[7]; \ 57794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned int _zzq_result; \ 57894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned int* _zzq_ptr; \ 57994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned int)(_zzq_request); \ 58094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 58194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 58294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 58394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 58494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 58594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[6] = (unsigned int)(_zzq_default); \ 58694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_ptr = _zzq_args; \ 58794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile("mr 4,%1\n\t" \ 58894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 24(4)\n\t" \ 58994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 59094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = client_request ( %R4 ) */ \ 59194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 1,1,1\n\t" \ 59294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 59394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (_zzq_result) \ 59494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "b" (_zzq_ptr) \ 59594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "r4", "cc", "memory"); \ 59694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 59794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 59894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 59994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 60094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 60194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned int __addr; \ 60294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 60394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR */ \ 60494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 2,2,2\n\t" \ 60594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 60694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (__addr) \ 60794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 60894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "cc", "memory" \ 60994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 61094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 61194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 61294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR_GPR2 */ \ 61394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 4,4,4\n\t" \ 61494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 61594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (__addr) \ 61694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 61794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "cc", "memory" \ 61894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 61994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->r2 = __addr; \ 62094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 62194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 62294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 62394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 62494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* branch-and-link-to-noredir *%R11 */ \ 62594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 3,3,3\n\t" 62694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 62794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_aix5 */ 62894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 62994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-aix5 ------------------------- */ 63094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 63194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_aix5) 63294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 63394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 63494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez struct { 63594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long long int nraddr; /* where's the code? */ 63694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long long int r2; /* what tocptr do we need? */ 63794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 63894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez OrigFn; 63994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 64094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __SPECIAL_INSTRUCTION_PREAMBLE \ 64194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 64294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 64394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 64494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST( \ 64594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval, _zzq_default, _zzq_request, \ 64694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 64794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez \ 64894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { unsigned long long int _zzq_args[7]; \ 64994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int _zzq_result; \ 65094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int* _zzq_ptr; \ 65194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[0] = (unsigned int long long)(_zzq_request); \ 65294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ 65394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ 65494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ 65594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ 65694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ 65794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_args[6] = (unsigned int long long)(_zzq_default); \ 65894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_ptr = _zzq_args; \ 65994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile("mr 4,%1\n\t" \ 66094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 48(4)\n\t" \ 66194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 66294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = client_request ( %R4 ) */ \ 66394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 1,1,1\n\t" \ 66494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 66594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (_zzq_result) \ 66694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "b" (_zzq_ptr) \ 66794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "r4", "cc", "memory"); \ 66894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval = _zzq_result; \ 66994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 67094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 67194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 67294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 67394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez register unsigned long long int __addr; \ 67494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 67594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR */ \ 67694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 2,2,2\n\t" \ 67794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 67894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (__addr) \ 67994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 68094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "cc", "memory" \ 68194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 68294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->nraddr = __addr; \ 68394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 68494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* %R3 = guest_NRADDR_GPR2 */ \ 68594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 4,4,4\n\t" \ 68694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 68794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "=b" (__addr) \ 68894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : \ 68994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : "r3", "cc", "memory" \ 69094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 69194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_orig->r2 = __addr; \ 69294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 69394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 69494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 69594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __SPECIAL_INSTRUCTION_PREAMBLE \ 69694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* branch-and-link-to-noredir *%R11 */ \ 69794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "or 3,3,3\n\t" 69894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 69994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_aix5 */ 70094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 70194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Insert assembly code for other platforms here... */ 70294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 70394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* NVALGRIND */ 70494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 70594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 70694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 70794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ 70894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ugly. It's the least-worst tradeoff I can think of. */ 70994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 71094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 71194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This section defines magic (a.k.a appalling-hack) macros for doing 71294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez guaranteed-no-redirection macros, so as to get from function 71394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez wrappers to the functions they are wrapping. The whole point is to 71494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez construct standard call sequences, but to do the call itself with a 71594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez special no-redirect call pseudo-instruction that the JIT 71694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez understands and handles specially. This section is long and 71794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez repetitious, and I can't see a way to make it shorter. 71894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 71994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The naming scheme is as follows: 72094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 72194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} 72294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 72394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 'W' stands for "word" and 'v' for "void". Hence there are 72494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez different macros for calling arity 0, 1, 2, 3, 4, etc, functions, 72594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez and for each, the possibility of returning a word-typed result, or 72694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez no result. 72794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 72894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 72994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use these to write the name of your wrapper. NOTE: duplicates 73094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */ 73194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 73294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use an extra level of macroisation so as to ensure the soname/fnname 73394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez args are fully macro-expanded before pasting them together. */ 73494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd 73594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 73694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ 73794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONCAT4(_vgwZU_,soname,_,fnname) 73894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 73994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ 74094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONCAT4(_vgwZZ_,soname,_,fnname) 74194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 74294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Use this macro from within a wrapper function to collect the 74394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez context (address and possibly other info) of the original function. 74494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Once you have that you can then use it in one of the CALL_FN_ 74594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez macros. The type of the argument _lval is OrigFn. */ 74694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) 74794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 74894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Derivatives of the main macros below, for calling functions 74994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez returning void. */ 75094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 75194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_v(fnptr) \ 75294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 75394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_v(_junk,fnptr); } while (0) 75494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 75594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_W(fnptr, arg1) \ 75694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 75794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_W(_junk,fnptr,arg1); } while (0) 75894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 75994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WW(fnptr, arg1,arg2) \ 76094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 76194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) 76294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 76394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ 76494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 76594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) 76694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 76794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \ 76894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 76994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0) 77094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 77194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \ 77294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 77394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0) 77494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 77594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \ 77694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 77794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0) 77894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 77994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ 78094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { volatile unsigned long _junk; \ 78194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0) 78294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 78394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- x86-{linux,darwin} ---------------- */ 78494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 78594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) 78694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 78794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. No need to mention eax 78894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez as gcc can already see that, plus causes gcc to bomb. */ 78994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" 79094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 79194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned 79294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 4. */ 79394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 79494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 79594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 79694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 79794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[1]; \ 79894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 79994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 80094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 80194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 80294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 80394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 80494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 80594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 80694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 80794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 80894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 80994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 81094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 81194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 81294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 81394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[2]; \ 81494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 81594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 81694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 81794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 81894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $12, %%esp\n\t" \ 81994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 82094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 82194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 82294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $16, %%esp\n" \ 82394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 82494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 82594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 82694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 82794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 82894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 82994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 83094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 83194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 83294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 83394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3]; \ 83494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 83594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 83694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 83794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 83894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 83994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $8, %%esp\n\t" \ 84094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 84194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 84294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 84394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 84494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $16, %%esp\n" \ 84594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 84694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 84794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 84894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 84994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 85094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 85194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 85294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 85394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 85494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 85594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[4]; \ 85694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 85794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 85894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 85994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 86094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 86194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 86294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $4, %%esp\n\t" \ 86394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 86494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 86594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 86694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 86794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 86894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $16, %%esp\n" \ 86994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 87094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 87194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 87294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 87394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 87494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 87594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 87694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 87794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 87894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 87994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[5]; \ 88094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 88194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 88294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 88394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 88494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 88594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 88694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 88794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 88894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 88994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 89094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 89194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 89294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 89394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $16, %%esp\n" \ 89494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 89594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 89694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 89794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 89894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 89994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 90094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 90194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 90294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 90394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 90494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[6]; \ 90594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 90694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 90794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 90894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 90994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 91094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 91194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 91294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 91394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $12, %%esp\n\t" \ 91494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 91594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 91694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 91794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 91894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 91994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 92094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 92194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $32, %%esp\n" \ 92294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 92394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 92494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 92594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 92694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 92794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 92894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 92994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 93094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 93194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 93294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[7]; \ 93394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 93494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 93594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 93694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 93794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 93894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 93994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 94094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 94194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 94294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $8, %%esp\n\t" \ 94394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 94494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 94594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 94694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 94794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 94894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 94994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 95094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 95194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $32, %%esp\n" \ 95294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 95394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 95494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 95594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 95694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 95794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 95894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 95994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 96094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 96194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 96294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 96394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[8]; \ 96494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 96594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 96694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 96794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 96894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 96994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 97094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 97194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 97294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 97394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 97494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $4, %%esp\n\t" \ 97594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 97694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 97794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 97894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 97994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 98094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 98194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 98294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 98394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 98494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $32, %%esp\n" \ 98594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 98694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 98794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 98894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 98994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 99094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 99194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 99294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 99394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 99494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 99594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 99694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[9]; \ 99794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 99894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 99994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 100094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 100194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 100294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 100394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 100494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 100594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 100694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 100794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 100894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 32(%%eax)\n\t" \ 100994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 101094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 101194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 101294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 101394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 101494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 101594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 101694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 101794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 101894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $32, %%esp\n" \ 101994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 102094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 102194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 102294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 102394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 102494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 102594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 102694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 102794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 102894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 102994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 103094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[10]; \ 103194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 103294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 103394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 103494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 103594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 103694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 103794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 103894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 103994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 104094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 104194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 104294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 104394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $12, %%esp\n\t" \ 104494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 36(%%eax)\n\t" \ 104594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 32(%%eax)\n\t" \ 104694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 104794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 104894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 104994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 105094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 105194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 105294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 105394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 105494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 105594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $48, %%esp\n" \ 105694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 105794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 105894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 105994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 106094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 106194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 106294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 106394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 106494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 106594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 106694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 106794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[11]; \ 106894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 106994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 107094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 107194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 107294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 107394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 107494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 107594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 107694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 107794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 107894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 107994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 108094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 108194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $8, %%esp\n\t" \ 108294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 40(%%eax)\n\t" \ 108394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 36(%%eax)\n\t" \ 108494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 32(%%eax)\n\t" \ 108594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 108694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 108794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 108894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 108994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 109094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 109194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 109294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 109394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 109494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $48, %%esp\n" \ 109594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 109694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 109794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 109894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 109994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 110094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 110194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 110294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 110394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg6,arg7,arg8,arg9,arg10, \ 110494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg11) \ 110594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 110694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 110794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[12]; \ 110894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 110994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 111094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 111194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 111294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 111394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 111494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 111594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 111694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 111794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 111894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 111994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 112094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 112194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 112294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subl $4, %%esp\n\t" \ 112394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 44(%%eax)\n\t" \ 112494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 40(%%eax)\n\t" \ 112594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 36(%%eax)\n\t" \ 112694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 32(%%eax)\n\t" \ 112794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 112894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 112994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 113094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 113194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 113294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 113394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 113494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 113594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 113694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $48, %%esp\n" \ 113794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 113894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 113994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 114094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 114194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 114294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 114394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 114494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 114594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg6,arg7,arg8,arg9,arg10, \ 114694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg11,arg12) \ 114794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 114894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 114994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[13]; \ 115094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 115194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 115294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 115394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 115494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 115594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 115694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 115794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 115894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 115994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 116094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 116194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 116294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 116394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[12] = (unsigned long)(arg12); \ 116494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 116594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 48(%%eax)\n\t" \ 116694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 44(%%eax)\n\t" \ 116794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 40(%%eax)\n\t" \ 116894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 36(%%eax)\n\t" \ 116994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 32(%%eax)\n\t" \ 117094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 28(%%eax)\n\t" \ 117194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 24(%%eax)\n\t" \ 117294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 20(%%eax)\n\t" \ 117394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 16(%%eax)\n\t" \ 117494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 12(%%eax)\n\t" \ 117594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 8(%%eax)\n\t" \ 117694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushl 4(%%eax)\n\t" \ 117794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 117894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_EAX \ 117994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addl $48, %%esp\n" \ 118094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 118194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) \ 118294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 118394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 118494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 118594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 118694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 118794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_x86_linux || PLAT_x86_darwin */ 118894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 118994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ amd64-{linux,darwin} --------------- */ 119094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 119194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) 119294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 119394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ 119494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 119594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 119694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ 119794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "rdi", "r8", "r9", "r10", "r11" 119894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 119994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This is all pretty complex. It's so as to make stack unwinding 120094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez work reliably. See bug 243270. The basic problem is the sub and 120194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez add of 128 of %rsp in all of the following macros. If gcc believes 120294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez the CFA is in %rsp, then unwinding may fail, because what's at the 120394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CFA is not what gcc "expected" when it constructs the CFIs for the 120494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez places where the macros are instantiated. 120594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 120694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez But we can't just add a CFI annotation to increase the CFA offset 120794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez by 128, to match the sub of 128 from %rsp, because we don't know 120894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez whether gcc has chosen %rsp as the CFA at that point, or whether it 120994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez has chosen some other register (eg, %rbp). In the latter case, 121094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez adding a CFI annotation to change the CFA offset is simply wrong. 121194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 121294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez So the solution is to get hold of the CFA using 121394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __builtin_dwarf_cfa(), put it in a known register, and add a 121494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CFI annotation to say what the register is. We choose %rbp for 121594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez this (perhaps perversely), because: 121694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 121794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (1) %rbp is already subject to unwinding. If a new register was 121894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez chosen then the unwinder would have to unwind it in all stack 121994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez traces, which is expensive, and 122094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 122194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (2) %rbp is already subject to precise exception updates in the 122294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez JIT. If a new register was chosen, we'd have to have precise 122394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez exceptions for it too, which reduces performance of the 122494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez generated code. 122594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 122694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez However .. one extra complication. We can't just whack the result 122794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez of __builtin_dwarf_cfa() into %rbp and then add %rbp to the 122894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez list of trashed registers at the end of the inline assembly 122994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez fragments; gcc won't allow %rbp to appear in that list. Hence 123094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez instead we need to stash %rbp in %r15 for the duration of the asm, 123194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez and say that %r15 is trashed instead. gcc seems happy to go with 123294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that. 123394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 123494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Oh .. and this all needs to be conditionalised so that it is 123594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unchanged from before this commit, when compiled with older gccs 123694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that don't support __builtin_dwarf_cfa. Furthermore, since 123794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez this header file is freestanding, it has to be independent of 123894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez config.h, and so the following conditionalisation cannot depend on 123994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez configure time checks. 124094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 124194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Although it's not clear from 124294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 'defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)', 124394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez this expression excludes Darwin. 124494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez .cfi directives in Darwin assembly appear to be completely 124594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez different and I haven't investigated how they work. 124694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 124794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez For even more entertainment value, note we have to use the 124894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez completely undocumented __builtin_dwarf_cfa(), which appears to 124994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez really compute the CFA, whereas __builtin_frame_address(0) claims 125094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez to but actually doesn't. See 125194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez https://bugs.kde.org/show_bug.cgi?id=243270#c47 125294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 125394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM) 125494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define __FRAME_POINTER \ 125594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ,"r"(__builtin_dwarf_cfa()) 125694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_CFI_PROLOGUE \ 125794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq %%rbp, %%r15\n\t" \ 125894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq %2, %%rbp\n\t" \ 125994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ".cfi_remember_state\n\t" \ 126094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ".cfi_def_cfa rbp, 0\n\t" 126194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_CFI_EPILOGUE \ 126294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq %%r15, %%rbp\n\t" \ 126394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ".cfi_restore_state\n\t" 126494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 126594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define __FRAME_POINTER 126694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_CFI_PROLOGUE 126794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_CFI_EPILOGUE 126894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 126994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 127094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 127194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned 127294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 8. */ 127394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 127494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ 127594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez macros. In order not to trash the stack redzone, we need to drop 127694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez %rsp by 128 before the hidden call, and restore afterwards. The 127794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez nastyness is that it is only by luck that the stack still appears 127894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez to be unwindable during the hidden call - since then the behaviour 127994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez of any routine using this macro does not match what the CFI data 128094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez says. Sigh. 128194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 128294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Why is this important? Imagine that a wrapper has a stack 128394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez allocated local, and passes to the hidden call, a pointer to it. 128494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Because gcc does not know about the hidden call, it may allocate 128594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that local in the redzone. Unfortunately the hidden call may then 128694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez trash it before it comes to use it. So we must step clear of the 128794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez redzone, for the duration of the hidden call, to make it safe. 128894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 128994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Probably the same problem afflicts the other redzone-style ABIs too 129094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is 129194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez self describing (none of this CFI nonsense) so at least messing 129294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez with the stack pointer doesn't give a danger of non-unwindable 129394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez stack. */ 129494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 129594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 129694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 129794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 129894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[1]; \ 129994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 130094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 130194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 130294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 130394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 130494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 130594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 130694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 130794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 130894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 130994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 131094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 131194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 131294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 131394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 131494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 131594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 131694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 131794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 131894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[2]; \ 131994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 132094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 132194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 132294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 132394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 132494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 132594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 132694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 132794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 132894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 132994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 133094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 133194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 133294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 133394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 133494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 133594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 133694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 133794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 133894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 133994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 134094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3]; \ 134194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 134294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 134394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 134494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 134594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 134694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 134794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 134894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 134994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 135094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 135194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 135294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 135394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 135494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 135594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 135694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 135794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 135894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 135994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 136094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 136194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 136294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 136394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 136494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[4]; \ 136594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 136694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 136794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 136894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 136994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 137094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 137194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 137294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 137394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 137494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 137594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 137694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 137794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 137894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 137994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 138094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 138194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 138294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 138394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 138494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 138594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 138694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 138794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 138894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 138994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 139094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[5]; \ 139194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 139294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 139394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 139494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 139594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 139694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 139794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 139894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 139994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 140094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 140194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 140294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 140394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 140494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 140594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 140694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 140794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 140894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 140994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 141094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 141194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 141294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 141394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 141494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 141594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 141694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 141794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 141894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[6]; \ 141994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 142094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 142194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 142294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 142394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 142494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 142594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 142694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 142794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 142894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 142994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 143094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 143194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 143294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 143394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 143494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 143594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 143694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 143794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 143894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 143994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 144094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 144194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 144294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 144394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 144494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 144594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 144694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 144794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 144894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[7]; \ 144994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 145094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 145194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 145294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 145394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 145494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 145594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 145694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 145794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 145894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 145994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 146094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 146194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 146294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 146394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 146494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 146594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 146694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 146794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 146894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 146994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 147094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 147194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 147294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 147394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 147494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 147594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 147694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 147794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 147894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 147994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 148094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 148194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[8]; \ 148294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 148394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 148494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 148594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 148694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 148794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 148894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 148994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 149094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 149194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 149294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 149394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $136,%%rsp\n\t" \ 149494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 149594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 149694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 149794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 149894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 149994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 150094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 150194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 150294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 150394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $8, %%rsp\n" \ 150494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $136,%%rsp\n\t" \ 150594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 150694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 150794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 150894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 150994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 151094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 151194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 151294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 151394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 151494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 151594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 151694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 151794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[9]; \ 151894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 151994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 152094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 152194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 152294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 152394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 152494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 152594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 152694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 152794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 152894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 152994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 153094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 153194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 64(%%rax)\n\t" \ 153294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 153394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 153494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 153594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 153694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 153794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 153894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 153994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 154094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 154194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $16, %%rsp\n" \ 154294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 154394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 154494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 154594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 154694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 154794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 154894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 154994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 155094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 155194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 155294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 155394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 155494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 155594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[10]; \ 155694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 155794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 155894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 155994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 156094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 156194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 156294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 156394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 156494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 156594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 156694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 156794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 156894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 156994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $136,%%rsp\n\t" \ 157094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 72(%%rax)\n\t" \ 157194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 64(%%rax)\n\t" \ 157294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 157394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 157494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 157594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 157694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 157794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 157894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 157994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 158094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 158194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $24, %%rsp\n" \ 158294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $136,%%rsp\n\t" \ 158394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 158494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 158594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 158694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 158794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 158894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 158994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 159094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 159194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 159294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 159394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 159494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 159594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[11]; \ 159694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 159794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 159894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 159994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 160094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 160194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 160294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 160394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 160494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 160594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 160694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 160794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 160894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 160994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 161094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 161194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 80(%%rax)\n\t" \ 161294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 72(%%rax)\n\t" \ 161394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 64(%%rax)\n\t" \ 161494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 161594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 161694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 161794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 161894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 161994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 162094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 162194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 162294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 162394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $32, %%rsp\n" \ 162494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 162594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 162694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 162794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 162894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 162994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 163094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 163194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 163294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 163394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 163494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11) \ 163594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 163694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 163794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[12]; \ 163894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 163994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 164094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 164194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 164294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 164394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 164494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 164594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 164694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 164794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 164894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 164994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 165094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 165194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 165294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 165394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $136,%%rsp\n\t" \ 165494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 88(%%rax)\n\t" \ 165594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 80(%%rax)\n\t" \ 165694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 72(%%rax)\n\t" \ 165794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 64(%%rax)\n\t" \ 165894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 165994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 166094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 166194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 166294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 166394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 166494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 166594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 166694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 166794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $40, %%rsp\n" \ 166894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $136,%%rsp\n\t" \ 166994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 167094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 167194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 167294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 167394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 167494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 167594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 167694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 167794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 167894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11,arg12) \ 167994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 168094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 168194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[13]; \ 168294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 168394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 168494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 168594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 168694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 168794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 168894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 168994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 169094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 169194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 169294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 169394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 169494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 169594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[12] = (unsigned long)(arg12); \ 169694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 169794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_PROLOGUE \ 169894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "subq $128,%%rsp\n\t" \ 169994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 96(%%rax)\n\t" \ 170094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 88(%%rax)\n\t" \ 170194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 80(%%rax)\n\t" \ 170294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 72(%%rax)\n\t" \ 170394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 64(%%rax)\n\t" \ 170494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "pushq 56(%%rax)\n\t" \ 170594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 48(%%rax), %%r9\n\t" \ 170694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 40(%%rax), %%r8\n\t" \ 170794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 32(%%rax), %%rcx\n\t" \ 170894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 24(%%rax), %%rdx\n\t" \ 170994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 16(%%rax), %%rsi\n\t" \ 171094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq 8(%%rax), %%rdi\n\t" \ 171194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 171294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CALL_NOREDIR_RAX \ 171394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $48, %%rsp\n" \ 171494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addq $128,%%rsp\n\t" \ 171594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_CFI_EPILOGUE \ 171694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=a" (_res) \ 171794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "a" (&_argvec[0]) __FRAME_POINTER \ 171894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS, "r15" \ 171994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 172094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 172194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 172294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 172394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_amd64_linux || PLAT_amd64_darwin */ 172494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 172594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-linux ------------------------ */ 172694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 172794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_linux) 172894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 172994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* This is useful for finding out about the on-stack stuff: 173094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 173194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez extern int f9 ( int,int,int,int,int,int,int,int,int ); 173294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez extern int f10 ( int,int,int,int,int,int,int,int,int,int ); 173394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); 173494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); 173594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 173694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int g9 ( void ) { 173794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return f9(11,22,33,44,55,66,77,88,99); 173894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 173994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int g10 ( void ) { 174094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return f10(11,22,33,44,55,66,77,88,99,110); 174194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 174294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int g11 ( void ) { 174394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return f11(11,22,33,44,55,66,77,88,99,110,121); 174494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 174594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez int g12 ( void ) { 174694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return f12(11,22,33,44,55,66,77,88,99,110,121,132); 174794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 174894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 174994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 175094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 175194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 175294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 175394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS \ 175494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lr", "ctr", "xer", \ 175594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 175694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 175794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r11", "r12", "r13" 175894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 175994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc32-linux, 176094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez sizeof(unsigned long) == 4. */ 176194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 176294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 176394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 176494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 176594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[1]; \ 176694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 176794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 176894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 176994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 177094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 177194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 177294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 177394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 177494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 177594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 177694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 177794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 177894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 177994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 178094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 178194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 178294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 178394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[2]; \ 178494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 178594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 178694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 178794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 178894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 178994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 179094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 179194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 179294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 179394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 179494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 179594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 179694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 179794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 179894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 179994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 180094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 180194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 180294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 180394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3]; \ 180494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 180594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 180694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 180794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 180894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 180994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 181094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 181194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 181294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 181394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 181494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 181594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 181694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 181794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 181894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 181994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 182094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 182194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 182294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 182394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 182494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 182594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[4]; \ 182694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 182794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 182894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 182994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 183094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 183194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 183294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 183394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 183494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 183594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 183694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 183794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 183894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 183994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 184094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 184194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 184294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 184394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 184494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 184594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 184694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 184794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 184894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 184994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[5]; \ 185094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 185194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 185294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 185394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 185494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 185594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 185694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 185794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 185894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 185994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 186094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 186194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 186294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 186394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 186494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 186594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 186694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 186794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 186894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 186994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 187094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 187194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 187294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 187394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 187494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 187594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[6]; \ 187694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 187794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 187894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 187994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 188094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 188194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 188294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 188394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 188494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 188594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 188694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 188794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 188894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 188994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 189094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 189194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 189294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 189394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 189494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 189594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 189694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 189794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 189894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 189994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 190094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 190194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 190294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 190394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[7]; \ 190494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 190594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 190694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 190794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 190894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 190994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 191094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 191194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 191294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 191394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 191494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 191594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 191694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 191794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 191894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 191994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 192094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 192194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 192294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 192394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 192494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 192594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 192694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 192794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 192894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 192994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 193094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 193194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 193294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 193394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 193494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[8]; \ 193594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 193694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 193794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 193894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 193994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 194094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 194194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 194294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 194394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 194494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 194594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 194694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 194794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 194894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 194994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 195094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 195194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 195294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 195394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 195494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 195594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 195694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 195794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 195894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 195994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 196094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 196194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 196294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 196394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 196494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 196594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 196694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 196794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[9]; \ 196894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 196994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 197094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 197194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 197294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 197394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 197494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 197594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 197694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 197794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)arg8; \ 197894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 197994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 198094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 198194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 198294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 198394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 198494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 198594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 198694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 198794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 198894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 198994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 199094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 199194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 199294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 199394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 199494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 199594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 199694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 199794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 199894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 199994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 200094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 200194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 200294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[10]; \ 200394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 200494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 200594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 200694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 200794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 200894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 200994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 201094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 201194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 201294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)arg8; \ 201394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)arg9; \ 201494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 201594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 201694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-16\n\t" \ 201794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 201894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 201994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,8(1)\n\t" \ 202094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 202194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 202294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 202394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 202494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 202594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 202694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 202794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 202894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 202994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 203094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 203194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,16\n\t" \ 203294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 203394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 203494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 203594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 203694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 203794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 203894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 203994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 204094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 204194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 204294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 204394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 204494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[11]; \ 204594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 204694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 204794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 204894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 204994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 205094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 205194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 205294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 205394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 205494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)arg8; \ 205594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)arg9; \ 205694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)arg10; \ 205794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 205894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 205994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-16\n\t" \ 206094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 206194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 206294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,12(1)\n\t" \ 206394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 206494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 206594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,8(1)\n\t" \ 206694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 206794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 206894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 206994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 207094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 207194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 207294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 207394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 207494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 207594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 207694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 207794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,16\n\t" \ 207894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 207994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 208094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 208194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 208294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 208394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 208494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 208594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 208694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 208794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11) \ 208894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 208994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 209094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[12]; \ 209194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 209294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 209394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 209494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 209594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 209694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 209794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 209894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 209994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 210094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)arg8; \ 210194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)arg9; \ 210294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)arg10; \ 210394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)arg11; \ 210494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 210594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 210694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-32\n\t" \ 210794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 210894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,44(11)\n\t" \ 210994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,16(1)\n\t" \ 211094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 211194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 211294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,12(1)\n\t" \ 211394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 211494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 211594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,8(1)\n\t" \ 211694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 211794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 211894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 211994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 212094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 212194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 212294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 212394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 212494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 212594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 212694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 212794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,32\n\t" \ 212894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 212994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 213094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 213194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 213294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 213394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 213494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 213594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 213694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 213794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11,arg12) \ 213894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 213994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 214094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[13]; \ 214194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 214294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 214394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)arg1; \ 214494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)arg2; \ 214594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)arg3; \ 214694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)arg4; \ 214794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)arg5; \ 214894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)arg6; \ 214994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)arg7; \ 215094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)arg8; \ 215194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)arg9; \ 215294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)arg10; \ 215394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)arg11; \ 215494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[12] = (unsigned long)arg12; \ 215594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 215694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 215794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-32\n\t" \ 215894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg12 */ \ 215994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,48(11)\n\t" \ 216094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,20(1)\n\t" \ 216194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 216294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,44(11)\n\t" \ 216394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,16(1)\n\t" \ 216494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 216594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 216694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,12(1)\n\t" \ 216794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 216894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 216994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,8(1)\n\t" \ 217094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 217194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 217294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4,8(11)\n\t" \ 217394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5,12(11)\n\t" \ 217494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 217594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7,20(11)\n\t" \ 217694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8,24(11)\n\t" \ 217794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9,28(11)\n\t" \ 217894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 217994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11,0(11)\n\t" /* target->r11 */ \ 218094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 218194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,32\n\t" \ 218294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3" \ 218394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 218494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[0]) \ 218594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 218694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 218794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 218894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 218994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 219094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_linux */ 219194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 219294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-linux ------------------------ */ 219394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 219494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_linux) 219594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 219694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 219794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 219894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 219994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS \ 220094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lr", "ctr", "xer", \ 220194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 220294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 220394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r11", "r12", "r13" 220494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 220594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned 220694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 8. */ 220794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 220894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 220994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 221094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 221194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+0]; \ 221294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 221394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 221494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 221594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 221694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 221794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 221894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 221994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 222094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 222194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 222294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 222394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 222494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 222594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 222694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 222794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 222894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 222994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 223094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 223194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 223294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 223394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 223494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 223594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+1]; \ 223694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 223794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 223894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 223994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 224094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 224194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 224294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 224394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 224494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 224594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 224694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 224794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 224894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 224994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 225094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 225194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 225294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 225394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 225494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 225594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 225694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 225794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 225894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 225994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 226094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 226194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+2]; \ 226294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 226394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 226494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 226594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 226694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 226794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 226894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 226994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 227094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 227194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 227294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 227394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 227494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 227594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 227694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 227794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 227894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 227994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 228094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 228194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 228294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 228394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 228494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 228594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 228694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 228794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 228894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 228994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+3]; \ 229094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 229194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 229294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 229394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 229494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 229594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 229694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 229794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 229894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 229994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 230094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 230194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 230294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 230394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 230494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 230594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 230694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 230794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 230894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 230994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 231094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 231194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 231294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 231394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 231494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 231594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 231694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 231794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 231894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 231994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+4]; \ 232094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 232194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 232294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 232394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 232494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 232594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 232694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 232794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 232894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 232994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 233094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 233194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 233294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 233394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 233494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 233594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 233694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 233794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 233894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 233994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 234094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 234194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 234294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 234394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 234494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 234594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 234694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 234794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 234894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 234994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 235094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 235194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+5]; \ 235294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 235394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 235494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 235594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 235694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 235794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 235894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 235994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 236094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 236194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 236294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 236394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 236494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 236594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 236694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 236794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 236894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 236994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 237094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 237194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 237294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 237394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 237494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 237594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 237694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 237794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 237894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 237994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 238094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 238194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 238294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 238394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 238494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 238594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+6]; \ 238694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 238794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 238894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 238994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 239094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 239194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 239294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 239394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 239494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 239594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 239694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 239794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 239894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 239994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 240094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 240194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 240294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 240394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 240494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 240594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 240694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 240794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 240894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 240994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 241094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 241194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 241294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 241394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 241494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 241594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 241694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 241794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 241894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 241994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 242094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 242194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 242294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+7]; \ 242394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 242494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 242594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 242694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 242794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 242894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 242994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 243094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 243194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 243294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 243394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 243494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 243594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 243694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 243794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 243894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 243994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 244094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 244194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 244294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 244394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 244494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 244594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 244694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 244794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 244894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 244994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 245094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 245194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 245294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 245394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 245494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 245594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 245694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 245794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 245894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 245994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 246094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 246194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+8]; \ 246294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 246394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 246494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 246594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 246694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 246794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 246894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 246994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 247094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 247194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 247294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 247394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 247494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 247594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 247694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 247794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 247894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 247994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 248094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 248194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 248294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 248394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 248494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 248594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 248694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 248794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 248894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 248994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 249094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)" /* restore tocptr */ \ 249194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 249294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 249394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 249494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 249594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 249694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 249794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 249894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 249994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 250094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 250194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 250294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+9]; \ 250394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 250494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 250594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 250694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 250794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 250894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 250994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 251094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 251194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 251294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 251394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 251494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 251594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 251694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 251794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 251894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 251994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 252094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-128\n\t" /* expand stack frame */ \ 252194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 252294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 252394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 252494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 252594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 252694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 252794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 252894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 252994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 253094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 253194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 253294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 253394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 253494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 253594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 253694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 253794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 253894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,128" /* restore frame */ \ 253994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 254094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 254194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 254294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 254394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 254494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 254594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 254694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 254794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 254894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 254994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 255094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+10]; \ 255194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 255294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 255394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 255494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 255594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 255694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 255794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 255894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 255994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 256094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 256194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 256294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 256394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 256494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 256594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 256694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 256794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 256894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 256994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-128\n\t" /* expand stack frame */ \ 257094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 257194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 257294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 257394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 257494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 257594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 257694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 257794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 257894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 257994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 258094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 258194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 258294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 258394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 258494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 258594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 258694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 258794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 258894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 258994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 259094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,128" /* restore frame */ \ 259194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 259294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 259394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 259494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 259594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 259694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 259794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 259894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 259994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11) \ 260094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 260194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 260294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+11]; \ 260394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 260494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 260594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 260694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 260794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 260894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 260994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 261094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 261194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 261294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 261394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 261494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 261594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 261694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 261794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 261894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 261994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 262094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 262194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 262294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-144\n\t" /* expand stack frame */ \ 262394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 262494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,88(11)\n\t" \ 262594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,128(1)\n\t" \ 262694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 262794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 262894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 262994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 263094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 263194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 263294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 263394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 263494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 263594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 263694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 263794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 263894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 263994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 264094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 264194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 264294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 264394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 264494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 264594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 264694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,144" /* restore frame */ \ 264794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 264894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 264994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 265094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 265194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 265294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 265394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 265494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 265594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11,arg12) \ 265694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 265794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 265894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+12]; \ 265994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 266094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 266194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 266294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 266394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 266494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 266594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 266694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 266794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 266894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 266994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 267094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 267194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 267294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 267394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 267494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+12] = (unsigned long)arg12; \ 267594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 267694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 267794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 267894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 267994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-144\n\t" /* expand stack frame */ \ 268094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg12 */ \ 268194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,96(11)\n\t" \ 268294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,136(1)\n\t" \ 268394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 268494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,88(11)\n\t" \ 268594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,128(1)\n\t" \ 268694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 268794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 268894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 268994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 269094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 269194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 269294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 269394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 269494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 269594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 269694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 269794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 269894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 269994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 270094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 270194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 270294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 270394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 270494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 270594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 270694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,144" /* restore frame */ \ 270794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 270894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 270994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 271094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 271194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 271294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 271394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 271494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_linux */ 271594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 271694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------- arm-linux ------------------------- */ 271794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 271894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_arm_linux) 271994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 272094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 272194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" 272294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 272394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on arm-linux, sizeof(unsigned 272494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 4. */ 272594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 272694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 272794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 272894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 272994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[1]; \ 273094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 273194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 273294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 273394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 273494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 273594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0\n" \ 273694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 273794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 273894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 273994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 274094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 274194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 274294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 274394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 274494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 274594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 274694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[2]; \ 274794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 274894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 274994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 275094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 275194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 275294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 275394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 275494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0\n" \ 275594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 275694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 275794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 275894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 275994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 276094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 276194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 276294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 276394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 276494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 276594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3]; \ 276694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 276794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 276894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 276994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 277094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 277194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 277294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 277394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 277494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 277594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0\n" \ 277694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 277794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 277894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 277994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 278094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 278194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 278294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 278394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 278494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 278594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 278694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[4]; \ 278794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 278894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 278994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 279094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 279194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 279294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 279394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 279494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 279594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 279694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 279794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 279894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0\n" \ 279994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 280094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 280194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 280294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 280394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 280494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 280594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 280694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 280794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 280894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 280994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[5]; \ 281094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 281194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 281294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 281394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 281494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 281594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 281694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 281794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 281894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 281994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 282094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 282194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 282294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 282394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 282494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 282594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 282694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 282794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 282894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 282994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 283094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 283194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 283294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 283394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 283494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[6]; \ 283594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 283694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 283794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 283894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 283994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 284094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 284194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 284294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 284394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 284494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0} \n\t" \ 284594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 284694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 284794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 284894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 284994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 285094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 285194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #4 \n\t" \ 285294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 285394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 285494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 285594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 285694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 285794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 285894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 285994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 286094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 286194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 286294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 286394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[7]; \ 286494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 286594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 286694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 286794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 286894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 286994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 287094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 287194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 287294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 287394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 287494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 287594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1} \n\t" \ 287694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 287794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 287894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 287994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 288094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 288194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 288294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #8 \n\t" \ 288394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 288494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 288594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 288694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 288794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 288894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 288994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 289094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 289194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 289294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 289394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 289494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 289594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[8]; \ 289694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 289794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 289894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 289994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 290094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 290194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 290294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 290394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 290494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 290594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 290694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 290794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 290894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 290994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2} \n\t" \ 291094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 291194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 291294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 291394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 291494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 291594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 291694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #12 \n\t" \ 291794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 291894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 291994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 292094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 292194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 292294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 292394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 292494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 292594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 292694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 292794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 292894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 292994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[9]; \ 293094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 293194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 293294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 293394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 293494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 293594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 293694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 293794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 293894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 293994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 294094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 294194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 294294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 294394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 294494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #32] \n\t" \ 294594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2, r3} \n\t" \ 294694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 294794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 294894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 294994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 295094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 295194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 295294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #16 \n\t" \ 295394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 295494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 295594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 295694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 295794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 295894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 295994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 296094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 296194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 296294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 296394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 296494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 296594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[10]; \ 296694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 296794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 296894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 296994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 297094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 297194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 297294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 297394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 297494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 297594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 297694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 297794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 297894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 297994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 298094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 298194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #32] \n\t" \ 298294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1, #36] \n\t" \ 298394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2, r3, r4} \n\t" \ 298494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 298594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 298694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 298794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 298894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 298994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 299094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #20 \n\t" \ 299194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 299294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 299394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 299494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 299594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 299694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 299794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 299894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 299994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 300094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 300194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 300294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 300394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[11]; \ 300494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 300594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 300694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 300794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 300894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 300994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 301094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 301194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 301294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 301394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 301494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 301594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 301694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 301794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #40] \n\t" \ 301894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0} \n\t" \ 301994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 302094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 302194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 302294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #32] \n\t" \ 302394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1, #36] \n\t" \ 302494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2, r3, r4} \n\t" \ 302594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 302694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 302794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 302894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 302994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 303094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 303194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #24 \n\t" \ 303294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 303394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 303494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 303594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 303694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 303794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 303894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 303994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 304094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 304194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg6,arg7,arg8,arg9,arg10, \ 304294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg11) \ 304394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 304494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 304594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[12]; \ 304694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 304794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 304894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 304994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 305094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 305194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 305294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 305394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 305494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 305594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 305694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 305794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 305894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 305994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 306094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #40] \n\t" \ 306194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #44] \n\t" \ 306294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1} \n\t" \ 306394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 306494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 306594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 306694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #32] \n\t" \ 306794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1, #36] \n\t" \ 306894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2, r3, r4} \n\t" \ 306994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 307094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 307194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 307294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 307394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 307494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 307594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #28 \n\t" \ 307694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 307794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 307894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 307994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory",__CALLER_SAVED_REGS \ 308094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 308194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 308294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 308394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 308494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 308594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg6,arg7,arg8,arg9,arg10, \ 308694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg11,arg12) \ 308794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 308894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 308994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[13]; \ 309094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 309194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[0] = (unsigned long)_orig.nraddr; \ 309294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)(arg1); \ 309394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)(arg2); \ 309494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[3] = (unsigned long)(arg3); \ 309594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[4] = (unsigned long)(arg4); \ 309694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[5] = (unsigned long)(arg5); \ 309794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[6] = (unsigned long)(arg6); \ 309894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[7] = (unsigned long)(arg7); \ 309994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[8] = (unsigned long)(arg8); \ 310094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[9] = (unsigned long)(arg9); \ 310194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[10] = (unsigned long)(arg10); \ 310294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[11] = (unsigned long)(arg11); \ 310394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[12] = (unsigned long)(arg12); \ 310494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 310594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #40] \n\t" \ 310694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #44] \n\t" \ 310794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #48] \n\t" \ 310894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2} \n\t" \ 310994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #20] \n\t" \ 311094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #24] \n\t" \ 311194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #28] \n\t" \ 311294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #32] \n\t" \ 311394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1, #36] \n\t" \ 311494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "push {r0, r1, r2, r3, r4} \n\t" \ 311594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r0, [%1, #4] \n\t" \ 311694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r1, [%1, #8] \n\t" \ 311794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r2, [%1, #12] \n\t" \ 311894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r3, [%1, #16] \n\t" \ 311994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ldr r4, [%1] \n\t" /* target->r4 */ \ 312094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 312194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "add sp, sp, #32 \n\t" \ 312294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mov %0, r0" \ 312394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 312494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "0" (&_argvec[0]) \ 312594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 312694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 312794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 312894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 312994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 313094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_arm_linux */ 313194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 313294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc32-aix5 ------------------------- */ 313394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 313494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc32_aix5) 313594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 313694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 313794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 313894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 313994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS \ 314094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lr", "ctr", "xer", \ 314194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 314294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 314394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r11", "r12", "r13" 314494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 314594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Expand the stack frame, copying enough info that unwinding 314694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez still works. Trashes r3. */ 314794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 314894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 314994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-" #_n_fr "\n\t" \ 315094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3," #_n_fr "(1)\n\t" \ 315194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,0(1)\n\t" 315294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 315394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONTRACT_FRAME_BY(_n_fr) \ 315494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1," #_n_fr "\n\t" 315594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 315694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned 315794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 4. */ 315894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 315994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 316094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 316194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 316294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+0]; \ 316394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 316494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 316594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 316694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 316794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 316894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 316994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 317094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 317194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 317294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 317394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 317494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 317594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 317694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 317794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 317894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 317994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 318094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 318194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 318294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 318394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 318494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 318594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 318694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 318794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 318894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+1]; \ 318994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 319094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 319194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 319294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 319394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 319494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 319594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 319694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 319794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 319894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 319994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 320094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 320194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 320294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 320394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 320494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 320594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 320694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 320794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 320894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 320994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 321094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 321194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 321294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 321394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 321494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 321594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 321694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+2]; \ 321794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 321894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 321994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 322094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 322194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 322294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 322394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 322494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 322594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 322694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 322794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 322894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 322994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 323094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 323194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 323294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 323394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 323494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 323594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 323694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 323794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 323894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 323994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 324094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 324194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 324294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 324394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 324494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 324594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 324694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+3]; \ 324794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 324894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 324994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 325094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 325194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 325294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 325394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 325494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 325594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 325694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 325794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 325894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 325994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 326094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 326194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 326294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 326394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 326494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 326594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 326694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 326794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 326894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 326994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 327094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 327194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 327294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 327394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 327494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 327594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 327694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 327794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 327894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+4]; \ 327994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 328094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 328194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 328294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 328394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 328494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 328594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 328694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 328794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 328894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 328994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 329094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 329194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 329294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 329394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 329494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 329594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 329694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 329794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 329894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 329994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 330094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 330194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 330294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 330394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 330494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 330594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 330694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 330794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 330894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 330994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 331094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 331194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 331294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+5]; \ 331394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 331494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 331594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 331694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 331794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 331894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 331994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 332094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 332194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 332294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 332394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 332494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 332594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 332694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 332794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 332894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 332994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 333094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 333194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 333294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 333394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 333494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 333594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 333694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 333794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 333894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 333994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 334094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 334194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 334294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 334394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 334494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 334594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 334694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 334794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 334894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+6]; \ 334994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 335094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 335194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 335294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 335394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 335494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 335594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 335694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 335794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 335894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 335994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 336094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 336194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 336294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 336394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 336494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 336594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 336694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 336794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 336894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 336994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 337094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 337194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 337294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 337394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 337494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 337594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 337694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 337794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 337894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 337994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 338094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 338194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 338294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 338394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 338494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 338594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 338694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 338794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+7]; \ 338894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 338994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 339094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 339194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 339294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 339394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 339494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 339594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 339694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 339794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 339894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 339994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 340094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 340194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 340294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 340394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 340494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 340594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 340694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 340794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 340894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 340994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 341094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 341194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 341294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 341394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 341494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 341594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 341694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 341794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 341894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 341994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 342094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 342194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 342294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 342394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 342494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 342594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 342694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 342794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 342894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+8]; \ 342994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 343094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 343194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 343294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 343394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 343494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 343594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 343694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 343794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 343894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 343994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 344094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 344194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 344294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 344394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 344494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 344594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 344694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 344794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 344894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 344994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 345094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 345194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 345294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 345394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 345494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 345594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 345694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 345794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 345894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 345994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 346094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 346194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 346294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 346394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 346494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 346594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 346694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 346794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 346894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 346994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 347094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 347194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+9]; \ 347294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 347394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 347494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 347594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 347694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 347794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 347894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 347994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 348094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 348194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 348294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 348394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 348494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 348594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 348694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 348794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 348894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 348994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 349094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(64) \ 349194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 349294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 349394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,56(1)\n\t" \ 349494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 349594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 349694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 349794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 349894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 349994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 350094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 350194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 350294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 350394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 350494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 350594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 350694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 350794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 350894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(64) \ 350994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 351094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 351194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 351294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 351394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 351494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 351594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 351694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 351794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 351894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 351994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 352094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 352194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+10]; \ 352294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 352394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 352494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 352594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 352694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 352794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 352894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 352994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 353094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 353194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 353294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 353394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 353494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 353594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 353694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 353794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 353894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 353994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 354094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 354194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(64) \ 354294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 354394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 354494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,60(1)\n\t" \ 354594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 354694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 354794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,56(1)\n\t" \ 354894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 354994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 355094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 355194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 355294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 355394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 355494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 355594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 355694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 355794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 355894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 355994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 356094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 356194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 356294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(64) \ 356394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 356494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 356594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 356694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 356794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 356894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 356994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 357094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 357194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 357294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11) \ 357394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 357494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 357594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+11]; \ 357694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 357794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 357894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 357994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 358094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 358194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 358294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 358394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 358494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 358594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 358694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 358794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 358894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 358994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 359094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 359194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 359294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 359394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 359494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 359594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 359694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(72) \ 359794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 359894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,44(11)\n\t" \ 359994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,64(1)\n\t" \ 360094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 360194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 360294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,60(1)\n\t" \ 360394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 360494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 360594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,56(1)\n\t" \ 360694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 360794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 360894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 360994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 361094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 361194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 361294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 361394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 361494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 361594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 361694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 361794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 361894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 361994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 362094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(72) \ 362194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 362294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 362394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 362494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 362594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 362694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 362794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 362894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 362994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 363094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11,arg12) \ 363194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 363294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 363394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+12]; \ 363494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 363594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 363694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 363794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 363894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 363994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 364094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 364194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 364294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 364394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 364494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 364594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 364694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 364794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 364894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 364994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+12] = (unsigned long)arg12; \ 365094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 365194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 365294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 365394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 2,-8(11)\n\t" /* save tocptr */ \ 365494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 365594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(72) \ 365694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg12 */ \ 365794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,48(11)\n\t" \ 365894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,68(1)\n\t" \ 365994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 366094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,44(11)\n\t" \ 366194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,64(1)\n\t" \ 366294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 366394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,40(11)\n\t" \ 366494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,60(1)\n\t" \ 366594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 366694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3,36(11)\n\t" \ 366794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "stw 3,56(1)\n\t" \ 366894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 366994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 367094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 367194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 367294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 367394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 367494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 367594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 367694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 367794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 11, 0(11)\n\t" /* target->r11 */ \ 367894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 367994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 368094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 368194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 368294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(72) \ 368394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 368494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 368594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 368694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 368794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 368894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 368994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 369094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 369194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc32_aix5 */ 369294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 369394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------ ppc64-aix5 ------------------------- */ 369494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 369594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(PLAT_ppc64_aix5) 369694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 369794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 369894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 369994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These regs are trashed by the hidden call. */ 370094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define __CALLER_SAVED_REGS \ 370194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "lr", "ctr", "xer", \ 370294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 370394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 370494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "r11", "r12", "r13" 370594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 370694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Expand the stack frame, copying enough info that unwinding 370794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez still works. Trashes r3. */ 370894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 370994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 371094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1,-" #_n_fr "\n\t" \ 371194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3," #_n_fr "(1)\n\t" \ 371294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,0(1)\n\t" 371394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 371494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_CONTRACT_FRAME_BY(_n_fr) \ 371594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "addi 1,1," #_n_fr "\n\t" 371694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 371794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned 371894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez long) == 8. */ 371994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 372094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_v(lval, orig) \ 372194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 372294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 372394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+0]; \ 372494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 372594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 372694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 372794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 372894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 372994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 373094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 373194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 373294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 373394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 373494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 373594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 373694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 373794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 373894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 373994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 374094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 374194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 374294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 374394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 374494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 374594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 374694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_W(lval, orig, arg1) \ 374794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 374894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 374994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+1]; \ 375094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 375194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 375294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 375394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 375494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 375594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 375694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 375794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 375894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 375994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 376094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 376194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 376294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 376394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 376494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 376594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 376694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 376794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 376894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 376994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 377094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 377194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 377294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 377394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 377494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 377594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 377694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 377794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+2]; \ 377894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 377994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 378094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 378194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 378294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 378394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 378494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 378594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 378694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 378794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 378894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 378994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 379094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 379194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 379294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 379394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 379494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 379594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 379694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 379794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 379894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 379994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 380094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 380194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 380294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 380394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 380494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 380594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 380694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 380794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+3]; \ 380894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 380994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 381094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 381194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 381294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 381394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 381494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 381594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 381694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 381794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 381894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 381994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 382094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 382194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 382294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 382394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 382494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 382594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 382694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 382794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 382894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 382994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 383094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 383194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 383294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 383394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 383494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 383594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 383694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 383794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 383894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 383994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+4]; \ 384094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 384194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 384294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 384394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 384494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 384594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 384694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 384794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 384894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 384994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 385094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 385194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 385294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 385394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 385494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 385594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 385694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 385794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 385894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 385994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 386094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 386194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 386294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 386394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 386494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 386594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 386694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 386794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 386894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 386994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 387094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 387194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 387294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 387394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+5]; \ 387494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 387594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 387694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 387794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 387894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 387994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 388094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 388194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 388294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 388394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 388494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 388594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 388694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 388794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 388894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 388994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 389094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 389194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 389294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 389394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 389494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 389594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 389694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 389794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 389894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 389994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 390094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 390194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 390294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 390394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 390494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 390594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 390694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 390794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 390894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 390994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+6]; \ 391094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 391194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 391294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 391394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 391494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 391594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 391694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 391794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 391894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 391994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 392094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 392194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 392294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 392394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 392494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 392594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 392694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 392794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 392894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 392994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 393094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 393194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 393294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 393394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 393494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 393594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 393694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 393794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 393894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 393994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 394094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 394194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 394294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 394394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 394494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 394594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7) \ 394694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 394794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 394894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+7]; \ 394994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 395094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 395194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 395294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 395394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 395494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 395594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 395694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 395794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 395894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 395994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 396094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 396194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 396294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 396394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 396494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 396594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 396694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 396794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 396894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 396994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 397094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 397194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 397294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 397394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 397494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 397594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 397694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 397794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 397894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 397994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 398094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 398194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 398294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 398394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 398494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 398594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 398694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8) \ 398794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 398894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 398994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+8]; \ 399094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 399194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 399294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 399394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 399494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 399594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 399694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 399794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 399894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 399994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 400094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 400194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 400294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 400394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 400494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 400594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 400694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 400794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 400894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 400994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 401094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 401194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 401294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 401394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 401494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 401594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 401694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 401794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 401894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 401994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 402094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 402194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 402294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 402394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 402494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 402594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 402694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 402794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 402894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 402994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9) \ 403094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 403194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 403294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+9]; \ 403394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 403494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 403594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 403694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 403794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 403894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 403994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 404094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 404194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 404294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 404394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 404494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 404594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 404694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 404794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 404894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 404994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 405094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 405194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(128) \ 405294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 405394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 405494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 405594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 405694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 405794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 405894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 405994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 406094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 406194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 406294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 406394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 406494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 406594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 406694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 406794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 406894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 406994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(128) \ 407094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 407194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 407294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 407394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 407494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 407594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 407694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 407794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 407894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 407994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10) \ 408094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 408194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 408294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+10]; \ 408394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 408494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 408594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 408694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 408794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 408894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 408994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 409094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 409194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 409294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 409394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 409494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 409594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 409694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 409794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 409894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 409994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 410094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 410194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 410294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(128) \ 410394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 410494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 410594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 410694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 410794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 410894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 410994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 411094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 411194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 411294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 411394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 411494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 411594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 411694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 411794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 411894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 411994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 412094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 412194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 412294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 412394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(128) \ 412494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 412594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 412694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 412794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 412894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 412994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 413094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 413194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 413294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 413394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11) \ 413494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 413594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 413694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+11]; \ 413794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 413894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 413994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 414094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 414194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 414294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 414394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 414494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 414594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 414694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 414794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 414894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 414994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 415094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 415194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 415294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 415394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 415494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 415594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 415694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 415794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(144) \ 415894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 415994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,88(11)\n\t" \ 416094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,128(1)\n\t" \ 416194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 416294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 416394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 416494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 416594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 416694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 416794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 416894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 416994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 417094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 417194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 417294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 417394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 417494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 417594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 417694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 417794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 417894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 417994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 418094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 418194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(144) \ 418294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 418394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 418494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 418594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 418694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 418794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 418894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 418994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 419094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 419194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez arg7,arg8,arg9,arg10,arg11,arg12) \ 419294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez do { \ 419394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile OrigFn _orig = (orig); \ 419494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _argvec[3+12]; \ 419594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez volatile unsigned long _res; \ 419694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* _argvec[0] holds current r2 across the call */ \ 419794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[1] = (unsigned long)_orig.r2; \ 419894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2] = (unsigned long)_orig.nraddr; \ 419994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+1] = (unsigned long)arg1; \ 420094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+2] = (unsigned long)arg2; \ 420194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+3] = (unsigned long)arg3; \ 420294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+4] = (unsigned long)arg4; \ 420394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+5] = (unsigned long)arg5; \ 420494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+6] = (unsigned long)arg6; \ 420594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+7] = (unsigned long)arg7; \ 420694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+8] = (unsigned long)arg8; \ 420794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+9] = (unsigned long)arg9; \ 420894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+10] = (unsigned long)arg10; \ 420994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+11] = (unsigned long)arg11; \ 421094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _argvec[2+12] = (unsigned long)arg12; \ 421194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __asm__ volatile( \ 421294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 421394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(512) \ 421494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 2,-16(11)\n\t" /* save tocptr */ \ 421594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 421694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_EXPAND_FRAME_BY_trashes_r3(144) \ 421794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg12 */ \ 421894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,96(11)\n\t" \ 421994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,136(1)\n\t" \ 422094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg11 */ \ 422194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,88(11)\n\t" \ 422294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,128(1)\n\t" \ 422394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg10 */ \ 422494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,80(11)\n\t" \ 422594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,120(1)\n\t" \ 422694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* arg9 */ \ 422794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3,72(11)\n\t" \ 422894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "std 3,112(1)\n\t" \ 422994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* args1-8 */ \ 423094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 423194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 423294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 423394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 423494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 423594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 423694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 423794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 423894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 11, 0(11)\n\t" /* target->r11 */ \ 423994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 424094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr 11,%1\n\t" \ 424194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "mr %0,3\n\t" \ 424294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez "ld 2,-16(11)\n\t" /* restore tocptr */ \ 424394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(144) \ 424494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_CONTRACT_FRAME_BY(512) \ 424594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*out*/ "=r" (_res) \ 424694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*in*/ "r" (&_argvec[2]) \ 424794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 424894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ); \ 424994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez lval = (__typeof__(lval)) _res; \ 425094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } while (0) 425194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 425294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* PLAT_ppc64_aix5 */ 425394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 425494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 425594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 425694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ 425794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* */ 425894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* ------------------------------------------------------------------ */ 425994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 426094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Some request codes. There are many more of these, but most are not 426194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez exposed to end-user view. These are the public ones, all of the 426294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez form 0x1000 + small_number. 426394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 426494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Core ones are in the range 0x00000000--0x0000ffff. The non-public 426594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ones start at 0x2000. 426694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 426794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 426894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These macros are used by tools -- they must be public, but don't 426994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez embed them into other programs. */ 427094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_USERREQ_TOOL_BASE(a,b) \ 427194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) 427294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VG_IS_TOOL_USERREQ(a, b, v) \ 427394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) 427494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 427594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! 427694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez This enum comprises an ABI exported by Valgrind to programs 427794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez which use client requests. DO NOT CHANGE THE ORDER OF THESE 427894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ENTRIES, NOR DELETE ANY -- add new ones at the end. */ 427994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chaveztypedef 428094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, 428194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, 428294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 428394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* These allow any function to be called from the simulated 428494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez CPU but run on the real CPU. Nb: the first arg passed to 428594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez the function is always the ThreadId of the running 428694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez thread! So CLIENT_CALL0 actually requires a 1 arg 428794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez function, etc. */ 428894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL0 = 0x1101, 428994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL1 = 0x1102, 429094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL2 = 0x1103, 429194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL3 = 0x1104, 429294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 429394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Can be useful in regression testing suites -- eg. can 429494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez send Valgrind's output to /dev/null and still count 429594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez errors. */ 429694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__COUNT_ERRORS = 0x1201, 429794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 429894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* These are useful and can be interpreted by any tool that 429994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez tracks malloc() et al, by using vg_replace_malloc.c. */ 430094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, 430194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__FREELIKE_BLOCK = 0x1302, 430294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Memory pool support. */ 430394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CREATE_MEMPOOL = 0x1303, 430494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__DESTROY_MEMPOOL = 0x1304, 430594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_ALLOC = 0x1305, 430694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_FREE = 0x1306, 430794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_TRIM = 0x1307, 430894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MOVE_MEMPOOL = 0x1308, 430994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_CHANGE = 0x1309, 431094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_EXISTS = 0x130a, 431194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 431294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Allow printfs to valgrind log. */ 431394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* The first two pass the va_list argument by value, which 431494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez assumes it is the same size as or smaller than a UWord, 431594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez which generally isn't the case. Hence are deprecated. 431694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The second two pass the vargs by reference and so are 431794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez immune to this problem. */ 431894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* both :: char* fmt, va_list vargs (DEPRECATED) */ 431994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF = 0x1401, 432094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_BACKTRACE = 0x1402, 432194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* both :: char* fmt, va_list* vargs */ 432294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403, 432394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404, 432494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 432594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Stack support. */ 432694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_REGISTER = 0x1501, 432794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_DEREGISTER = 0x1502, 432894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_CHANGE = 0x1503, 432994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 433094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Wine support */ 433194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601, 433294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 433394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez /* Querying of debug info. */ 433494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701 433594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } Vg_ClientRequest; 433694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 433794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(__GNUC__) 433894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define __extension__ /* */ 433994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 434094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 434194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 434294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* 434394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez * VALGRIND_DO_CLIENT_REQUEST_EXPR(): a C expression that invokes a Valgrind 434494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez * client request and whose value equals the client request result. 434594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez */ 434694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 434794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND) 434894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 434994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 435094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_default, _zzq_request, \ 435194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 435294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (_zzq_default) 435394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 435494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /*defined(NVALGRIND)*/ 435594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 435694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 435794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 435894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 435994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_default, _zzq_request, \ 436094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 436194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (vg_VALGRIND_DO_CLIENT_REQUEST_EXPR((uintptr_t)(_zzq_default), \ 436294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (_zzq_request), (uintptr_t)(_zzq_arg1), (uintptr_t)(_zzq_arg2), \ 436394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)(_zzq_arg3), (uintptr_t)(_zzq_arg4), \ 436494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)(_zzq_arg5))) 436594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 436694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic __inline unsigned 436794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezvg_VALGRIND_DO_CLIENT_REQUEST_EXPR(uintptr_t _zzq_default, 436894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned _zzq_request, uintptr_t _zzq_arg1, 436994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez uintptr_t _zzq_arg2, uintptr_t _zzq_arg3, 437094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez uintptr_t _zzq_arg4, uintptr_t _zzq_arg5) 437194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{ 437294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned _zzq_rlval; 437394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request, 437494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5); 437594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return _zzq_rlval; 437694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 437794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 437894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /*defined(_MSC_VER)*/ 437994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 438094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ 438194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_default, _zzq_request, \ 438294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 438394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (__extension__({unsigned int _zzq_rlval; \ 438494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, _zzq_request, \ 438594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 438694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _zzq_rlval; \ 438794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez })) 438894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 438994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /*defined(_MSC_VER)*/ 439094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 439194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /*defined(NVALGRIND)*/ 439294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 439394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 439494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Returns the number of Valgrinds this code is running under. That 439594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez is, 0 if running natively, 1 if running under Valgrind, 2 if 439694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez running under Valgrind which is running under another Valgrind, 439794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez etc. */ 439894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define RUNNING_ON_VALGRIND \ 439994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST_EXPR(0 /* if not */, \ 440094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__RUNNING_ON_VALGRIND, \ 440194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0, 0, 0) \ 440294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 440394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 440494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Discard translation of code in the range [_qzz_addr .. _qzz_addr + 440594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qzz_len - 1]. Useful if you are debugging a JITter or some such, 440694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez since it provides a way to make sure valgrind will retranslate the 440794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez invalidated area. Returns no value. */ 440894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ 440994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 441094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 441194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__DISCARD_TRANSLATIONS, \ 441294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qzz_addr, _qzz_len, 0, 0, 0); \ 441394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 441494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 441594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 441694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These requests are for getting Valgrind itself to print something. 441794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Possibly with a backtrace. This is a really ugly hack. The return value 441894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez is the number of characters printed, excluding the "**<pid>** " part at the 441994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez start and the backtrace (if present). */ 442094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 442194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(NVALGRIND) 442294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 442394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_PRINTF(...) 442494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez# define VALGRIND_PRINTF_BACKTRACE(...) 442594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 442694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else /* NVALGRIND */ 442794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 442894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(_MSC_VER) 442994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Modern GCC will optimize the static routine out if unused, 443094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez and unused attribute will shut down warnings about it. */ 443194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int VALGRIND_PRINTF(const char *format, ...) 443294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __attribute__((format(__printf__, 1, 2), __unused__)); 443394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 443494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int 443594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 443694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez__inline 443794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 443894ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezVALGRIND_PRINTF(const char *format, ...) 443994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{ 444094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long _qzz_res; 444194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_list vargs; 444294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_start(vargs, format); 444394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 444494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 444594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_VALIST_BY_REF, 444694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)format, 444794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)&vargs, 444894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0); 444994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 445094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 445194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_VALIST_BY_REF, 445294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (unsigned long)format, 445394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (unsigned long)&vargs, 445494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0); 445594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 445694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_end(vargs); 445794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return (int)_qzz_res; 445894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 445994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 446094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if !defined(_MSC_VER) 446194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) 446294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __attribute__((format(__printf__, 1, 2), __unused__)); 446394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 446494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezstatic int 446594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 446694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez__inline 446794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 446894ffa55491333f3dcc701befd0d2652922916d99Luis Hector ChavezVALGRIND_PRINTF_BACKTRACE(const char *format, ...) 446994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez{ 447094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez unsigned long _qzz_res; 447194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_list vargs; 447294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_start(vargs, format); 447394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#if defined(_MSC_VER) 447494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 447594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, 447694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)format, 447794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (uintptr_t)&vargs, 447894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0); 447994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#else 448094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 448194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF, 448294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (unsigned long)format, 448394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (unsigned long)&vargs, 448494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0); 448594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 448694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez va_end(vargs); 448794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez return (int)_qzz_res; 448894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez} 448994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 449094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* NVALGRIND */ 449194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 449294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 449394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* These requests allow control to move from the simulated CPU to the 449494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez real CPU, calling an arbitary function. 449594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 449694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Note that the current ThreadId is inserted as the first argument. 449794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez So this call: 449894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 449994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) 450094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 450194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez requires f to have this signature: 450294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 450394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Word f(Word tid, Word arg1, Word arg2) 450494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 450594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez where "Word" is a word-sized type. 450694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 450794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Note that these client requests are not entirely reliable. For example, 450894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez if you call a function with them that subsequently calls printf(), 450994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez there's a high chance Valgrind will crash. Generally, your prospects of 451094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez these working are made higher if the called function does not refer to 451194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez any global variables, and does not refer to any libc or other functions 451294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (printf et al). Any kind of entanglement with libc or dynamic linking is 451394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez likely to have a bad outcome, for tricky reasons which we've grappled 451494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez with a lot in the past. 451594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 451694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ 451794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 451894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned long _qyy_res; \ 451994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 452094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL0, \ 452194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_fn, \ 452294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0, 0); \ 452394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_res; \ 452494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 452594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 452694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ 452794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 452894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned long _qyy_res; \ 452994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 453094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL1, \ 453194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_fn, \ 453294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_arg1, 0, 0, 0); \ 453394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_res; \ 453494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 453594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 453694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ 453794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 453894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned long _qyy_res; \ 453994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 454094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL2, \ 454194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_fn, \ 454294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_arg1, _qyy_arg2, 0, 0); \ 454394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_res; \ 454494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 454594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 454694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ 454794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 454894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned long _qyy_res; \ 454994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 455094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CLIENT_CALL3, \ 455194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_fn, \ 455294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_arg1, _qyy_arg2, \ 455394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_arg3, 0); \ 455494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_res; \ 455594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 455694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 455794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 455894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Counts the number of errors that have been recorded by a tool. Nb: 455994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez the tool must record the errors with VG_(maybe_record_error)() or 456094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_(unique_error)() for them to be counted. */ 456194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_COUNT_ERRORS \ 456294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 456394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned int _qyy_res; \ 456494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 456594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__COUNT_ERRORS, \ 456694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 0, 0, 0, 0, 0); \ 456794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qyy_res; \ 456894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 456994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 457094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Several Valgrind tools (Memcheck, Massif, Helgrind, DRD) rely on knowing 457194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez when heap blocks are allocated in order to give accurate results. This 457294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez happens automatically for the standard allocator functions such as 457394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez malloc(), calloc(), realloc(), memalign(), new, new[], free(), delete, 457494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez delete[], etc. 457594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 457694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez But if your program uses a custom allocator, this doesn't automatically 457794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez happen, and Valgrind will not do as well. For example, if you allocate 457894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez superblocks with mmap() and then allocates chunks of the superblocks, all 457994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Valgrind's observations will be at the mmap() level and it won't know that 458094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez the chunks should be considered separate entities. In Memcheck's case, 458194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that means you probably won't get heap block overrun detection (because 458294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez there won't be redzones marked as unaddressable) and you definitely won't 458394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez get any leak detection. 458494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 458594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez The following client requests allow a custom allocator to be annotated so 458694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez that it can be handled accurately by Valgrind. 458794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 458894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_MALLOCLIKE_BLOCK marks a region of memory as having been allocated 458994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez by a malloc()-like function. For Memcheck (an illustrative case), this 459094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez does two things: 459194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 459294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez - It records that the block has been allocated. This means any addresses 459394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez within the block mentioned in error messages will be 459494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez identified as belonging to the block. It also means that if the block 459594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez isn't freed it will be detected by the leak checker. 459694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 459794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez - It marks the block as being addressable and undefined (if 'is_zeroed' is 459894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez not set), or addressable and defined (if 'is_zeroed' is set). This 459994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez controls how accesses to the block by the program are handled. 460094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 460194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 'addr' is the start of the usable block (ie. after any 460294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez redzone), 'sizeB' is its size. 'rzB' is the redzone size if the allocator 460394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez can apply redzones -- these are blocks of padding at the start and end of 460494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez each block. Adding redzones is recommended as it makes it much more likely 460594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Valgrind will spot block overruns. `is_zeroed' indicates if the memory is 460694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez zeroed (or filled with another predictable value), as is the case for 460794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez calloc(). 460894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 460994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a 461094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez heap block -- that will be used by the client program -- is allocated. 461194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez It's best to put it at the outermost level of the allocator if possible; 461294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez for example, if you have a function my_alloc() which calls 461394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez internal_alloc(), and the client request is put inside internal_alloc(), 461494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez stack traces relating to the heap block will contain entries for both 461594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez my_alloc() and internal_alloc(), which is probably not what you want. 461694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 461794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out 461894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez custom blocks from within a heap block, B, that has been allocated with 461994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez malloc/calloc/new/etc, then block B will be *ignored* during leak-checking 462094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez -- the custom blocks will take precedence. 462194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 462294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK. For 462394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Memcheck, it does two things: 462494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 462594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez - It records that the block has been deallocated. This assumes that the 462694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez block was annotated as having been allocated via 462794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_MALLOCLIKE_BLOCK. Otherwise, an error will be issued. 462894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 462994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez - It marks the block as being unaddressable. 463094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 463194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a 463294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez heap block is deallocated. 463394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 463494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez In many cases, these two client requests will not be enough to get your 463594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez allocator working well with Memcheck. More specifically, if your allocator 463694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez writes to freed blocks in any way then a VALGRIND_MAKE_MEM_UNDEFINED call 463794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez will be necessary to mark the memory as addressable just before the zeroing 463894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez occurs, otherwise you'll get a lot of invalid write errors. For example, 463994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez you'll need to do this if your allocator recycles freed blocks, but it 464094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez zeroes them before handing them back out (via VALGRIND_MALLOCLIKE_BLOCK). 464194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Alternatively, if your allocator reuses freed blocks for allocator-internal 464294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez data structures, VALGRIND_MAKE_MEM_UNDEFINED calls will also be necessary. 464394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 464494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Really, what's happening is a blurring of the lines between the client 464594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez program and the allocator... after VALGRIND_FREELIKE_BLOCK is called, the 464694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez memory should be considered unaddressable to the client program, but the 464794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez allocator knows more than the rest of the client program and so may be able 464894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez to safely access it. Extra client requests are necessary for Valgrind to 464994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez understand the distinction between the allocator and the rest of the 465094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez program. 465194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 465294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Note: there is currently no VALGRIND_REALLOCLIKE_BLOCK client request; it 465394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez has to be emulated with MALLOCLIKE/FREELIKE and memory copying. 465494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 465594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Ignored if addr == 0. 465694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 465794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ 465894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 465994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 466094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MALLOCLIKE_BLOCK, \ 466194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez addr, sizeB, rzB, is_zeroed, 0); \ 466294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 466394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 466494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* See the comment for VALGRIND_MALLOCLIKE_BLOCK for details. 466594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez Ignored if addr == 0. 466694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez*/ 466794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ 466894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 466994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 467094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__FREELIKE_BLOCK, \ 467194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez addr, rzB, 0, 0, 0); \ 467294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 467394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 467494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Create a memory pool. */ 467594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ 467694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 467794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 467894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__CREATE_MEMPOOL, \ 467994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, rzB, is_zeroed, 0, 0); \ 468094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 468194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 468294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Destroy a memory pool. */ 468394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_DESTROY_MEMPOOL(pool) \ 468494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 468594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 468694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__DESTROY_MEMPOOL, \ 468794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, 0, 0, 0, 0); \ 468894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 468994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 469094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Associate a piece of memory with a memory pool. */ 469194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ 469294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 469394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 469494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_ALLOC, \ 469594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, addr, size, 0, 0); \ 469694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 469794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 469894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Disassociate a piece of memory from a memory pool. */ 469994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_FREE(pool, addr) \ 470094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 470194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 470294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_FREE, \ 470394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, addr, 0, 0, 0); \ 470494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 470594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 470694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Disassociate any pieces outside a particular range. */ 470794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ 470894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 470994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 471094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_TRIM, \ 471194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, addr, size, 0, 0); \ 471294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 471394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 471494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Resize and/or move a piece associated with a memory pool. */ 471594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ 471694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 471794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 471894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MOVE_MEMPOOL, \ 471994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez poolA, poolB, 0, 0, 0); \ 472094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 472194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 472294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Resize and/or move a piece associated with a memory pool. */ 472394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ 472494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 472594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 472694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_CHANGE, \ 472794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, addrA, addrB, size, 0); \ 472894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 472994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 473094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Return 1 if a mempool exists, else 0. */ 473194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MEMPOOL_EXISTS(pool) \ 473294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 473394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned int _qzz_res; \ 473494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 473594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MEMPOOL_EXISTS, \ 473694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez pool, 0, 0, 0, 0); \ 473794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qzz_res; \ 473894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 473994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 474094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Mark a piece of memory as being a stack. Returns a stack id. */ 474194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_REGISTER(start, end) \ 474294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez __extension__ \ 474394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez ({unsigned int _qzz_res; \ 474494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 474594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_REGISTER, \ 474694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez start, end, 0, 0, 0); \ 474794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez _qzz_res; \ 474894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez }) 474994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 475094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Unmark the piece of memory associated with a stack id as being a 475194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez stack. */ 475294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_DEREGISTER(id) \ 475394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 475494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 475594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_DEREGISTER, \ 475694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez id, 0, 0, 0, 0); \ 475794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 475894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 475994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Change the start and end address of the stack id. */ 476094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_STACK_CHANGE(id, start, end) \ 476194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 476294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 476394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__STACK_CHANGE, \ 476494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez id, start, end, 0, 0); \ 476594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 476694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 476794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Load PDB debug info for Wine PE image_map. */ 476894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \ 476994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 477094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 477194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__LOAD_PDB_DEBUGINFO, \ 477294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez fd, ptr, total_size, delta, 0); \ 477394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 477494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 477594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez/* Map a code address to a source file name and line number. buf64 477694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez must point to a 64-byte buffer in the caller's address space. The 477794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez result will be dumped in there and is guaranteed to be zero 477894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez terminated. If no info is found, the first byte is set to zero. */ 477994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \ 478094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez {unsigned int _qzz_res; \ 478194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 478294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez VG_USERREQ__MAP_IP_TO_SRCLOC, \ 478394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez addr, buf64, 0, 0, 0); \ 478494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez } 478594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 478694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 478794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_x86_linux 478894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_amd64_linux 478994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_linux 479094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_linux 479194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_arm_linux 479294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc32_aix5 479394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#undef PLAT_ppc64_aix5 479494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 479594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif /* __VALGRIND_H */ 479694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 479794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#endif 4798