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