Mercurial > pidgin
annotate libpurple/valgrind.h @ 30838:f86ebed1930a
Send buffer data when the message is not a xfer.
author | masca@cpw.pidgin.im |
---|---|
date | Thu, 01 Jul 2010 00:53:28 +0000 |
parents | c1314a6cefcf |
children |
rev | line source |
---|---|
27711
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1 /* -*- c -*- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2 ---------------------------------------------------------------- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
4 Notice that the following BSD-style license applies to this one |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
5 file (valgrind.h) only. The rest of Valgrind is licensed under the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
6 terms of the GNU General Public License, version 2, unless |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
7 otherwise indicated. See the COPYING file in the source |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
8 distribution for details. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
9 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
10 ---------------------------------------------------------------- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
11 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
12 This file is part of Valgrind, a dynamic binary instrumentation |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
13 framework. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
14 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
15 Copyright (C) 2000-2008 Julian Seward. All rights reserved. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
16 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
17 Redistribution and use in source and binary forms, with or without |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
18 modification, are permitted provided that the following conditions |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
19 are met: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
20 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
21 1. Redistributions of source code must retain the above copyright |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
22 notice, this list of conditions and the following disclaimer. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
23 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
24 2. The origin of this software must not be misrepresented; you must |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
25 not claim that you wrote the original software. If you use this |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
26 software in a product, an acknowledgment in the product |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
27 documentation would be appreciated but is not required. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
28 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
29 3. Altered source versions must be plainly marked as such, and must |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
30 not be misrepresented as being the original software. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
31 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
32 4. The name of the author may not be used to endorse or promote |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
33 products derived from this software without specific prior written |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
34 permission. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
35 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
36 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
37 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
38 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
39 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
40 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
41 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
42 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
43 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
44 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
45 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
46 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
47 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
48 ---------------------------------------------------------------- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
49 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
50 Notice that the above BSD-style license applies to this one file |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
51 (valgrind.h) only. The entire rest of Valgrind is licensed under |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
52 the terms of the GNU General Public License, version 2. See the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
53 COPYING file in the source distribution for details. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
54 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
55 ---------------------------------------------------------------- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
56 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
57 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
58 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
59 /* This file is for inclusion into client (your!) code. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
60 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
61 You can use these macros to manipulate and query Valgrind's |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
62 execution inside your own programs. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
63 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
64 The resulting executables will still run without Valgrind, just a |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
65 little bit more slowly than they otherwise would, but otherwise |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
66 unchanged. When not running on valgrind, each client request |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
67 consumes very few (eg. 7) instructions, so the resulting performance |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
68 loss is negligible unless you plan to execute client requests |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
69 millions of times per second. Nevertheless, if that is still a |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
70 problem, you can compile with the NVALGRIND symbol defined (gcc |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
71 -DNVALGRIND) so that client requests are not even compiled in. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
72 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
73 #ifndef __VALGRIND_H |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
74 #define __VALGRIND_H |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
75 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
76 #include <stdarg.h> |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
77 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
78 /* Nb: this file might be included in a file compiled with -ansi. So |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
79 we can't use C++ style "//" comments nor the "asm" keyword (instead |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
80 use "__asm__"). */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
81 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
82 /* Derive some tags indicating what the target platform is. Note |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
83 that in this file we're using the compiler's CPP symbols for |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
84 identifying architectures, which are different to the ones we use |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
85 within the rest of Valgrind. Note, __powerpc__ is active for both |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
86 32 and 64-bit PPC, whereas __powerpc64__ is only active for the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
87 latter (on Linux, that is). */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
88 #undef PLAT_x86_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
89 #undef PLAT_amd64_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
90 #undef PLAT_ppc32_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
91 #undef PLAT_ppc64_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
92 #undef PLAT_ppc32_aix5 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
93 #undef PLAT_ppc64_aix5 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
94 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
95 #if !defined(_AIX) && defined(__i386__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
96 # define PLAT_x86_linux 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
97 #elif !defined(_AIX) && defined(__x86_64__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
98 # define PLAT_amd64_linux 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
99 #elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
100 # define PLAT_ppc32_linux 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
101 #elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
102 # define PLAT_ppc64_linux 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
103 #elif defined(_AIX) && defined(__64BIT__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
104 # define PLAT_ppc64_aix5 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
105 #elif defined(_AIX) && !defined(__64BIT__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
106 # define PLAT_ppc32_aix5 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
107 #endif |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
108 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
109 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
110 /* If we're not compiling for our target platform, don't generate |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
111 any inline asms. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
112 #if !defined(PLAT_x86_linux) && !defined(PLAT_amd64_linux) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
113 && !defined(PLAT_ppc32_linux) && !defined(PLAT_ppc64_linux) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
114 && !defined(PLAT_ppc32_aix5) && !defined(PLAT_ppc64_aix5) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
115 # if !defined(NVALGRIND) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
116 # define NVALGRIND 1 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
117 # endif |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
118 #endif |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
119 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
120 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
121 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
122 /* ARCHITECTURE SPECIFICS for SPECIAL INSTRUCTIONS. There is nothing */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
123 /* in here of use to end-users -- skip to the next section. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
124 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
125 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
126 #if defined(NVALGRIND) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
127 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
128 /* Define NVALGRIND to completely remove the Valgrind magic sequence |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
129 from the compiled code (analogous to NDEBUG's effects on |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
130 assert()) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
131 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
132 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
133 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
134 { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
135 (_zzq_rlval) = (_zzq_default); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
136 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
137 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
138 #else /* ! NVALGRIND */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
139 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
140 /* The following defines the magic code sequences which the JITter |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
141 spots and handles magically. Don't look too closely at them as |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
142 they will rot your brain. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
143 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
144 The assembly code sequences for all architectures is in this one |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
145 file. This is because this file must be stand-alone, and we don't |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
146 want to have multiple files. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
147 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
148 For VALGRIND_DO_CLIENT_REQUEST, we must ensure that the default |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
149 value gets put in the return slot, so that everything works when |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
150 this is executed not under Valgrind. Args are passed in a memory |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
151 block, and so there's no intrinsic limit to the number that could |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
152 be passed, but it's currently five. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
153 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
154 The macro args are: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
155 _zzq_rlval result lvalue |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
156 _zzq_default default value (result returned when running on real CPU) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
157 _zzq_request request code |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
158 _zzq_arg1..5 request params |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
159 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
160 The other two macros are used to support function wrapping, and are |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
161 a lot simpler. VALGRIND_GET_NR_CONTEXT returns the value of the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
162 guest's NRADDR pseudo-register and whatever other information is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
163 needed to safely run the call original from the wrapper: on |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
164 ppc64-linux, the R2 value at the divert point is also needed. This |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
165 information is abstracted into a user-visible type, OrigFn. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
166 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
167 VALGRIND_CALL_NOREDIR_* behaves the same as the following on the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
168 guest, but guarantees that the branch instruction will not be |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
169 redirected: x86: call *%eax, amd64: call *%rax, ppc32/ppc64: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
170 branch-and-link-to-r11. VALGRIND_CALL_NOREDIR is just text, not a |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
171 complete inline asm, since it needs to be combined with more magic |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
172 inline asm stuff to be useful. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
173 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
174 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
175 /* ------------------------- x86-linux ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
176 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
177 #if defined(PLAT_x86_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
178 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
179 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
180 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
181 unsigned int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
182 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
183 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
184 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
185 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
186 "roll $3, %%edi ; roll $13, %%edi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
187 "roll $29, %%edi ; roll $19, %%edi\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
188 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
189 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
190 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
191 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
192 { volatile unsigned int _zzq_args[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
193 volatile unsigned int _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
194 _zzq_args[0] = (unsigned int)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
195 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
196 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
197 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
198 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
199 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
200 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
201 /* %EDX = client_request ( %EAX ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
202 "xchgl %%ebx,%%ebx" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
203 : "=d" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
204 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
205 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
206 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
207 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
208 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
209 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
210 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
211 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
212 volatile unsigned int __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
213 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
214 /* %EAX = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
215 "xchgl %%ecx,%%ecx" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
216 : "=a" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
217 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
218 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
219 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
220 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
221 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
222 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
223 #define VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
224 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
225 /* call-noredir *%EAX */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
226 "xchgl %%edx,%%edx\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
227 #endif /* PLAT_x86_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
228 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
229 /* ------------------------ amd64-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
230 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
231 #if defined(PLAT_amd64_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
232 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
233 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
234 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
235 unsigned long long int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
236 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
237 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
238 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
239 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
240 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
241 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
242 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
243 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
244 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
245 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
246 { volatile unsigned long long int _zzq_args[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
247 volatile unsigned long long int _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
248 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
249 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
250 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
251 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
252 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
253 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
254 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
255 /* %RDX = client_request ( %RAX ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
256 "xchgq %%rbx,%%rbx" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
257 : "=d" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
258 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
259 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
260 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
261 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
262 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
263 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
264 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
265 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
266 volatile unsigned long long int __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
267 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
268 /* %RAX = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
269 "xchgq %%rcx,%%rcx" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
270 : "=a" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
271 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
272 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
273 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
274 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
275 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
276 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
277 #define VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
278 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
279 /* call-noredir *%RAX */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
280 "xchgq %%rdx,%%rdx\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
281 #endif /* PLAT_amd64_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
282 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
283 /* ------------------------ ppc32-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
284 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
285 #if defined(PLAT_ppc32_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
286 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
287 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
288 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
289 unsigned int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
290 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
291 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
292 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
293 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
294 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
295 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
296 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
297 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
298 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
299 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
300 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
301 { unsigned int _zzq_args[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
302 unsigned int _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
303 unsigned int* _zzq_ptr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
304 _zzq_args[0] = (unsigned int)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
305 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
306 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
307 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
308 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
309 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
310 _zzq_ptr = _zzq_args; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
311 __asm__ volatile("mr 3,%1\n\t" /*default*/ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
312 "mr 4,%2\n\t" /*ptr*/ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
313 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
314 /* %R3 = client_request ( %R4 ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
315 "or 1,1,1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
316 "mr %0,3" /*result*/ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
317 : "=b" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
318 : "b" (_zzq_default), "b" (_zzq_ptr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
319 : "cc", "memory", "r3", "r4"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
320 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
321 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
322 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
323 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
324 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
325 unsigned int __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
326 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
327 /* %R3 = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
328 "or 2,2,2\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
329 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
330 : "=b" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
331 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
332 : "cc", "memory", "r3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
333 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
334 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
335 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
336 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
337 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
338 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
339 /* branch-and-link-to-noredir *%R11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
340 "or 3,3,3\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
341 #endif /* PLAT_ppc32_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
342 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
343 /* ------------------------ ppc64-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
344 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
345 #if defined(PLAT_ppc64_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
346 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
347 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
348 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
349 unsigned long long int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
350 unsigned long long int r2; /* what tocptr do we need? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
351 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
352 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
353 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
354 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
355 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
356 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
357 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
358 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
359 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
360 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
361 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
362 { unsigned long long int _zzq_args[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
363 register unsigned long long int _zzq_result __asm__("r3"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
364 register unsigned long long int* _zzq_ptr __asm__("r4"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
365 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
366 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
367 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
368 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
369 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
370 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
371 _zzq_ptr = _zzq_args; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
372 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
373 /* %R3 = client_request ( %R4 ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
374 "or 1,1,1" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
375 : "=r" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
376 : "0" (_zzq_default), "r" (_zzq_ptr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
377 : "cc", "memory"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
378 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
379 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
380 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
381 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
382 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
383 register unsigned long long int __addr __asm__("r3"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
384 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
385 /* %R3 = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
386 "or 2,2,2" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
387 : "=r" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
388 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
389 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
390 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
391 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
392 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
393 /* %R3 = guest_NRADDR_GPR2 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
394 "or 4,4,4" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
395 : "=r" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
396 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
397 : "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
398 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
399 _zzq_orig->r2 = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
400 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
401 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
402 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
403 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
404 /* branch-and-link-to-noredir *%R11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
405 "or 3,3,3\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
406 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
407 #endif /* PLAT_ppc64_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
408 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
409 /* ------------------------ ppc32-aix5 ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
410 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
411 #if defined(PLAT_ppc32_aix5) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
412 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
413 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
414 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
415 unsigned int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
416 unsigned int r2; /* what tocptr do we need? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
417 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
418 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
419 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
420 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
421 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
422 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
423 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
424 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
425 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
426 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
427 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
428 { unsigned int _zzq_args[7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
429 register unsigned int _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
430 register unsigned int* _zzq_ptr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
431 _zzq_args[0] = (unsigned int)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
432 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
433 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
434 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
435 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
436 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
437 _zzq_args[6] = (unsigned int)(_zzq_default); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
438 _zzq_ptr = _zzq_args; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
439 __asm__ volatile("mr 4,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
440 "lwz 3, 24(4)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
441 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
442 /* %R3 = client_request ( %R4 ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
443 "or 1,1,1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
444 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
445 : "=b" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
446 : "b" (_zzq_ptr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
447 : "r3", "r4", "cc", "memory"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
448 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
449 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
450 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
451 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
452 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
453 register unsigned int __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
454 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
455 /* %R3 = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
456 "or 2,2,2\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
457 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
458 : "=b" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
459 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
460 : "r3", "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
461 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
462 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
463 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
464 /* %R3 = guest_NRADDR_GPR2 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
465 "or 4,4,4\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
466 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
467 : "=b" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
468 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
469 : "r3", "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
470 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
471 _zzq_orig->r2 = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
472 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
473 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
474 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
475 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
476 /* branch-and-link-to-noredir *%R11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
477 "or 3,3,3\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
478 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
479 #endif /* PLAT_ppc32_aix5 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
480 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
481 /* ------------------------ ppc64-aix5 ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
482 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
483 #if defined(PLAT_ppc64_aix5) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
484 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
485 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
486 struct { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
487 unsigned long long int nraddr; /* where's the code? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
488 unsigned long long int r2; /* what tocptr do we need? */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
489 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
490 OrigFn; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
491 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
492 #define __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
493 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
494 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
495 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
496 #define VALGRIND_DO_CLIENT_REQUEST( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
497 _zzq_rlval, _zzq_default, _zzq_request, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
498 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
499 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
500 { unsigned long long int _zzq_args[7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
501 register unsigned long long int _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
502 register unsigned long long int* _zzq_ptr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
503 _zzq_args[0] = (unsigned int long long)(_zzq_request); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
504 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
505 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
506 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
507 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
508 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
509 _zzq_args[6] = (unsigned int long long)(_zzq_default); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
510 _zzq_ptr = _zzq_args; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
511 __asm__ volatile("mr 4,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
512 "ld 3, 48(4)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
513 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
514 /* %R3 = client_request ( %R4 ) */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
515 "or 1,1,1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
516 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
517 : "=b" (_zzq_result) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
518 : "b" (_zzq_ptr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
519 : "r3", "r4", "cc", "memory"); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
520 _zzq_rlval = _zzq_result; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
521 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
522 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
523 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
524 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
525 register unsigned long long int __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
526 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
527 /* %R3 = guest_NRADDR */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
528 "or 2,2,2\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
529 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
530 : "=b" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
531 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
532 : "r3", "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
533 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
534 _zzq_orig->nraddr = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
535 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
536 /* %R3 = guest_NRADDR_GPR2 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
537 "or 4,4,4\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
538 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
539 : "=b" (__addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
540 : \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
541 : "r3", "cc", "memory" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
542 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
543 _zzq_orig->r2 = __addr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
544 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
545 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
546 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
547 __SPECIAL_INSTRUCTION_PREAMBLE \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
548 /* branch-and-link-to-noredir *%R11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
549 "or 3,3,3\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
550 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
551 #endif /* PLAT_ppc64_aix5 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
552 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
553 /* Insert assembly code for other platforms here... */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
554 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
555 #endif /* NVALGRIND */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
556 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
557 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
558 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
559 /* PLATFORM SPECIFICS for FUNCTION WRAPPING. This is all very */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
560 /* ugly. It's the least-worst tradeoff I can think of. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
561 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
562 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
563 /* This section defines magic (a.k.a appalling-hack) macros for doing |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
564 guaranteed-no-redirection macros, so as to get from function |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
565 wrappers to the functions they are wrapping. The whole point is to |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
566 construct standard call sequences, but to do the call itself with a |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
567 special no-redirect call pseudo-instruction that the JIT |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
568 understands and handles specially. This section is long and |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
569 repetitious, and I can't see a way to make it shorter. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
570 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
571 The naming scheme is as follows: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
572 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
573 CALL_FN_{W,v}_{v,W,WW,WWW,WWWW,5W,6W,7W,etc} |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
574 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
575 'W' stands for "word" and 'v' for "void". Hence there are |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
576 different macros for calling arity 0, 1, 2, 3, 4, etc, functions, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
577 and for each, the possibility of returning a word-typed result, or |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
578 no result. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
579 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
580 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
581 /* Use these to write the name of your wrapper. NOTE: duplicates |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
582 VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
583 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
584 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
585 _vgwZU_##soname##_##fnname |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
586 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
587 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
588 _vgwZZ_##soname##_##fnname |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
589 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
590 /* Use this macro from within a wrapper function to collect the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
591 context (address and possibly other info) of the original function. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
592 Once you have that you can then use it in one of the CALL_FN_ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
593 macros. The type of the argument _lval is OrigFn. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
594 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
595 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
596 /* Derivatives of the main macros below, for calling functions |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
597 returning void. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
598 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
599 #define CALL_FN_v_v(fnptr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
600 do { volatile unsigned long _junk; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
601 CALL_FN_W_v(_junk,fnptr); } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
602 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
603 #define CALL_FN_v_W(fnptr, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
604 do { volatile unsigned long _junk; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
605 CALL_FN_W_W(_junk,fnptr,arg1); } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
606 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
607 #define CALL_FN_v_WW(fnptr, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
608 do { volatile unsigned long _junk; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
609 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
610 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
611 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
612 do { volatile unsigned long _junk; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
613 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
614 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
615 /* ------------------------- x86-linux ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
616 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
617 #if defined(PLAT_x86_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
618 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
619 /* These regs are trashed by the hidden call. No need to mention eax |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
620 as gcc can already see that, plus causes gcc to bomb. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
621 #define __CALLER_SAVED_REGS /*"eax"*/ "ecx", "edx" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
622 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
623 /* These CALL_FN_ macros assume that on x86-linux, sizeof(unsigned |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
624 long) == 4. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
625 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
626 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
627 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
628 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
629 volatile unsigned long _argvec[1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
630 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
631 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
632 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
633 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
634 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
635 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
636 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
637 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
638 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
639 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
640 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
641 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
642 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
643 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
644 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
645 volatile unsigned long _argvec[2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
646 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
647 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
648 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
649 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
650 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
651 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
652 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
653 "addl $4, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
654 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
655 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
656 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
657 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
658 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
659 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
660 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
661 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
662 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
663 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
664 volatile unsigned long _argvec[3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
665 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
666 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
667 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
668 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
669 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
670 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
671 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
672 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
673 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
674 "addl $8, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
675 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
676 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
677 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
678 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
679 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
680 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
681 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
682 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
683 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
684 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
685 volatile unsigned long _argvec[4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
686 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
687 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
688 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
689 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
690 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
691 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
692 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
693 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
694 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
695 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
696 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
697 "addl $12, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
698 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
699 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
700 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
701 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
702 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
703 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
704 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
705 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
706 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
707 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
708 volatile unsigned long _argvec[5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
709 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
710 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
711 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
712 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
713 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
714 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
715 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
716 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
717 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
718 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
719 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
720 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
721 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
722 "addl $16, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
723 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
724 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
725 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
726 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
727 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
728 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
729 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
730 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
731 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
732 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
733 volatile unsigned long _argvec[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
734 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
735 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
736 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
737 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
738 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
739 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
740 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
741 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
742 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
743 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
744 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
745 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
746 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
747 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
748 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
749 "addl $20, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
750 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
751 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
752 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
753 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
754 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
755 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
756 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
757 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
758 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
759 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
760 volatile unsigned long _argvec[7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
761 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
762 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
763 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
764 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
765 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
766 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
767 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
768 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
769 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
770 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
771 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
772 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
773 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
774 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
775 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
776 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
777 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
778 "addl $24, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
779 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
780 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
781 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
782 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
783 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
784 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
785 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
786 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
787 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
788 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
789 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
790 volatile unsigned long _argvec[8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
791 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
792 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
793 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
794 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
795 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
796 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
797 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
798 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
799 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
800 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
801 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
802 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
803 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
804 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
805 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
806 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
807 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
808 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
809 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
810 "addl $28, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
811 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
812 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
813 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
814 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
815 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
816 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
817 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
818 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
819 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
820 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
821 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
822 volatile unsigned long _argvec[9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
823 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
824 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
825 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
826 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
827 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
828 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
829 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
830 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
831 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
832 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
833 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
834 "pushl 32(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
835 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
836 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
837 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
838 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
839 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
840 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
841 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
842 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
843 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
844 "addl $32, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
845 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
846 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
847 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
848 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
849 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
850 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
851 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
852 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
853 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
854 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
855 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
856 volatile unsigned long _argvec[10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
857 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
858 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
859 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
860 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
861 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
862 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
863 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
864 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
865 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
866 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
867 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
868 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
869 "pushl 36(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
870 "pushl 32(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
871 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
872 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
873 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
874 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
875 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
876 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
877 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
878 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
879 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
880 "addl $36, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
881 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
882 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
883 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
884 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
885 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
886 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
887 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
888 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
889 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
890 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
891 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
892 volatile unsigned long _argvec[11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
893 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
894 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
895 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
896 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
897 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
898 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
899 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
900 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
901 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
902 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
903 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
904 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
905 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
906 "pushl 40(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
907 "pushl 36(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
908 "pushl 32(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
909 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
910 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
911 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
912 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
913 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
914 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
915 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
916 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
917 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
918 "addl $40, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
919 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
920 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
921 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
922 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
923 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
924 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
925 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
926 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
927 arg6,arg7,arg8,arg9,arg10, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
928 arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
929 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
930 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
931 volatile unsigned long _argvec[12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
932 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
933 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
934 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
935 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
936 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
937 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
938 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
939 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
940 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
941 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
942 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
943 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
944 _argvec[11] = (unsigned long)(arg11); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
945 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
946 "pushl 44(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
947 "pushl 40(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
948 "pushl 36(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
949 "pushl 32(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
950 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
951 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
952 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
953 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
954 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
955 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
956 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
957 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
958 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
959 "addl $44, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
960 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
961 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
962 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
963 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
964 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
965 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
966 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
967 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
968 arg6,arg7,arg8,arg9,arg10, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
969 arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
970 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
971 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
972 volatile unsigned long _argvec[13]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
973 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
974 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
975 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
976 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
977 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
978 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
979 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
980 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
981 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
982 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
983 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
984 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
985 _argvec[11] = (unsigned long)(arg11); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
986 _argvec[12] = (unsigned long)(arg12); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
987 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
988 "pushl 48(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
989 "pushl 44(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
990 "pushl 40(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
991 "pushl 36(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
992 "pushl 32(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
993 "pushl 28(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
994 "pushl 24(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
995 "pushl 20(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
996 "pushl 16(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
997 "pushl 12(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
998 "pushl 8(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
999 "pushl 4(%%eax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1000 "movl (%%eax), %%eax\n\t" /* target->%eax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1001 VALGRIND_CALL_NOREDIR_EAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1002 "addl $48, %%esp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1003 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1004 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1005 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1006 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1007 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1008 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1009 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1010 #endif /* PLAT_x86_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1011 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1012 /* ------------------------ amd64-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1013 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1014 #if defined(PLAT_amd64_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1015 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1016 /* ARGREGS: rdi rsi rdx rcx r8 r9 (the rest on stack in R-to-L order) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1017 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1018 /* These regs are trashed by the hidden call. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1019 #define __CALLER_SAVED_REGS /*"rax",*/ "rcx", "rdx", "rsi", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1020 "rdi", "r8", "r9", "r10", "r11" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1021 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1022 /* These CALL_FN_ macros assume that on amd64-linux, sizeof(unsigned |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1023 long) == 8. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1024 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1025 /* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1026 macros. In order not to trash the stack redzone, we need to drop |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1027 %rsp by 128 before the hidden call, and restore afterwards. The |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1028 nastyness is that it is only by luck that the stack still appears |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1029 to be unwindable during the hidden call - since then the behaviour |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1030 of any routine using this macro does not match what the CFI data |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1031 says. Sigh. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1032 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1033 Why is this important? Imagine that a wrapper has a stack |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1034 allocated local, and passes to the hidden call, a pointer to it. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1035 Because gcc does not know about the hidden call, it may allocate |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1036 that local in the redzone. Unfortunately the hidden call may then |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1037 trash it before it comes to use it. So we must step clear of the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1038 redzone, for the duration of the hidden call, to make it safe. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1039 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1040 Probably the same problem afflicts the other redzone-style ABIs too |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1041 (ppc64-linux, ppc32-aix5, ppc64-aix5); but for those, the stack is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1042 self describing (none of this CFI nonsense) so at least messing |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1043 with the stack pointer doesn't give a danger of non-unwindable |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1044 stack. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1045 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1046 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1047 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1048 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1049 volatile unsigned long _argvec[1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1050 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1051 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1052 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1053 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1054 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1055 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1056 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1057 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1058 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1059 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1060 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1061 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1062 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1063 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1064 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1065 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1066 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1067 volatile unsigned long _argvec[2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1068 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1069 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1070 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1071 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1072 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1073 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1074 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1075 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1076 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1077 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1078 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1079 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1080 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1081 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1082 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1083 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1084 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1085 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1086 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1087 volatile unsigned long _argvec[3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1088 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1089 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1090 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1091 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1092 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1093 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1094 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1095 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1096 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1097 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1098 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1099 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1100 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1101 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1102 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1103 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1104 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1105 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1106 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1107 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1108 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1109 volatile unsigned long _argvec[4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1110 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1111 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1112 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1113 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1114 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1115 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1116 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1117 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1118 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1119 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1120 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1121 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1122 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1123 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1124 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1125 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1126 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1127 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1128 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1129 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1130 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1131 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1132 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1133 volatile unsigned long _argvec[5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1134 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1135 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1136 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1137 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1138 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1139 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1140 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1141 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1142 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1143 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1144 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1145 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1146 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1147 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1148 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1149 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1150 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1151 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1152 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1153 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1154 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1155 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1156 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1157 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1158 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1159 volatile unsigned long _argvec[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1160 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1161 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1162 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1163 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1164 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1165 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1166 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1167 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1168 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1169 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1170 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1171 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1172 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1173 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1174 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1175 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1176 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1177 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1178 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1179 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1180 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1181 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1182 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1183 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1184 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1185 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1186 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1187 volatile unsigned long _argvec[7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1188 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1189 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1190 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1191 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1192 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1193 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1194 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1195 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1196 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1197 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1198 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1199 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1200 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1201 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1202 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1203 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1204 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1205 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1206 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1207 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1208 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1209 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1210 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1211 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1212 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1213 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1214 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1215 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1216 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1217 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1218 volatile unsigned long _argvec[8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1219 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1220 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1221 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1222 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1223 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1224 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1225 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1226 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1227 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1228 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1229 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1230 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1231 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1232 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1233 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1234 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1235 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1236 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1237 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1238 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1239 "addq $8, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1240 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1241 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1242 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1243 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1244 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1245 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1246 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1247 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1248 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1249 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1250 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1251 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1252 volatile unsigned long _argvec[9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1253 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1254 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1255 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1256 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1257 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1258 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1259 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1260 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1261 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1262 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1263 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1264 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1265 "pushq 64(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1266 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1267 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1268 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1269 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1270 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1271 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1272 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1273 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1274 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1275 "addq $16, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1276 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1277 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1278 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1279 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1280 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1281 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1282 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1283 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1284 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1285 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1286 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1287 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1288 volatile unsigned long _argvec[10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1289 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1290 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1291 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1292 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1293 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1294 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1295 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1296 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1297 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1298 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1299 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1300 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1301 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1302 "pushq 72(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1303 "pushq 64(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1304 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1305 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1306 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1307 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1308 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1309 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1310 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1311 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1312 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1313 "addq $24, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1314 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1315 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1316 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1317 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1318 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1319 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1320 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1321 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1322 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1323 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1324 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1325 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1326 volatile unsigned long _argvec[11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1327 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1328 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1329 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1330 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1331 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1332 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1333 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1334 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1335 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1336 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1337 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1338 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1339 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1340 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1341 "pushq 80(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1342 "pushq 72(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1343 "pushq 64(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1344 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1345 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1346 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1347 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1348 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1349 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1350 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1351 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1352 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1353 "addq $32, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1354 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1355 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1356 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1357 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1358 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1359 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1360 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1361 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1362 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1363 arg7,arg8,arg9,arg10,arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1364 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1365 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1366 volatile unsigned long _argvec[12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1367 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1368 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1369 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1370 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1371 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1372 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1373 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1374 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1375 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1376 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1377 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1378 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1379 _argvec[11] = (unsigned long)(arg11); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1380 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1381 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1382 "pushq 88(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1383 "pushq 80(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1384 "pushq 72(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1385 "pushq 64(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1386 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1387 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1388 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1389 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1390 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1391 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1392 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1393 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1394 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1395 "addq $40, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1396 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1397 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1398 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1399 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1400 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1401 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1402 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1403 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1404 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1405 arg7,arg8,arg9,arg10,arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1406 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1407 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1408 volatile unsigned long _argvec[13]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1409 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1410 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1411 _argvec[1] = (unsigned long)(arg1); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1412 _argvec[2] = (unsigned long)(arg2); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1413 _argvec[3] = (unsigned long)(arg3); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1414 _argvec[4] = (unsigned long)(arg4); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1415 _argvec[5] = (unsigned long)(arg5); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1416 _argvec[6] = (unsigned long)(arg6); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1417 _argvec[7] = (unsigned long)(arg7); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1418 _argvec[8] = (unsigned long)(arg8); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1419 _argvec[9] = (unsigned long)(arg9); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1420 _argvec[10] = (unsigned long)(arg10); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1421 _argvec[11] = (unsigned long)(arg11); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1422 _argvec[12] = (unsigned long)(arg12); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1423 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1424 "subq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1425 "pushq 96(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1426 "pushq 88(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1427 "pushq 80(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1428 "pushq 72(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1429 "pushq 64(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1430 "pushq 56(%%rax)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1431 "movq 48(%%rax), %%r9\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1432 "movq 40(%%rax), %%r8\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1433 "movq 32(%%rax), %%rcx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1434 "movq 24(%%rax), %%rdx\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1435 "movq 16(%%rax), %%rsi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1436 "movq 8(%%rax), %%rdi\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1437 "movq (%%rax), %%rax\n\t" /* target->%rax */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1438 VALGRIND_CALL_NOREDIR_RAX \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1439 "addq $48, %%rsp\n" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1440 "addq $128,%%rsp\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1441 : /*out*/ "=a" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1442 : /*in*/ "a" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1443 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1444 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1445 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1446 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1447 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1448 #endif /* PLAT_amd64_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1449 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1450 /* ------------------------ ppc32-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1451 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1452 #if defined(PLAT_ppc32_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1453 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1454 /* This is useful for finding out about the on-stack stuff: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1455 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1456 extern int f9 ( int,int,int,int,int,int,int,int,int ); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1457 extern int f10 ( int,int,int,int,int,int,int,int,int,int ); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1458 extern int f11 ( int,int,int,int,int,int,int,int,int,int,int ); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1459 extern int f12 ( int,int,int,int,int,int,int,int,int,int,int,int ); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1460 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1461 int g9 ( void ) { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1462 return f9(11,22,33,44,55,66,77,88,99); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1463 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1464 int g10 ( void ) { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1465 return f10(11,22,33,44,55,66,77,88,99,110); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1466 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1467 int g11 ( void ) { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1468 return f11(11,22,33,44,55,66,77,88,99,110,121); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1469 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1470 int g12 ( void ) { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1471 return f12(11,22,33,44,55,66,77,88,99,110,121,132); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1472 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1473 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1474 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1475 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1476 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1477 /* These regs are trashed by the hidden call. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1478 #define __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1479 "lr", "ctr", "xer", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1480 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1481 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1482 "r11", "r12", "r13" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1483 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1484 /* These CALL_FN_ macros assume that on ppc32-linux, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1485 sizeof(unsigned long) == 4. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1486 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1487 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1488 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1489 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1490 volatile unsigned long _argvec[1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1491 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1492 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1493 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1494 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1495 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1496 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1497 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1498 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1499 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1500 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1501 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1502 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1503 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1504 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1505 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1506 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1507 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1508 volatile unsigned long _argvec[2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1509 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1510 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1511 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1512 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1513 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1514 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1515 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1516 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1517 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1518 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1519 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1520 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1521 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1522 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1523 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1524 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1525 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1526 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1527 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1528 volatile unsigned long _argvec[3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1529 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1530 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1531 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1532 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1533 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1534 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1535 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1536 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1537 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1538 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1539 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1540 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1541 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1542 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1543 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1544 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1545 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1546 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1547 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1548 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1549 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1550 volatile unsigned long _argvec[4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1551 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1552 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1553 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1554 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1555 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1556 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1557 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1558 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1559 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1560 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1561 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1562 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1563 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1564 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1565 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1566 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1567 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1568 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1569 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1570 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1571 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1572 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1573 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1574 volatile unsigned long _argvec[5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1575 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1576 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1577 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1578 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1579 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1580 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1581 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1582 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1583 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1584 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1585 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1586 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1587 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1588 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1589 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1590 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1591 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1592 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1593 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1594 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1595 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1596 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1597 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1598 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1599 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1600 volatile unsigned long _argvec[6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1601 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1602 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1603 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1604 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1605 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1606 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1607 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1608 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1609 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1610 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1611 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1612 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1613 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1614 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1615 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1616 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1617 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1618 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1619 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1620 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1621 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1622 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1623 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1624 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1625 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1626 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1627 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1628 volatile unsigned long _argvec[7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1629 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1630 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1631 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1632 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1633 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1634 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1635 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1636 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1637 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1638 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1639 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1640 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1641 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1642 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1643 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1644 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1645 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1646 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1647 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1648 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1649 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1650 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1651 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1652 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1653 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1654 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1655 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1656 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1657 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1658 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1659 volatile unsigned long _argvec[8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1660 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1661 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1662 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1663 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1664 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1665 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1666 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1667 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1668 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1669 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1670 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1671 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1672 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1673 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1674 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1675 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1676 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1677 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1678 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1679 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1680 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1681 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1682 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1683 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1684 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1685 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1686 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1687 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1688 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1689 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1690 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1691 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1692 volatile unsigned long _argvec[9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1693 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1694 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1695 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1696 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1697 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1698 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1699 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1700 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1701 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1702 _argvec[8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1703 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1704 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1705 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1706 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1707 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1708 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1709 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1710 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1711 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1712 "lwz 10,32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1713 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1714 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1715 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1716 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1717 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1718 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1719 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1720 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1721 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1722 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1723 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1724 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1725 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1726 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1727 volatile unsigned long _argvec[10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1728 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1729 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1730 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1731 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1732 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1733 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1734 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1735 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1736 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1737 _argvec[8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1738 _argvec[9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1739 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1740 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1741 "addi 1,1,-16\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1742 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1743 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1744 "stw 3,8(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1745 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1746 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1747 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1748 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1749 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1750 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1751 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1752 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1753 "lwz 10,32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1754 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1755 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1756 "addi 1,1,16\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1757 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1758 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1759 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1760 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1761 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1762 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1763 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1764 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1765 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1766 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1767 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1768 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1769 volatile unsigned long _argvec[11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1770 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1771 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1772 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1773 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1774 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1775 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1776 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1777 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1778 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1779 _argvec[8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1780 _argvec[9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1781 _argvec[10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1782 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1783 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1784 "addi 1,1,-16\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1785 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1786 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1787 "stw 3,12(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1788 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1789 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1790 "stw 3,8(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1791 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1792 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1793 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1794 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1795 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1796 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1797 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1798 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1799 "lwz 10,32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1800 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1801 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1802 "addi 1,1,16\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1803 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1804 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1805 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1806 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1807 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1808 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1809 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1810 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1811 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1812 arg7,arg8,arg9,arg10,arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1813 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1814 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1815 volatile unsigned long _argvec[12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1816 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1817 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1818 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1819 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1820 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1821 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1822 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1823 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1824 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1825 _argvec[8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1826 _argvec[9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1827 _argvec[10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1828 _argvec[11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1829 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1830 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1831 "addi 1,1,-32\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1832 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1833 "lwz 3,44(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1834 "stw 3,16(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1835 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1836 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1837 "stw 3,12(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1838 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1839 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1840 "stw 3,8(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1841 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1842 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1843 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1844 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1845 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1846 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1847 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1848 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1849 "lwz 10,32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1850 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1851 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1852 "addi 1,1,32\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1853 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1854 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1855 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1856 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1857 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1858 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1859 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1860 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1861 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1862 arg7,arg8,arg9,arg10,arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1863 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1864 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1865 volatile unsigned long _argvec[13]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1866 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1867 _argvec[0] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1868 _argvec[1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1869 _argvec[2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1870 _argvec[3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1871 _argvec[4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1872 _argvec[5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1873 _argvec[6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1874 _argvec[7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1875 _argvec[8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1876 _argvec[9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1877 _argvec[10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1878 _argvec[11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1879 _argvec[12] = (unsigned long)arg12; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1880 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1881 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1882 "addi 1,1,-32\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1883 /* arg12 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1884 "lwz 3,48(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1885 "stw 3,20(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1886 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1887 "lwz 3,44(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1888 "stw 3,16(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1889 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1890 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1891 "stw 3,12(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1892 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1893 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1894 "stw 3,8(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1895 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1896 "lwz 3,4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1897 "lwz 4,8(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1898 "lwz 5,12(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1899 "lwz 6,16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1900 "lwz 7,20(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1901 "lwz 8,24(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1902 "lwz 9,28(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1903 "lwz 10,32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1904 "lwz 11,0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1905 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1906 "addi 1,1,32\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1907 "mr %0,3" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1908 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1909 : /*in*/ "r" (&_argvec[0]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1910 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1911 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1912 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1913 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1914 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1915 #endif /* PLAT_ppc32_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1916 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1917 /* ------------------------ ppc64-linux ------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1918 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1919 #if defined(PLAT_ppc64_linux) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1920 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1921 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1922 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1923 /* These regs are trashed by the hidden call. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1924 #define __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1925 "lr", "ctr", "xer", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1926 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1927 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1928 "r11", "r12", "r13" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1929 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1930 /* These CALL_FN_ macros assume that on ppc64-linux, sizeof(unsigned |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1931 long) == 8. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1932 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1933 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1934 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1935 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1936 volatile unsigned long _argvec[3+0]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1937 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1938 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1939 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1940 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1941 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1942 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1943 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1944 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1945 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1946 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1947 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1948 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1949 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1950 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1951 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1952 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1953 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1954 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1955 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1956 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1957 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1958 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1959 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1960 volatile unsigned long _argvec[3+1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1961 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1962 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1963 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1964 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1965 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1966 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1967 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1968 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1969 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1970 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1971 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1972 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1973 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1974 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1975 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1976 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1977 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1978 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1979 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1980 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1981 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1982 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1983 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1984 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1985 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1986 volatile unsigned long _argvec[3+2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1987 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1988 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1989 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1990 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1991 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1992 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1993 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1994 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1995 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1996 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1997 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1998 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
1999 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2000 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2001 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2002 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2003 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2004 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2005 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2006 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2007 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2008 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2009 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2010 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2011 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2012 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2013 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2014 volatile unsigned long _argvec[3+3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2015 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2016 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2017 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2018 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2019 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2020 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2021 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2022 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2023 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2024 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2025 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2026 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2027 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2028 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2029 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2030 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2031 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2032 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2033 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2034 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2035 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2036 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2037 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2038 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2039 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2040 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2041 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2042 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2043 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2044 volatile unsigned long _argvec[3+4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2045 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2046 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2047 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2048 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2049 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2050 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2051 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2052 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2053 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2054 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2055 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2056 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2057 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2058 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2059 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2060 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2061 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2062 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2063 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2064 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2065 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2066 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2067 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2068 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2069 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2070 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2071 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2072 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2073 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2074 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2075 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2076 volatile unsigned long _argvec[3+5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2077 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2078 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2079 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2080 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2081 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2082 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2083 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2084 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2085 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2086 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2087 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2088 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2089 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2090 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2091 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2092 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2093 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2094 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2095 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2096 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2097 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2098 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2099 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2100 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2101 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2102 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2103 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2104 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2105 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2106 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2107 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2108 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2109 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2110 volatile unsigned long _argvec[3+6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2111 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2112 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2113 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2114 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2115 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2116 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2117 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2118 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2119 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2120 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2121 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2122 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2123 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2124 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2125 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2126 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2127 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2128 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2129 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2130 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2131 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2132 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2133 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2134 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2135 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2136 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2137 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2138 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2139 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2140 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2141 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2142 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2143 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2144 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2145 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2146 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2147 volatile unsigned long _argvec[3+7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2148 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2149 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2150 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2151 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2152 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2153 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2154 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2155 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2156 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2157 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2158 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2159 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2160 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2161 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2162 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2163 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2164 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2165 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2166 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2167 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2168 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2169 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2170 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2171 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2172 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2173 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2174 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2175 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2176 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2177 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2178 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2179 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2180 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2181 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2182 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2183 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2184 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2185 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2186 volatile unsigned long _argvec[3+8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2187 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2188 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2189 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2190 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2191 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2192 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2193 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2194 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2195 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2196 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2197 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2198 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2199 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2200 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2201 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2202 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2203 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2204 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2205 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2206 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2207 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2208 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2209 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2210 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2211 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2212 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2213 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2214 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2215 "ld 2,-16(11)" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2216 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2217 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2218 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2219 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2220 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2221 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2222 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2223 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2224 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2225 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2226 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2227 volatile unsigned long _argvec[3+9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2228 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2229 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2230 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2231 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2232 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2233 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2234 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2235 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2236 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2237 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2238 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2239 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2240 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2241 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2242 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2243 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2244 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2245 "addi 1,1,-128\n\t" /* expand stack frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2246 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2247 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2248 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2249 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2250 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2251 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2252 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2253 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2254 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2255 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2256 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2257 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2258 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2259 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2260 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2261 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2262 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2263 "addi 1,1,128" /* restore frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2264 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2265 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2266 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2267 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2268 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2269 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2270 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2271 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2272 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2273 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2274 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2275 volatile unsigned long _argvec[3+10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2276 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2277 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2278 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2279 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2280 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2281 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2282 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2283 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2284 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2285 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2286 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2287 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2288 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2289 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2290 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2291 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2292 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2293 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2294 "addi 1,1,-128\n\t" /* expand stack frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2295 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2296 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2297 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2298 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2299 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2300 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2301 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2302 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2303 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2304 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2305 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2306 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2307 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2308 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2309 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2310 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2311 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2312 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2313 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2314 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2315 "addi 1,1,128" /* restore frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2316 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2317 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2318 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2319 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2320 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2321 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2322 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2323 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2324 arg7,arg8,arg9,arg10,arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2325 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2326 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2327 volatile unsigned long _argvec[3+11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2328 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2329 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2330 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2331 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2332 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2333 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2334 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2335 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2336 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2337 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2338 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2339 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2340 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2341 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2342 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2343 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2344 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2345 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2346 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2347 "addi 1,1,-144\n\t" /* expand stack frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2348 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2349 "ld 3,88(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2350 "std 3,128(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2351 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2352 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2353 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2354 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2355 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2356 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2357 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2358 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2359 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2360 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2361 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2362 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2363 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2364 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2365 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2366 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2367 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2368 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2369 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2370 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2371 "addi 1,1,144" /* restore frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2372 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2373 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2374 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2375 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2376 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2377 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2378 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2379 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2380 arg7,arg8,arg9,arg10,arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2381 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2382 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2383 volatile unsigned long _argvec[3+12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2384 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2385 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2386 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2387 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2388 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2389 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2390 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2391 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2392 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2393 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2394 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2395 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2396 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2397 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2398 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2399 _argvec[2+12] = (unsigned long)arg12; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2400 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2401 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2402 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2403 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2404 "addi 1,1,-144\n\t" /* expand stack frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2405 /* arg12 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2406 "ld 3,96(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2407 "std 3,136(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2408 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2409 "ld 3,88(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2410 "std 3,128(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2411 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2412 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2413 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2414 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2415 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2416 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2417 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2418 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2419 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2420 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2421 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2422 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2423 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2424 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2425 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2426 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2427 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2428 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2429 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2430 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2431 "addi 1,1,144" /* restore frame */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2432 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2433 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2434 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2435 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2436 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2437 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2438 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2439 #endif /* PLAT_ppc64_linux */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2440 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2441 /* ------------------------ ppc32-aix5 ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2442 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2443 #if defined(PLAT_ppc32_aix5) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2444 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2445 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2446 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2447 /* These regs are trashed by the hidden call. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2448 #define __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2449 "lr", "ctr", "xer", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2450 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2451 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2452 "r11", "r12", "r13" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2453 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2454 /* Expand the stack frame, copying enough info that unwinding |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2455 still works. Trashes r3. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2456 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2457 #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2458 "addi 1,1,-" #_n_fr "\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2459 "lwz 3," #_n_fr "(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2460 "stw 3,0(1)\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2461 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2462 #define VG_CONTRACT_FRAME_BY(_n_fr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2463 "addi 1,1," #_n_fr "\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2464 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2465 /* These CALL_FN_ macros assume that on ppc32-aix5, sizeof(unsigned |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2466 long) == 4. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2467 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2468 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2469 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2470 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2471 volatile unsigned long _argvec[3+0]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2472 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2473 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2474 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2475 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2476 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2477 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2478 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2479 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2480 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2481 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2482 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2483 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2484 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2485 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2486 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2487 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2488 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2489 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2490 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2491 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2492 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2493 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2494 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2495 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2496 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2497 volatile unsigned long _argvec[3+1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2498 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2499 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2500 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2501 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2502 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2503 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2504 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2505 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2506 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2507 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2508 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2509 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2510 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2511 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2512 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2513 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2514 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2515 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2516 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2517 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2518 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2519 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2520 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2521 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2522 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2523 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2524 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2525 volatile unsigned long _argvec[3+2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2526 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2527 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2528 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2529 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2530 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2531 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2532 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2533 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2534 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2535 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2536 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2537 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2538 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2539 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2540 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2541 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2542 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2543 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2544 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2545 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2546 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2547 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2548 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2549 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2550 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2551 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2552 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2553 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2554 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2555 volatile unsigned long _argvec[3+3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2556 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2557 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2558 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2559 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2560 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2561 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2562 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2563 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2564 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2565 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2566 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2567 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2568 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2569 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2570 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2571 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2572 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2573 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2574 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2575 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2576 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2577 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2578 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2579 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2580 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2581 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2582 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2583 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2584 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2585 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2586 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2587 volatile unsigned long _argvec[3+4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2588 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2589 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2590 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2591 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2592 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2593 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2594 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2595 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2596 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2597 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2598 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2599 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2600 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2601 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2602 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2603 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2604 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2605 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2606 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2607 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2608 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2609 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2610 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2611 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2612 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2613 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2614 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2615 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2616 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2617 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2618 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2619 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2620 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2621 volatile unsigned long _argvec[3+5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2622 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2623 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2624 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2625 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2626 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2627 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2628 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2629 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2630 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2631 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2632 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2633 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2634 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2635 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2636 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2637 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2638 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2639 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2640 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2641 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2642 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2643 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2644 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2645 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2646 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2647 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2648 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2649 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2650 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2651 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2652 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2653 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2654 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2655 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2656 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2657 volatile unsigned long _argvec[3+6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2658 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2659 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2660 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2661 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2662 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2663 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2664 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2665 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2666 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2667 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2668 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2669 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2670 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2671 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2672 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2673 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2674 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2675 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2676 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2677 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2678 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2679 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2680 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2681 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2682 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2683 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2684 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2685 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2686 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2687 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2688 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2689 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2690 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2691 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2692 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2693 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2694 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2695 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2696 volatile unsigned long _argvec[3+7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2697 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2698 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2699 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2700 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2701 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2702 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2703 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2704 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2705 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2706 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2707 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2708 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2709 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2710 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2711 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2712 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2713 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2714 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2715 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2716 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2717 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2718 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2719 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2720 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2721 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2722 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2723 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2724 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2725 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2726 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2727 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2728 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2729 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2730 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2731 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2732 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2733 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2734 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2735 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2736 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2737 volatile unsigned long _argvec[3+8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2738 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2739 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2740 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2741 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2742 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2743 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2744 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2745 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2746 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2747 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2748 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2749 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2750 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2751 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2752 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2753 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2754 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2755 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2756 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2757 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2758 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2759 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2760 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2761 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2762 "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2763 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2764 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2765 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2766 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2767 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2768 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2769 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2770 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2771 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2772 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2773 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2774 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2775 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2776 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2777 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2778 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2779 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2780 volatile unsigned long _argvec[3+9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2781 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2782 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2783 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2784 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2785 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2786 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2787 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2788 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2789 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2790 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2791 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2792 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2793 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2794 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2795 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2796 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2797 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2798 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2799 VG_EXPAND_FRAME_BY_trashes_r3(64) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2800 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2801 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2802 "stw 3,56(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2803 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2804 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2805 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2806 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2807 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2808 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2809 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2810 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2811 "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2812 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2813 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2814 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2815 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2816 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2817 VG_CONTRACT_FRAME_BY(64) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2818 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2819 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2820 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2821 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2822 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2823 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2824 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2825 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2826 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2827 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2828 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2829 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2830 volatile unsigned long _argvec[3+10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2831 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2832 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2833 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2834 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2835 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2836 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2837 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2838 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2839 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2840 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2841 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2842 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2843 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2844 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2845 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2846 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2847 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2848 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2849 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2850 VG_EXPAND_FRAME_BY_trashes_r3(64) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2851 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2852 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2853 "stw 3,60(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2854 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2855 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2856 "stw 3,56(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2857 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2858 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2859 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2860 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2861 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2862 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2863 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2864 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2865 "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2866 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2867 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2868 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2869 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2870 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2871 VG_CONTRACT_FRAME_BY(64) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2872 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2873 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2874 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2875 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2876 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2877 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2878 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2879 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2880 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2881 arg7,arg8,arg9,arg10,arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2882 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2883 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2884 volatile unsigned long _argvec[3+11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2885 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2886 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2887 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2888 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2889 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2890 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2891 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2892 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2893 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2894 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2895 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2896 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2897 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2898 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2899 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2900 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2901 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2902 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2903 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2904 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2905 VG_EXPAND_FRAME_BY_trashes_r3(72) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2906 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2907 "lwz 3,44(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2908 "stw 3,64(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2909 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2910 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2911 "stw 3,60(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2912 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2913 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2914 "stw 3,56(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2915 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2916 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2917 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2918 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2919 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2920 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2921 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2922 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2923 "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2924 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2925 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2926 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2927 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2928 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2929 VG_CONTRACT_FRAME_BY(72) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2930 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2931 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2932 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2933 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2934 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2935 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2936 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2937 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2938 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2939 arg7,arg8,arg9,arg10,arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2940 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2941 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2942 volatile unsigned long _argvec[3+12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2943 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2944 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2945 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2946 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2947 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2948 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2949 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2950 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2951 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2952 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2953 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2954 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2955 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2956 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2957 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2958 _argvec[2+12] = (unsigned long)arg12; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2959 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2960 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2961 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2962 "stw 2,-8(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2963 "lwz 2,-4(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2964 VG_EXPAND_FRAME_BY_trashes_r3(72) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2965 /* arg12 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2966 "lwz 3,48(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2967 "stw 3,68(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2968 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2969 "lwz 3,44(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2970 "stw 3,64(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2971 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2972 "lwz 3,40(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2973 "stw 3,60(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2974 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2975 "lwz 3,36(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2976 "stw 3,56(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2977 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2978 "lwz 3, 4(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2979 "lwz 4, 8(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2980 "lwz 5, 12(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2981 "lwz 6, 16(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2982 "lwz 7, 20(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2983 "lwz 8, 24(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2984 "lwz 9, 28(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2985 "lwz 10, 32(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2986 "lwz 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2987 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2988 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2989 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2990 "lwz 2,-8(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2991 VG_CONTRACT_FRAME_BY(72) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2992 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2993 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2994 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2995 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2996 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2997 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2998 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
2999 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3000 #endif /* PLAT_ppc32_aix5 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3001 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3002 /* ------------------------ ppc64-aix5 ------------------------- */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3003 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3004 #if defined(PLAT_ppc64_aix5) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3005 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3006 /* ARGREGS: r3 r4 r5 r6 r7 r8 r9 r10 (the rest on stack somewhere) */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3007 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3008 /* These regs are trashed by the hidden call. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3009 #define __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3010 "lr", "ctr", "xer", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3011 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3012 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3013 "r11", "r12", "r13" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3014 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3015 /* Expand the stack frame, copying enough info that unwinding |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3016 still works. Trashes r3. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3017 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3018 #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3019 "addi 1,1,-" #_n_fr "\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3020 "ld 3," #_n_fr "(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3021 "std 3,0(1)\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3022 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3023 #define VG_CONTRACT_FRAME_BY(_n_fr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3024 "addi 1,1," #_n_fr "\n\t" |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3025 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3026 /* These CALL_FN_ macros assume that on ppc64-aix5, sizeof(unsigned |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3027 long) == 8. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3028 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3029 #define CALL_FN_W_v(lval, orig) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3030 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3031 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3032 volatile unsigned long _argvec[3+0]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3033 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3034 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3035 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3036 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3037 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3038 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3039 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3040 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3041 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3042 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3043 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3044 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3045 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3046 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3047 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3048 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3049 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3050 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3051 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3052 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3053 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3054 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3055 #define CALL_FN_W_W(lval, orig, arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3056 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3057 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3058 volatile unsigned long _argvec[3+1]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3059 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3060 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3061 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3062 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3063 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3064 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3065 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3066 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3067 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3068 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3069 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3070 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3071 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3072 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3073 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3074 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3075 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3076 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3077 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3078 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3079 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3080 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3081 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3082 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3083 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3084 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3085 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3086 volatile unsigned long _argvec[3+2]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3087 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3088 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3089 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3090 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3091 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3092 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3093 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3094 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3095 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3096 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3097 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3098 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3099 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3100 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3101 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3102 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3103 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3104 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3105 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3106 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3107 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3108 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3109 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3110 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3111 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3112 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3113 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3114 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3115 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3116 volatile unsigned long _argvec[3+3]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3117 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3118 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3119 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3120 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3121 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3122 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3123 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3124 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3125 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3126 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3127 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3128 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3129 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3130 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3131 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3132 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3133 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3134 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3135 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3136 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3137 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3138 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3139 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3140 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3141 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3142 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3143 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3144 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3145 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3146 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3147 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3148 volatile unsigned long _argvec[3+4]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3149 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3150 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3151 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3152 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3153 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3154 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3155 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3156 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3157 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3158 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3159 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3160 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3161 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3162 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3163 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3164 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3165 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3166 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3167 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3168 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3169 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3170 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3171 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3172 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3173 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3174 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3175 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3176 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3177 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3178 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3179 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3180 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3181 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3182 volatile unsigned long _argvec[3+5]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3183 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3184 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3185 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3186 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3187 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3188 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3189 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3190 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3191 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3192 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3193 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3194 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3195 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3196 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3197 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3198 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3199 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3200 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3201 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3202 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3203 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3204 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3205 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3206 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3207 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3208 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3209 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3210 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3211 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3212 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3213 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3214 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3215 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3216 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3217 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3218 volatile unsigned long _argvec[3+6]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3219 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3220 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3221 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3222 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3223 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3224 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3225 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3226 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3227 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3228 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3229 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3230 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3231 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3232 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3233 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3234 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3235 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3236 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3237 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3238 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3239 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3240 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3241 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3242 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3243 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3244 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3245 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3246 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3247 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3248 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3249 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3250 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3251 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3252 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3253 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3254 arg7) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3255 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3256 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3257 volatile unsigned long _argvec[3+7]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3258 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3259 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3260 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3261 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3262 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3263 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3264 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3265 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3266 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3267 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3268 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3269 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3270 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3271 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3272 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3273 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3274 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3275 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3276 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3277 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3278 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3279 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3280 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3281 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3282 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3283 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3284 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3285 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3286 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3287 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3288 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3289 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3290 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3291 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3292 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3293 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3294 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3295 arg7,arg8) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3296 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3297 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3298 volatile unsigned long _argvec[3+8]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3299 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3300 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3301 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3302 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3303 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3304 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3305 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3306 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3307 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3308 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3309 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3310 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3311 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3312 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3313 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3314 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3315 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3316 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3317 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3318 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3319 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3320 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3321 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3322 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3323 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3324 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3325 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3326 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3327 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3328 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3329 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3330 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3331 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3332 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3333 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3334 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3335 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3336 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3337 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3338 arg7,arg8,arg9) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3339 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3340 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3341 volatile unsigned long _argvec[3+9]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3342 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3343 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3344 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3345 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3346 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3347 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3348 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3349 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3350 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3351 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3352 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3353 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3354 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3355 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3356 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3357 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3358 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3359 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3360 VG_EXPAND_FRAME_BY_trashes_r3(128) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3361 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3362 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3363 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3364 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3365 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3366 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3367 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3368 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3369 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3370 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3371 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3372 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3373 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3374 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3375 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3376 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3377 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3378 VG_CONTRACT_FRAME_BY(128) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3379 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3380 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3381 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3382 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3383 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3384 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3385 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3386 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3387 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3388 arg7,arg8,arg9,arg10) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3389 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3390 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3391 volatile unsigned long _argvec[3+10]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3392 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3393 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3394 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3395 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3396 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3397 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3398 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3399 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3400 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3401 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3402 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3403 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3404 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3405 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3406 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3407 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3408 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3409 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3410 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3411 VG_EXPAND_FRAME_BY_trashes_r3(128) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3412 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3413 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3414 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3415 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3416 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3417 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3418 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3419 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3420 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3421 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3422 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3423 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3424 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3425 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3426 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3427 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3428 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3429 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3430 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3431 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3432 VG_CONTRACT_FRAME_BY(128) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3433 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3434 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3435 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3436 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3437 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3438 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3439 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3440 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3441 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3442 arg7,arg8,arg9,arg10,arg11) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3443 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3444 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3445 volatile unsigned long _argvec[3+11]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3446 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3447 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3448 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3449 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3450 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3451 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3452 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3453 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3454 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3455 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3456 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3457 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3458 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3459 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3460 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3461 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3462 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3463 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3464 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3465 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3466 VG_EXPAND_FRAME_BY_trashes_r3(144) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3467 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3468 "ld 3,88(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3469 "std 3,128(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3470 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3471 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3472 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3473 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3474 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3475 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3476 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3477 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3478 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3479 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3480 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3481 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3482 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3483 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3484 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3485 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3486 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3487 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3488 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3489 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3490 VG_CONTRACT_FRAME_BY(144) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3491 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3492 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3493 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3494 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3495 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3496 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3497 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3498 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3499 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3500 arg7,arg8,arg9,arg10,arg11,arg12) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3501 do { \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3502 volatile OrigFn _orig = (orig); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3503 volatile unsigned long _argvec[3+12]; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3504 volatile unsigned long _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3505 /* _argvec[0] holds current r2 across the call */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3506 _argvec[1] = (unsigned long)_orig.r2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3507 _argvec[2] = (unsigned long)_orig.nraddr; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3508 _argvec[2+1] = (unsigned long)arg1; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3509 _argvec[2+2] = (unsigned long)arg2; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3510 _argvec[2+3] = (unsigned long)arg3; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3511 _argvec[2+4] = (unsigned long)arg4; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3512 _argvec[2+5] = (unsigned long)arg5; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3513 _argvec[2+6] = (unsigned long)arg6; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3514 _argvec[2+7] = (unsigned long)arg7; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3515 _argvec[2+8] = (unsigned long)arg8; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3516 _argvec[2+9] = (unsigned long)arg9; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3517 _argvec[2+10] = (unsigned long)arg10; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3518 _argvec[2+11] = (unsigned long)arg11; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3519 _argvec[2+12] = (unsigned long)arg12; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3520 __asm__ volatile( \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3521 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3522 VG_EXPAND_FRAME_BY_trashes_r3(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3523 "std 2,-16(11)\n\t" /* save tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3524 "ld 2,-8(11)\n\t" /* use nraddr's tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3525 VG_EXPAND_FRAME_BY_trashes_r3(144) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3526 /* arg12 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3527 "ld 3,96(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3528 "std 3,136(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3529 /* arg11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3530 "ld 3,88(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3531 "std 3,128(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3532 /* arg10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3533 "ld 3,80(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3534 "std 3,120(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3535 /* arg9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3536 "ld 3,72(11)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3537 "std 3,112(1)\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3538 /* args1-8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3539 "ld 3, 8(11)\n\t" /* arg1->r3 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3540 "ld 4, 16(11)\n\t" /* arg2->r4 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3541 "ld 5, 24(11)\n\t" /* arg3->r5 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3542 "ld 6, 32(11)\n\t" /* arg4->r6 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3543 "ld 7, 40(11)\n\t" /* arg5->r7 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3544 "ld 8, 48(11)\n\t" /* arg6->r8 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3545 "ld 9, 56(11)\n\t" /* arg7->r9 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3546 "ld 10, 64(11)\n\t" /* arg8->r10 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3547 "ld 11, 0(11)\n\t" /* target->r11 */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3548 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3549 "mr 11,%1\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3550 "mr %0,3\n\t" \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3551 "ld 2,-16(11)\n\t" /* restore tocptr */ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3552 VG_CONTRACT_FRAME_BY(144) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3553 VG_CONTRACT_FRAME_BY(512) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3554 : /*out*/ "=r" (_res) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3555 : /*in*/ "r" (&_argvec[2]) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3556 : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3557 ); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3558 lval = (__typeof__(lval)) _res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3559 } while (0) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3560 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3561 #endif /* PLAT_ppc64_aix5 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3562 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3563 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3564 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3565 /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3566 /* */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3567 /* ------------------------------------------------------------------ */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3568 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3569 /* Some request codes. There are many more of these, but most are not |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3570 exposed to end-user view. These are the public ones, all of the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3571 form 0x1000 + small_number. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3572 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3573 Core ones are in the range 0x00000000--0x0000ffff. The non-public |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3574 ones start at 0x2000. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3575 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3576 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3577 /* These macros are used by tools -- they must be public, but don't |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3578 embed them into other programs. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3579 #define VG_USERREQ_TOOL_BASE(a,b) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3580 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3581 #define VG_IS_TOOL_USERREQ(a, b, v) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3582 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3583 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3584 /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3585 This enum comprises an ABI exported by Valgrind to programs |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3586 which use client requests. DO NOT CHANGE THE ORDER OF THESE |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3587 ENTRIES, NOR DELETE ANY -- add new ones at the end. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3588 typedef |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3589 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3590 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3591 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3592 /* These allow any function to be called from the simulated |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3593 CPU but run on the real CPU. Nb: the first arg passed to |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3594 the function is always the ThreadId of the running |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3595 thread! So CLIENT_CALL0 actually requires a 1 arg |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3596 function, etc. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3597 VG_USERREQ__CLIENT_CALL0 = 0x1101, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3598 VG_USERREQ__CLIENT_CALL1 = 0x1102, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3599 VG_USERREQ__CLIENT_CALL2 = 0x1103, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3600 VG_USERREQ__CLIENT_CALL3 = 0x1104, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3601 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3602 /* Can be useful in regression testing suites -- eg. can |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3603 send Valgrind's output to /dev/null and still count |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3604 errors. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3605 VG_USERREQ__COUNT_ERRORS = 0x1201, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3606 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3607 /* These are useful and can be interpreted by any tool that |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3608 tracks malloc() et al, by using vg_replace_malloc.c. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3609 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3610 VG_USERREQ__FREELIKE_BLOCK = 0x1302, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3611 /* Memory pool support. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3612 VG_USERREQ__CREATE_MEMPOOL = 0x1303, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3613 VG_USERREQ__DESTROY_MEMPOOL = 0x1304, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3614 VG_USERREQ__MEMPOOL_ALLOC = 0x1305, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3615 VG_USERREQ__MEMPOOL_FREE = 0x1306, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3616 VG_USERREQ__MEMPOOL_TRIM = 0x1307, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3617 VG_USERREQ__MOVE_MEMPOOL = 0x1308, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3618 VG_USERREQ__MEMPOOL_CHANGE = 0x1309, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3619 VG_USERREQ__MEMPOOL_EXISTS = 0x130a, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3620 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3621 /* Allow printfs to valgrind log. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3622 VG_USERREQ__PRINTF = 0x1401, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3623 VG_USERREQ__PRINTF_BACKTRACE = 0x1402, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3624 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3625 /* Stack support. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3626 VG_USERREQ__STACK_REGISTER = 0x1501, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3627 VG_USERREQ__STACK_DEREGISTER = 0x1502, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3628 VG_USERREQ__STACK_CHANGE = 0x1503 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3629 } Vg_ClientRequest; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3630 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3631 #if !defined(__GNUC__) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3632 # define __extension__ /* */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3633 #endif |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3634 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3635 /* Returns the number of Valgrinds this code is running under. That |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3636 is, 0 if running natively, 1 if running under Valgrind, 2 if |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3637 running under Valgrind which is running under another Valgrind, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3638 etc. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3639 #define RUNNING_ON_VALGRIND __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3640 ({unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3641 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 /* if not */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3642 VG_USERREQ__RUNNING_ON_VALGRIND, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3643 0, 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3644 _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3645 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3646 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3647 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3648 /* Discard translation of code in the range [_qzz_addr .. _qzz_addr + |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3649 _qzz_len - 1]. Useful if you are debugging a JITter or some such, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3650 since it provides a way to make sure valgrind will retranslate the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3651 invalidated area. Returns no value. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3652 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3653 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3654 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3655 VG_USERREQ__DISCARD_TRANSLATIONS, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3656 _qzz_addr, _qzz_len, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3657 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3658 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3659 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3660 /* These requests are for getting Valgrind itself to print something. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3661 Possibly with a backtrace. This is a really ugly hack. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3662 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3663 #if defined(NVALGRIND) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3664 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3665 # define VALGRIND_PRINTF(...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3666 # define VALGRIND_PRINTF_BACKTRACE(...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3667 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3668 #else /* NVALGRIND */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3669 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3670 /* Modern GCC will optimize the static routine out if unused, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3671 and unused attribute will shut down warnings about it. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3672 static int VALGRIND_PRINTF(const char *format, ...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3673 __attribute__((format(__printf__, 1, 2), __unused__)); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3674 static int |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3675 VALGRIND_PRINTF(const char *format, ...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3676 { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3677 unsigned long _qzz_res; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3678 va_list vargs; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3679 va_start(vargs, format); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3680 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3681 (unsigned long)format, (unsigned long)vargs, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3682 0, 0, 0); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3683 va_end(vargs); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3684 return (int)_qzz_res; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3685 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3686 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3687 static int VALGRIND_PRINTF_BACKTRACE(const char *format, ...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3688 __attribute__((format(__printf__, 1, 2), __unused__)); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3689 static int |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3690 VALGRIND_PRINTF_BACKTRACE(const char *format, ...) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3691 { |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3692 unsigned long _qzz_res; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3693 va_list vargs; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3694 va_start(vargs, format); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3695 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3696 (unsigned long)format, (unsigned long)vargs, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3697 0, 0, 0); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3698 va_end(vargs); |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3699 return (int)_qzz_res; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3700 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3701 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3702 #endif /* NVALGRIND */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3703 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3704 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3705 /* These requests allow control to move from the simulated CPU to the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3706 real CPU, calling an arbitary function. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3707 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3708 Note that the current ThreadId is inserted as the first argument. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3709 So this call: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3710 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3711 VALGRIND_NON_SIMD_CALL2(f, arg1, arg2) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3712 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3713 requires f to have this signature: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3714 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3715 Word f(Word tid, Word arg1, Word arg2) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3716 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3717 where "Word" is a word-sized type. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3718 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3719 Note that these client requests are not entirely reliable. For example, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3720 if you call a function with them that subsequently calls printf(), |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3721 there's a high chance Valgrind will crash. Generally, your prospects of |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3722 these working are made higher if the called function does not refer to |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3723 any global variables, and does not refer to any libc or other functions |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3724 (printf et al). Any kind of entanglement with libc or dynamic linking is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3725 likely to have a bad outcome, for tricky reasons which we've grappled |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3726 with a lot in the past. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3727 */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3728 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3729 __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3730 ({unsigned long _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3731 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3732 VG_USERREQ__CLIENT_CALL0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3733 _qyy_fn, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3734 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3735 _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3736 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3737 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3738 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3739 __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3740 ({unsigned long _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3741 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3742 VG_USERREQ__CLIENT_CALL1, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3743 _qyy_fn, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3744 _qyy_arg1, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3745 _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3746 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3747 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3748 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3749 __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3750 ({unsigned long _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3751 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3752 VG_USERREQ__CLIENT_CALL2, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3753 _qyy_fn, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3754 _qyy_arg1, _qyy_arg2, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3755 _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3756 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3757 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3758 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3759 __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3760 ({unsigned long _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3761 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3762 VG_USERREQ__CLIENT_CALL3, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3763 _qyy_fn, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3764 _qyy_arg1, _qyy_arg2, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3765 _qyy_arg3, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3766 _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3767 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3768 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3769 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3770 /* Counts the number of errors that have been recorded by a tool. Nb: |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3771 the tool must record the errors with VG_(maybe_record_error)() or |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3772 VG_(unique_error)() for them to be counted. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3773 #define VALGRIND_COUNT_ERRORS \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3774 __extension__ \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3775 ({unsigned int _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3776 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 /* default return */, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3777 VG_USERREQ__COUNT_ERRORS, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3778 0, 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3779 _qyy_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3780 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3781 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3782 /* Mark a block of memory as having been allocated by a malloc()-like |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3783 function. `addr' is the start of the usable block (ie. after any |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3784 redzone) `rzB' is redzone size if the allocator can apply redzones; |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3785 use '0' if not. Adding redzones makes it more likely Valgrind will spot |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3786 block overruns. `is_zeroed' indicates if the memory is zeroed, as it is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3787 for calloc(). Put it immediately after the point where a block is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3788 allocated. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3789 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3790 If you're using Memcheck: If you're allocating memory via superblocks, |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3791 and then handing out small chunks of each superblock, if you don't have |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3792 redzones on your small blocks, it's worth marking the superblock with |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3793 VALGRIND_MAKE_MEM_NOACCESS when it's created, so that block overruns are |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3794 detected. But if you can put redzones on, it's probably better to not do |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3795 this, so that messages for small overruns are described in terms of the |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3796 small block rather than the superblock (but if you have a big overrun |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3797 that skips over a redzone, you could miss an error this way). See |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3798 memcheck/tests/custom_alloc.c for an example. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3799 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3800 WARNING: if your allocator uses malloc() or 'new' to allocate |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3801 superblocks, rather than mmap() or brk(), this will not work properly -- |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3802 you'll likely get assertion failures during leak detection. This is |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3803 because Valgrind doesn't like seeing overlapping heap blocks. Sorry. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3804 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3805 Nb: block must be freed via a free()-like function specified |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3806 with VALGRIND_FREELIKE_BLOCK or mismatch errors will occur. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3807 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3808 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3809 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3810 VG_USERREQ__MALLOCLIKE_BLOCK, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3811 addr, sizeB, rzB, is_zeroed, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3812 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3813 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3814 /* Mark a block of memory as having been freed by a free()-like function. |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3815 `rzB' is redzone size; it must match that given to |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3816 VALGRIND_MALLOCLIKE_BLOCK. Memory not freed will be detected by the leak |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3817 checker. Put it immediately after the point where the block is freed. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3818 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3819 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3820 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3821 VG_USERREQ__FREELIKE_BLOCK, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3822 addr, rzB, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3823 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3824 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3825 /* Create a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3826 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3827 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3828 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3829 VG_USERREQ__CREATE_MEMPOOL, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3830 pool, rzB, is_zeroed, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3831 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3832 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3833 /* Destroy a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3834 #define VALGRIND_DESTROY_MEMPOOL(pool) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3835 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3836 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3837 VG_USERREQ__DESTROY_MEMPOOL, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3838 pool, 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3839 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3840 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3841 /* Associate a piece of memory with a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3842 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3843 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3844 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3845 VG_USERREQ__MEMPOOL_ALLOC, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3846 pool, addr, size, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3847 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3848 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3849 /* Disassociate a piece of memory from a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3850 #define VALGRIND_MEMPOOL_FREE(pool, addr) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3851 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3852 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3853 VG_USERREQ__MEMPOOL_FREE, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3854 pool, addr, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3855 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3856 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3857 /* Disassociate any pieces outside a particular range. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3858 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3859 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3860 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3861 VG_USERREQ__MEMPOOL_TRIM, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3862 pool, addr, size, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3863 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3864 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3865 /* Resize and/or move a piece associated with a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3866 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3867 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3868 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3869 VG_USERREQ__MOVE_MEMPOOL, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3870 poolA, poolB, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3871 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3872 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3873 /* Resize and/or move a piece associated with a memory pool. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3874 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3875 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3876 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3877 VG_USERREQ__MEMPOOL_CHANGE, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3878 pool, addrA, addrB, size, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3879 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3880 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3881 /* Return 1 if a mempool exists, else 0. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3882 #define VALGRIND_MEMPOOL_EXISTS(pool) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3883 ({unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3884 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3885 VG_USERREQ__MEMPOOL_EXISTS, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3886 pool, 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3887 _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3888 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3889 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3890 /* Mark a piece of memory as being a stack. Returns a stack id. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3891 #define VALGRIND_STACK_REGISTER(start, end) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3892 ({unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3893 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3894 VG_USERREQ__STACK_REGISTER, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3895 start, end, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3896 _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3897 }) |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3898 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3899 /* Unmark the piece of memory associated with a stack id as being a |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3900 stack. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3901 #define VALGRIND_STACK_DEREGISTER(id) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3902 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3903 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3904 VG_USERREQ__STACK_DEREGISTER, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3905 id, 0, 0, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3906 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3907 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3908 /* Change the start and end address of the stack id. */ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3909 #define VALGRIND_STACK_CHANGE(id, start, end) \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3910 {unsigned int _qzz_res; \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3911 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3912 VG_USERREQ__STACK_CHANGE, \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3913 id, start, end, 0, 0); \ |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3914 } |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3915 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3916 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3917 #undef PLAT_x86_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3918 #undef PLAT_amd64_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3919 #undef PLAT_ppc32_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3920 #undef PLAT_ppc64_linux |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3921 #undef PLAT_ppc32_aix5 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3922 #undef PLAT_ppc64_aix5 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3923 |
c1314a6cefcf
Automatically detect if running under valgrind and don't close plugin
Stu Tomlinson <stu@nosnilmot.com>
parents:
diff
changeset
|
3924 #endif /* __VALGRIND_H */ |