15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- c -*- 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ---------------------------------------------------------------- 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notice that the following BSD-style license applies to this one 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file (valgrind.h) only. The rest of Valgrind is licensed under the 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) terms of the GNU General Public License, version 2, unless 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otherwise indicated. See the COPYING file in the source 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distribution for details. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ---------------------------------------------------------------- 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This file is part of Valgrind, a dynamic binary instrumentation 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framework. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) 2000-2008 Julian Seward. All rights reserved. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Redistribution and use in source and binary forms, with or without 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modification, are permitted provided that the following conditions 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) are met: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1. Redistributions of source code must retain the above copyright 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notice, this list of conditions and the following disclaimer. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2. The origin of this software must not be misrepresented; you must 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not claim that you wrote the original software. If you use this 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) software in a product, an acknowledgment in the product 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) documentation would be appreciated but is not required. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3. Altered source versions must be plainly marked as such, and must 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) not be misrepresented as being the original software. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4. The name of the author may not be used to endorse or promote 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) products derived from this software without specific prior written 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permission. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ---------------------------------------------------------------- 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notice that the above BSD-style license applies to this one file 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (valgrind.h) only. The entire rest of Valgrind is licensed under 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the terms of the GNU General Public License, version 2. See the 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COPYING file in the source distribution for details. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ---------------------------------------------------------------- 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This file is for inclusion into client (your!) code. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) You can use these macros to manipulate and query Valgrind's 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execution inside your own programs. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The resulting executables will still run without Valgrind, just a 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) little bit more slowly than they otherwise would, but otherwise 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unchanged. When not running on valgrind, each client request 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumes very few (eg. 7) instructions, so the resulting performance 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loss is negligible unless you plan to execute client requests 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) millions of times per second. Nevertheless, if that is still a 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) problem, you can compile with the NVALGRIND symbol defined (gcc 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -DNVALGRIND) so that client requests are not even compiled in. */ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __VALGRIND_H 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __VALGRIND_H 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Nb: this file might be included in a file compiled with -ansi. So 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) we can't use C++ style "//" comments nor the "asm" keyword (instead 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use "__asm__"). */ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Derive some tags indicating what the target platform is. Note 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) that in this file we're using the compiler's CPP symbols for 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) identifying architectures, which are different to the ones we use 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) within the rest of Valgrind. Note, __powerpc__ is active for both 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32 and 64-bit PPC, whereas __powerpc64__ is only active for the 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) latter (on Linux, that is). */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_x86_linux 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_amd64_linux 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_linux 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_linux 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_aix5 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_aix5 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_AIX) && defined(__i386__) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_x86_linux 1 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__x86_64__) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_amd64_linux 1 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_ppc32_linux 1 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_ppc64_linux 1 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_AIX) && defined(__64BIT__) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_ppc64_aix5 1 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_AIX) && !defined(__64BIT__) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define PLAT_ppc32_aix5 1 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* If we're not compiling for our target platform, don't generate 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) any inline asms. */ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PLAT_x86_linux) && !defined(PLAT_amd64_linux) \ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && !defined(PLAT_ppc32_linux) && !defined(PLAT_ppc64_linux) \ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && !defined(PLAT_ppc32_aix5) && !defined(PLAT_ppc64_aix5) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if !defined(NVALGRIND) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define NVALGRIND 1 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* in here of use to end-users -- skip to the next section. */ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NVALGRIND) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Define NVALGRIND to completely remove the Valgrind magic sequence 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from the compiled code (analogous to NDEBUG's effects on 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert()) */ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { \ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (_zzq_rlval) = (_zzq_default); \ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* ! NVALGRIND */ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following defines the magic code sequences which the JITter 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spots and handles magically. Don't look too closely at them as 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) they will rot your brain. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The assembly code sequences for all architectures is in this one 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file. This is because this file must be stand-alone, and we don't 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) want to have multiple files. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value gets put in the return slot, so that everything works when 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this is executed not under Valgrind. Args are passed in a memory 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block, and so there's no intrinsic limit to the number that could 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) be passed, but it's currently five. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The macro args are: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval result lvalue 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_default default value (result returned when running on real CPU) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_request request code 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1..5 request params 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The other two macros are used to support function wrapping, and are 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guest's NRADDR pseudo-register and whatever other information is 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needed to safely run the call original from the wrapper: on 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppc64-linux, the R2 value at the divert point is also needed. This 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) information is abstracted into a user-visible type, OrigFn. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_* behaves the same as the following on the 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guest, but guarantees that the branch instruction will not be 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) complete inline asm, since it needs to be combined with more magic 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline asm stuff to be useful. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------- x86-linux ------------------------- */ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_x86_linux) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int nraddr; /* where's the code? */ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "roll $3, %%edi ; roll $13, %%edi\n\t" \ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "roll $29, %%edi ; roll $19, %%edi\n\t" 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile unsigned int _zzq_args[6]; \ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned int _zzq_result; \ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned int)(_zzq_request); \ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %EDX = client_request ( %EAX ) */ \ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgl %%ebx,%%ebx" \ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=d" (_zzq_result) \ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned int __addr; \ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %EAX = guest_NRADDR */ \ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgl %%ecx,%%ecx" \ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=a" (__addr) \ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CALL_NOREDIR_EAX \ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* call-noredir *%EAX */ \ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgl %%edx,%%edx\n\t" 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_x86_linux */ 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ amd64-linux ------------------------ */ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_amd64_linux) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long int nraddr; /* where's the code? */ 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile unsigned long long int _zzq_args[6]; \ 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long long int _zzq_result; \ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %RDX = client_request ( %RAX ) */ \ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgq %%rbx,%%rbx" \ 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=d" (_zzq_result) \ 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long long int __addr; \ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %RAX = guest_NRADDR */ \ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgq %%rcx,%%rcx" \ 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=a" (__addr) \ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CALL_NOREDIR_RAX \ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* call-noredir *%RAX */ \ 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xchgq %%rdx,%%rdx\n\t" 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_amd64_linux */ 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-linux ------------------------ */ 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_linux) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int nraddr; /* where's the code? */ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { unsigned int _zzq_args[6]; \ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int _zzq_result; \ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* _zzq_ptr; \ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned int)(_zzq_request); \ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_ptr = _zzq_args; \ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile("mr 3,%1\n\t" /*default*/ \ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 4,%2\n\t" /*ptr*/ \ 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = client_request ( %R4 ) */ \ 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 1,1,1\n\t" \ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" /*result*/ \ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (_zzq_result) \ 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "b" (_zzq_default), "b" (_zzq_ptr) \ 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory", "r3", "r4"); \ 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int __addr; \ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR */ \ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 2,2,2\n\t" \ 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (__addr) \ 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory", "r3" \ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* branch-and-link-to-noredir *%R11 */ \ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 3,3,3\n\t" 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_linux */ 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-linux ------------------------ */ 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_linux) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long int nraddr; /* where's the code? */ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long int r2; /* what tocptr do we need? */ 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { unsigned long long int _zzq_args[6]; \ 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int _zzq_result __asm__("r3"); \ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int* _zzq_ptr __asm__("r4"); \ 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_ptr = _zzq_args; \ 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = client_request ( %R4 ) */ \ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 1,1,1" \ 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=r" (_zzq_result) \ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "0" (_zzq_default), "r" (_zzq_ptr) \ 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory"); \ 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int __addr __asm__("r3"); \ 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR */ \ 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 2,2,2" \ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=r" (__addr) \ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR_GPR2 */ \ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 4,4,4" \ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=r" (__addr) \ 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "cc", "memory" \ 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->r2 = __addr; \ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* branch-and-link-to-noredir *%R11 */ \ 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 3,3,3\n\t" 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_linux */ 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-aix5 ------------------------- */ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_aix5) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int nraddr; /* where's the code? */ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int r2; /* what tocptr do we need? */ 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { unsigned int _zzq_args[7]; \ 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned int _zzq_result; \ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned int* _zzq_ptr; \ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned int)(_zzq_request); \ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[6] = (unsigned int)(_zzq_default); \ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_ptr = _zzq_args; \ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile("mr 4,%1\n\t" \ 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 24(4)\n\t" \ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = client_request ( %R4 ) */ \ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 1,1,1\n\t" \ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (_zzq_result) \ 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "b" (_zzq_ptr) \ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "r4", "cc", "memory"); \ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned int __addr; \ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR */ \ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 2,2,2\n\t" \ 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (__addr) \ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "cc", "memory" \ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR_GPR2 */ \ 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 4,4,4\n\t" \ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (__addr) \ 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "cc", "memory" \ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->r2 = __addr; \ 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* branch-and-link-to-noredir *%R11 */ \ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 3,3,3\n\t" 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_aix5 */ 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-aix5 ------------------------- */ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_aix5) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long int nraddr; /* where's the code? */ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long int r2; /* what tocptr do we need? */ 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OrigFn; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __SPECIAL_INSTRUCTION_PREAMBLE \ 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DO_CLIENT_REQUEST( \ 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval, _zzq_default, _zzq_request, \ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) \ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { unsigned long long int _zzq_args[7]; \ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int _zzq_result; \ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int* _zzq_ptr; \ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[0] = (unsigned int long long)(_zzq_request); \ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_args[6] = (unsigned int long long)(_zzq_default); \ 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_ptr = _zzq_args; \ 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile("mr 4,%1\n\t" \ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 48(4)\n\t" \ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = client_request ( %R4 ) */ \ 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 1,1,1\n\t" \ 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (_zzq_result) \ 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "b" (_zzq_ptr) \ 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "r4", "cc", "memory"); \ 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_rlval = _zzq_result; \ 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register unsigned long long int __addr; \ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR */ \ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 2,2,2\n\t" \ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (__addr) \ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "cc", "memory" \ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->nraddr = __addr; \ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* %R3 = guest_NRADDR_GPR2 */ \ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 4,4,4\n\t" \ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "=b" (__addr) \ 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : \ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : "r3", "cc", "memory" \ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _zzq_orig->r2 = __addr; \ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __SPECIAL_INSTRUCTION_PREAMBLE \ 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* branch-and-link-to-noredir *%R11 */ \ 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "or 3,3,3\n\t" 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_aix5 */ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Insert assembly code for other platforms here... */ 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NVALGRIND */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ugly. It's the least-worst tradeoff I can think of. */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This section defines magic (a.k.a appalling-hack) macros for doing 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guaranteed-no-redirection macros, so as to get from function 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrappers to the functions they are wrapping. The whole point is to 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) construct standard call sequences, but to do the call itself with a 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) special no-redirect call pseudo-instruction that the JIT 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) understands and handles specially. This section is long and 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repetitious, and I can't see a way to make it shorter. 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The naming scheme is as follows: 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'W' stands for "word" and 'v' for "void". Hence there are 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) different macros for calling arity 0, 1, 2, 3, 4, etc, functions, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and for each, the possibility of returning a word-typed result, or 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no result. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Use these to write the name of your wrapper. NOTE: duplicates 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _vgwZU_##soname##_##fnname 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _vgwZZ_##soname##_##fnname 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Use this macro from within a wrapper function to collect the 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context (address and possibly other info) of the original function. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Once you have that you can then use it in one of the CALL_FN_ 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) macros. The type of the argument _lval is OrigFn. */ 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Derivatives of the main macros below, for calling functions 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returning void. */ 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_v(fnptr) \ 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { volatile unsigned long _junk; \ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_FN_W_v(_junk,fnptr); } while (0) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_W(fnptr, arg1) \ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { volatile unsigned long _junk; \ 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_FN_W_W(_junk,fnptr,arg1); } while (0) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_WW(fnptr, arg1,arg2) \ 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { volatile unsigned long _junk; \ 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { volatile unsigned long _junk; \ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------- x86-linux ------------------------- */ 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_x86_linux) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. No need to mention eax 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) as gcc can already see that, plus causes gcc to bomb. */ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long) == 4. */ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[1]; \ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[2]; \ 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $4, %%esp\n" \ 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3]; \ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $8, %%esp\n" \ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[4]; \ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $12, %%esp\n" \ 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[5]; \ 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $16, %%esp\n" \ 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[6]; \ 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $20, %%esp\n" \ 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[7]; \ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $24, %%esp\n" \ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[8]; \ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $28, %%esp\n" \ 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[9]; \ 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 32(%%eax)\n\t" \ 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $32, %%esp\n" \ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[10]; \ 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 36(%%eax)\n\t" \ 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 32(%%eax)\n\t" \ 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $36, %%esp\n" \ 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[11]; \ 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 40(%%eax)\n\t" \ 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 36(%%eax)\n\t" \ 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 32(%%eax)\n\t" \ 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $40, %%esp\n" \ 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg6,arg7,arg8,arg9,arg10, \ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg11) \ 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[12]; \ 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)(arg11); \ 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 44(%%eax)\n\t" \ 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 40(%%eax)\n\t" \ 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 36(%%eax)\n\t" \ 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 32(%%eax)\n\t" \ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $44, %%esp\n" \ 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg6,arg7,arg8,arg9,arg10, \ 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg11,arg12) \ 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[13]; \ 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)(arg11); \ 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[12] = (unsigned long)(arg12); \ 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 48(%%eax)\n\t" \ 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 44(%%eax)\n\t" \ 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 40(%%eax)\n\t" \ 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 36(%%eax)\n\t" \ 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 32(%%eax)\n\t" \ 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 28(%%eax)\n\t" \ 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 24(%%eax)\n\t" \ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 20(%%eax)\n\t" \ 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 16(%%eax)\n\t" \ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 12(%%eax)\n\t" \ 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 8(%%eax)\n\t" \ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushl 4(%%eax)\n\t" \ 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movl (%%eax), %%eax\n\t" /* target->%eax */ \ 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_EAX \ 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addl $48, %%esp\n" \ 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_x86_linux */ 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ amd64-linux ------------------------ */ 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_amd64_linux) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */ 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "rdi", "r8", "r9", "r10", "r11" 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long) == 8. */ 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) macros. In order not to trash the stack redzone, we need to drop 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) %rsp by 128 before the hidden call, and restore afterwards. The 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nastyness is that it is only by luck that the stack still appears 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to be unwindable during the hidden call - since then the behaviour 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) of any routine using this macro does not match what the CFI data 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) says. Sigh. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Why is this important? Imagine that a wrapper has a stack 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocated local, and passes to the hidden call, a pointer to it. 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Because gcc does not know about the hidden call, it may allocate 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) that local in the redzone. Unfortunately the hidden call may then 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) trash it before it comes to use it. So we must step clear of the 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redzone, for the duration of the hidden call, to make it safe. 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Probably the same problem afflicts the other redzone-style ABIs too 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self describing (none of this CFI nonsense) so at least messing 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with the stack pointer doesn't give a danger of non-unwindable 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stack. */ 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[1]; \ 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[2]; \ 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3]; \ 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[4]; \ 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[5]; \ 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[6]; \ 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[7]; \ 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[8]; \ 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $8, %%rsp\n" \ 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[9]; \ 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 64(%%rax)\n\t" \ 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $16, %%rsp\n" \ 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[10]; \ 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 72(%%rax)\n\t" \ 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 64(%%rax)\n\t" \ 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $24, %%rsp\n" \ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[11]; \ 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 80(%%rax)\n\t" \ 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 72(%%rax)\n\t" \ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 64(%%rax)\n\t" \ 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $32, %%rsp\n" \ 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11) \ 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[12]; \ 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)(arg11); \ 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 88(%%rax)\n\t" \ 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 80(%%rax)\n\t" \ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 72(%%rax)\n\t" \ 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 64(%%rax)\n\t" \ 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $40, %%rsp\n" \ 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11,arg12) \ 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[13]; \ 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)(arg1); \ 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)(arg2); \ 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)(arg3); \ 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)(arg4); \ 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)(arg5); \ 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)(arg6); \ 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)(arg7); \ 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)(arg8); \ 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)(arg9); \ 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)(arg10); \ 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)(arg11); \ 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[12] = (unsigned long)(arg12); \ 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "subq $128,%%rsp\n\t" \ 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 96(%%rax)\n\t" \ 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 88(%%rax)\n\t" \ 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 80(%%rax)\n\t" \ 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 72(%%rax)\n\t" \ 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 64(%%rax)\n\t" \ 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "pushq 56(%%rax)\n\t" \ 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 48(%%rax), %%r9\n\t" \ 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 40(%%rax), %%r8\n\t" \ 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 32(%%rax), %%rcx\n\t" \ 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 24(%%rax), %%rdx\n\t" \ 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 16(%%rax), %%rsi\n\t" \ 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq 8(%%rax), %%rdi\n\t" \ 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "movq (%%rax), %%rax\n\t" /* target->%rax */ \ 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_CALL_NOREDIR_RAX \ 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $48, %%rsp\n" \ 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addq $128,%%rsp\n\t" \ 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=a" (_res) \ 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "a" (&_argvec[0]) \ 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_amd64_linux */ 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-linux ------------------------ */ 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_linux) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This is useful for finding out about the on-stack stuff: 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int f9 ( int,int,int,int,int,int,int,int,int ); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int f10 ( int,int,int,int,int,int,int,int,int,int ); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int g9 ( void ) { 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f9(11,22,33,44,55,66,77,88,99); 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int g10 ( void ) { 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f10(11,22,33,44,55,66,77,88,99,110); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int g11 ( void ) { 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f11(11,22,33,44,55,66,77,88,99,110,121); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int g12 ( void ) { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f12(11,22,33,44,55,66,77,88,99,110,121,132); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */ 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS \ 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lr", "ctr", "xer", \ 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r11", "r12", "r13" 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc32-linux, 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(unsigned long) == 4. */ 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[1]; \ 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[2]; \ 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3]; \ 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[4]; \ 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[5]; \ 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[6]; \ 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[7]; \ 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[8]; \ 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[9]; \ 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)arg8; \ 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[10]; \ 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)arg8; \ 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)arg9; \ 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-16\n\t" \ 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,8(1)\n\t" \ 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,16\n\t" \ 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[11]; \ 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)arg8; \ 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)arg9; \ 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)arg10; \ 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-16\n\t" \ 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,12(1)\n\t" \ 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,8(1)\n\t" \ 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,16\n\t" \ 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11) \ 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[12]; \ 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)arg8; \ 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)arg9; \ 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)arg10; \ 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)arg11; \ 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-32\n\t" \ 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,44(11)\n\t" \ 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,16(1)\n\t" \ 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,12(1)\n\t" \ 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,8(1)\n\t" \ 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,32\n\t" \ 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11,arg12) \ 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[13]; \ 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[0] = (unsigned long)_orig.nraddr; \ 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)arg1; \ 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)arg2; \ 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[3] = (unsigned long)arg3; \ 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[4] = (unsigned long)arg4; \ 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[5] = (unsigned long)arg5; \ 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[6] = (unsigned long)arg6; \ 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[7] = (unsigned long)arg7; \ 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[8] = (unsigned long)arg8; \ 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[9] = (unsigned long)arg9; \ 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[10] = (unsigned long)arg10; \ 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[11] = (unsigned long)arg11; \ 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[12] = (unsigned long)arg12; \ 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-32\n\t" \ 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg12 */ \ 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,48(11)\n\t" \ 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,20(1)\n\t" \ 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,44(11)\n\t" \ 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,16(1)\n\t" \ 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,12(1)\n\t" \ 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,8(1)\n\t" \ 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,4(11)\n\t" /* arg1->r3 */ \ 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4,8(11)\n\t" \ 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5,12(11)\n\t" \ 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6,16(11)\n\t" /* arg4->r6 */ \ 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7,20(11)\n\t" \ 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8,24(11)\n\t" \ 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9,28(11)\n\t" \ 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10,32(11)\n\t" /* arg8->r10 */ \ 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11,0(11)\n\t" /* target->r11 */ \ 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,32\n\t" \ 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3" \ 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[0]) \ 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_linux */ 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-linux ------------------------ */ 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_linux) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */ 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS \ 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lr", "ctr", "xer", \ 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r11", "r12", "r13" 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long) == 8. */ 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+0]; \ 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+1]; \ 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+2]; \ 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+3]; \ 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+4]; \ 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+5]; \ 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+6]; \ 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+7]; \ 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+8]; \ 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)" /* restore tocptr */ \ 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+9]; \ 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-128\n\t" /* expand stack frame */ \ 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,128" /* restore frame */ \ 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+10]; \ 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-128\n\t" /* expand stack frame */ \ 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,128" /* restore frame */ \ 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11) \ 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+11]; \ 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-144\n\t" /* expand stack frame */ \ 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,88(11)\n\t" \ 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,128(1)\n\t" \ 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,144" /* restore frame */ \ 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11,arg12) \ 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+12]; \ 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+12] = (unsigned long)arg12; \ 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-144\n\t" /* expand stack frame */ \ 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg12 */ \ 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,96(11)\n\t" \ 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,136(1)\n\t" \ 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,88(11)\n\t" \ 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,128(1)\n\t" \ 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,144" /* restore frame */ \ 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_linux */ 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc32-aix5 ------------------------- */ 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc32_aix5) 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */ 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS \ 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lr", "ctr", "xer", \ 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r11", "r12", "r13" 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Expand the stack frame, copying enough info that unwinding 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) still works. Trashes r3. */ 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-" #_n_fr "\n\t" \ 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3," #_n_fr "(1)\n\t" \ 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,0(1)\n\t" 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_CONTRACT_FRAME_BY(_n_fr) \ 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1," #_n_fr "\n\t" 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long) == 4. */ 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+0]; \ 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+1]; \ 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+2]; \ 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+3]; \ 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+4]; \ 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+5]; \ 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+6]; \ 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+7]; \ 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+8]; \ 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+9]; \ 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(64) \ 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,56(1)\n\t" \ 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(64) \ 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+10]; \ 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(64) \ 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,60(1)\n\t" \ 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,56(1)\n\t" \ 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(64) \ 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11) \ 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+11]; \ 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(72) \ 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,44(11)\n\t" \ 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,64(1)\n\t" \ 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,60(1)\n\t" \ 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,56(1)\n\t" \ 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(72) \ 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11,arg12) \ 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+12]; \ 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+12] = (unsigned long)arg12; \ 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 2,-8(11)\n\t" /* save tocptr */ \ 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(72) \ 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg12 */ \ 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,48(11)\n\t" \ 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,68(1)\n\t" \ 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,44(11)\n\t" \ 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,64(1)\n\t" \ 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,40(11)\n\t" \ 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,60(1)\n\t" \ 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3,36(11)\n\t" \ 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "stw 3,56(1)\n\t" \ 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 11, 0(11)\n\t" /* target->r11 */ \ 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lwz 2,-8(11)\n\t" /* restore tocptr */ \ 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(72) \ 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc32_aix5 */ 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------ ppc64-aix5 ------------------------- */ 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PLAT_ppc64_aix5) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These regs are trashed by the hidden call. */ 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __CALLER_SAVED_REGS \ 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "lr", "ctr", "xer", \ 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "r11", "r12", "r13" 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Expand the stack frame, copying enough info that unwinding 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) still works. Trashes r3. */ 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1,-" #_n_fr "\n\t" \ 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3," #_n_fr "(1)\n\t" \ 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,0(1)\n\t" 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_CONTRACT_FRAME_BY(_n_fr) \ 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "addi 1,1," #_n_fr "\n\t" 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long) == 8. */ 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_v(lval, orig) \ 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+0]; \ 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_W(lval, orig, arg1) \ 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+1]; \ 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+2]; \ 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+3]; \ 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+4]; \ 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+5]; \ 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+6]; \ 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7) \ 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+7]; \ 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8) \ 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+8]; \ 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9) \ 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+9]; \ 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(128) \ 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(128) \ 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10) \ 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+10]; \ 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(128) \ 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(128) \ 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11) \ 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+11]; \ 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(144) \ 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,88(11)\n\t" \ 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,128(1)\n\t" \ 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(144) \ 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg7,arg8,arg9,arg10,arg11,arg12) \ 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { \ 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile OrigFn _orig = (orig); \ 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _argvec[3+12]; \ 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile unsigned long _res; \ 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* _argvec[0] holds current r2 across the call */ \ 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[1] = (unsigned long)_orig.r2; \ 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2] = (unsigned long)_orig.nraddr; \ 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+1] = (unsigned long)arg1; \ 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+2] = (unsigned long)arg2; \ 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+3] = (unsigned long)arg3; \ 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+4] = (unsigned long)arg4; \ 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+5] = (unsigned long)arg5; \ 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+6] = (unsigned long)arg6; \ 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+7] = (unsigned long)arg7; \ 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+8] = (unsigned long)arg8; \ 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+9] = (unsigned long)arg9; \ 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+10] = (unsigned long)arg10; \ 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+11] = (unsigned long)arg11; \ 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _argvec[2+12] = (unsigned long)arg12; \ 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __asm__ volatile( \ 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(512) \ 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 2,-16(11)\n\t" /* save tocptr */ \ 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_EXPAND_FRAME_BY_trashes_r3(144) \ 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg12 */ \ 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,96(11)\n\t" \ 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,136(1)\n\t" \ 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg11 */ \ 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,88(11)\n\t" \ 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,128(1)\n\t" \ 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg10 */ \ 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,80(11)\n\t" \ 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,120(1)\n\t" \ 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* arg9 */ \ 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3,72(11)\n\t" \ 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "std 3,112(1)\n\t" \ 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* args1-8 */ \ 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 3, 8(11)\n\t" /* arg1->r3 */ \ 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 4, 16(11)\n\t" /* arg2->r4 */ \ 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 5, 24(11)\n\t" /* arg3->r5 */ \ 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 6, 32(11)\n\t" /* arg4->r6 */ \ 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 7, 40(11)\n\t" /* arg5->r7 */ \ 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 8, 48(11)\n\t" /* arg6->r8 */ \ 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 9, 56(11)\n\t" /* arg7->r9 */ \ 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 10, 64(11)\n\t" /* arg8->r10 */ \ 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 11, 0(11)\n\t" /* target->r11 */ \ 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr 11,%1\n\t" \ 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "mr %0,3\n\t" \ 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ld 2,-16(11)\n\t" /* restore tocptr */ \ 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(144) \ 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_CONTRACT_FRAME_BY(512) \ 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*out*/ "=r" (_res) \ 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*in*/ "r" (&_argvec[2]) \ 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); \ 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lval = (__typeof__(lval)) _res; \ 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (0) 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PLAT_ppc64_aix5 */ 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* */ 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ------------------------------------------------------------------ */ 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Some request codes. There are many more of these, but most are not 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exposed to end-user view. These are the public ones, all of the 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form 0x1000 + small_number. 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Core ones are in the range 0x00000000--0x0000ffff. The non-public 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ones start at 0x2000. 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These macros are used by tools -- they must be public, but don't 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) embed them into other programs. */ 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_USERREQ_TOOL_BASE(a,b) \ 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VG_IS_TOOL_USERREQ(a, b, v) \ 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This enum comprises an ABI exported by Valgrind to programs 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) which use client requests. DO NOT CHANGE THE ORDER OF THESE 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ENTRIES, NOR DELETE ANY -- add new ones at the end. */ 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* These allow any function to be called from the simulated 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPU but run on the real CPU. Nb: the first arg passed to 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the function is always the ThreadId of the running 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread! So CLIENT_CALL0 actually requires a 1 arg 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function, etc. */ 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL0 = 0x1101, 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL1 = 0x1102, 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL2 = 0x1103, 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL3 = 0x1104, 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Can be useful in regression testing suites -- eg. can 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send Valgrind's output to /dev/null and still count 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors. */ 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__COUNT_ERRORS = 0x1201, 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* These are useful and can be interpreted by any tool that 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracks malloc() et al, by using vg_replace_malloc.c. */ 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__FREELIKE_BLOCK = 0x1302, 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Memory pool support. */ 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CREATE_MEMPOOL = 0x1303, 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__DESTROY_MEMPOOL = 0x1304, 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_ALLOC = 0x1305, 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_FREE = 0x1306, 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_TRIM = 0x1307, 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MOVE_MEMPOOL = 0x1308, 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_CHANGE = 0x1309, 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_EXISTS = 0x130a, 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allow printfs to valgrind log. */ 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__PRINTF = 0x1401, 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__PRINTF_BACKTRACE = 0x1402, 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Stack support. */ 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_REGISTER = 0x1501, 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_DEREGISTER = 0x1502, 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_CHANGE = 0x1503 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } Vg_ClientRequest; 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(__GNUC__) 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define __extension__ /* */ 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Returns the number of Valgrinds this code is running under. That 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is, 0 if running natively, 1 if running under Valgrind, 2 if 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) running under Valgrind which is running under another Valgrind, 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) etc. */ 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RUNNING_ON_VALGRIND __extension__ \ 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned int _qzz_res; \ 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 /* if not */, \ 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__RUNNING_ON_VALGRIND, \ 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, 0); \ 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qzz_res; \ 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Discard translation of code in the range [_qzz_addr .. _qzz_addr + 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qzz_len - 1]. Useful if you are debugging a JITter or some such, 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) since it provides a way to make sure valgrind will retranslate the 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidated area. Returns no value. */ 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__DISCARD_TRANSLATIONS, \ 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qzz_addr, _qzz_len, 0, 0, 0); \ 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These requests are for getting Valgrind itself to print something. 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Possibly with a backtrace. This is a really ugly hack. */ 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NVALGRIND) 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define VALGRIND_PRINTF(...) 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define VALGRIND_PRINTF_BACKTRACE(...) 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* NVALGRIND */ 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Modern GCC will optimize the static routine out if unused, 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and unused attribute will shut down warnings about it. */ 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int VALGRIND_PRINTF(const char *format, ...) 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __attribute__((format(__printf__, 1, 2), __unused__)); 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VALGRIND_PRINTF(const char *format, ...) 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long _qzz_res; 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list vargs; 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(vargs, format); 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF, 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unsigned long)format, (unsigned long)vargs, 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0); 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(vargs); 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)_qzz_res; 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __attribute__((format(__printf__, 1, 2), __unused__)); 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VALGRIND_PRINTF_BACKTRACE(const char *format, ...) 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long _qzz_res; 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list vargs; 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(vargs, format); 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE, 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unsigned long)format, (unsigned long)vargs, 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0); 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(vargs); 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (int)_qzz_res; 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NVALGRIND */ 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* These requests allow control to move from the simulated CPU to the 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) real CPU, calling an arbitary function. 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that the current ThreadId is inserted as the first argument. 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) So this call: 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requires f to have this signature: 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Word f(Word tid, Word arg1, Word arg2) 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) where "Word" is a word-sized type. 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Note that these client requests are not entirely reliable. For example, 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if you call a function with them that subsequently calls printf(), 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) there's a high chance Valgrind will crash. Generally, your prospects of 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) these working are made higher if the called function does not refer to 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) any global variables, and does not refer to any libc or other functions 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (printf et al). Any kind of entanglement with libc or dynamic linking is 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) likely to have a bad outcome, for tricky reasons which we've grappled 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with a lot in the past. 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __extension__ \ 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned long _qyy_res; \ 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL0, \ 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_fn, \ 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0); \ 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_res; \ 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __extension__ \ 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned long _qyy_res; \ 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL1, \ 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_fn, \ 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_arg1, 0, 0, 0); \ 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_res; \ 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __extension__ \ 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned long _qyy_res; \ 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL2, \ 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_fn, \ 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_arg1, _qyy_arg2, 0, 0); \ 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_res; \ 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __extension__ \ 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned long _qyy_res; \ 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CLIENT_CALL3, \ 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_fn, \ 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_arg1, _qyy_arg2, \ 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_arg3, 0); \ 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_res; \ 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counts the number of errors that have been recorded by a tool. Nb: 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the tool must record the errors with VG_(maybe_record_error)() or 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_(unique_error)() for them to be counted. */ 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_COUNT_ERRORS \ 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __extension__ \ 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned int _qyy_res; \ 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__COUNT_ERRORS, \ 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, 0); \ 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qyy_res; \ 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a block of memory as having been allocated by a malloc()-like 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function. `addr' is the start of the usable block (ie. after any 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redzone) `rzB' is redzone size if the allocator can apply redzones; 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use '0' if not. Adding redzones makes it more likely Valgrind will spot 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block overruns. `is_zeroed' indicates if the memory is zeroed, as it is 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for calloc(). Put it immediately after the point where a block is 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocated. 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) If you're using Memcheck: If you're allocating memory via superblocks, 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and then handing out small chunks of each superblock, if you don't have 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redzones on your small blocks, it's worth marking the superblock with 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_MAKE_MEM_NOACCESS when it's created, so that block overruns are 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detected. But if you can put redzones on, it's probably better to not do 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, so that messages for small overruns are described in terms of the 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) small block rather than the superblock (but if you have a big overrun 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) that skips over a redzone, you could miss an error this way). See 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcheck/tests/custom_alloc.c for an example. 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WARNING: if your allocator uses malloc() or 'new' to allocate 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) superblocks, rather than mmap() or brk(), this will not work properly -- 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) you'll likely get assertion failures during leak detection. This is 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) because Valgrind doesn't like seeing overlapping heap blocks. Sorry. 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Nb: block must be freed via a free()-like function specified 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */ 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MALLOCLIKE_BLOCK, \ 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr, sizeB, rzB, is_zeroed, 0); \ 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a block of memory as having been freed by a free()-like function. 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) `rzB' is redzone size; it must match that given to 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_MALLOCLIKE_BLOCK. Memory not freed will be detected by the leak 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checker. Put it immediately after the point where the block is freed. */ 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__FREELIKE_BLOCK, \ 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr, rzB, 0, 0, 0); \ 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Create a memory pool. */ 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__CREATE_MEMPOOL, \ 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, rzB, is_zeroed, 0, 0); \ 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Destroy a memory pool. */ 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_DESTROY_MEMPOOL(pool) \ 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__DESTROY_MEMPOOL, \ 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, 0, 0, 0, 0); \ 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Associate a piece of memory with a memory pool. */ 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_ALLOC, \ 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, addr, size, 0, 0); \ 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Disassociate a piece of memory from a memory pool. */ 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_FREE(pool, addr) \ 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_FREE, \ 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, addr, 0, 0, 0); \ 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Disassociate any pieces outside a particular range. */ 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_TRIM, \ 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, addr, size, 0, 0); \ 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Resize and/or move a piece associated with a memory pool. */ 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MOVE_MEMPOOL, \ 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) poolA, poolB, 0, 0, 0); \ 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Resize and/or move a piece associated with a memory pool. */ 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_CHANGE, \ 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, addrA, addrB, size, 0); \ 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Return 1 if a mempool exists, else 0. */ 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_MEMPOOL_EXISTS(pool) \ 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned int _qzz_res; \ 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__MEMPOOL_EXISTS, \ 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool, 0, 0, 0, 0); \ 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qzz_res; \ 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Mark a piece of memory as being a stack. Returns a stack id. */ 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_REGISTER(start, end) \ 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ({unsigned int _qzz_res; \ 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_REGISTER, \ 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start, end, 0, 0, 0); \ 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _qzz_res; \ 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }) 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Unmark the piece of memory associated with a stack id as being a 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stack. */ 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_DEREGISTER(id) \ 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_DEREGISTER, \ 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 0, 0, 0, 0); \ 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Change the start and end address of the stack id. */ 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALGRIND_STACK_CHANGE(id, start, end) \ 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {unsigned int _qzz_res; \ 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VG_USERREQ__STACK_CHANGE, \ 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, start, end, 0, 0); \ 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_x86_linux 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_amd64_linux 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_linux 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_linux 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc32_aix5 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PLAT_ppc64_aix5 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* __VALGRIND_H */ 3925