1
2 /*--------------------------------------------------------------------*/
3 /*--- begin genoffsets.c ---*/
4 /*--------------------------------------------------------------------*/
5
6 /*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
10 Copyright (C) 2004-2011 OpenWorks LLP
11 info@open-works.net
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26 02110-1301, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29
30 Neither the names of the U.S. Department of Energy nor the
31 University of California nor the names of its contributors may be
32 used to endorse or promote products derived from this software
33 without prior written permission.
34 */
35
36 #include <stdio.h>
37
38 /* A program which, when compiled to assembly, exposes various guest
39 state offsets. The program isn't executed, since that breaks
40 cross-compilation.
41
42 It does rely on the assumption that 'my_offsetof(Ty,Field)' is
43 folded to a constant at a compile time, which seems a bit dodgy
44 to me. On gcc4 it is possible to use __builtin_offsetof, which
45 sounds safer, but that doesn't exist on older gccs. Oh Well.
46 */
47
48 #include "../pub/libvex_basictypes.h"
49 #include "../pub/libvex_guest_x86.h"
50 #include "../pub/libvex_guest_amd64.h"
51 #include "../pub/libvex_guest_ppc32.h"
52 #include "../pub/libvex_guest_ppc64.h"
53 #include "../pub/libvex_guest_arm.h"
54 #include "../pub/libvex_guest_s390x.h"
55
56 #define VG_STRINGIFZ(__str) #__str
57 #define VG_STRINGIFY(__str) VG_STRINGIFZ(__str)
58
59 #define my_offsetof(__type,__field) (&((__type*)0)->__field)
60
61 /* This forces gcc to evaluate the my_offsetof call at compile time,
62 and then emits it in the assembly, along with the nonsense string
63 "xyzzy", for easy greppability. Once this file is compiled to
64 assembly, the lines containing "xyzzy" are grepped out and sed-ed
65 to produce the final result. See the Makefile rule for
66 pub/libvex_guest_offsets.h. */
67 #define GENOFFSET(_structUppercase,_structLowercase,_fieldname) \
68 __asm__ __volatile__ ( \
69 "\n#define OFFSET_" \
70 VG_STRINGIFY(_structLowercase) "_" \
71 VG_STRINGIFY(_fieldname) \
72 " xyzzy%0\n" : /*out*/ \
73 : /*in*/ "n" \
74 (my_offsetof(VexGuest##_structUppercase##State, \
75 guest_##_fieldname)) \
76 )
77
78 void foo ( void );
79 __attribute__((noinline))
foo(void)80 void foo ( void )
81 {
82 // x86
83 GENOFFSET(X86,x86,EAX);
84 GENOFFSET(X86,x86,EBX);
85 GENOFFSET(X86,x86,ECX);
86 GENOFFSET(X86,x86,EDX);
87 GENOFFSET(X86,x86,ESI);
88 GENOFFSET(X86,x86,EDI);
89 GENOFFSET(X86,x86,EBP);
90 GENOFFSET(X86,x86,ESP);
91 GENOFFSET(X86,x86,EIP);
92 GENOFFSET(X86,x86,CS);
93 GENOFFSET(X86,x86,DS);
94 GENOFFSET(X86,x86,ES);
95 GENOFFSET(X86,x86,FS);
96 GENOFFSET(X86,x86,GS);
97 GENOFFSET(X86,x86,SS);
98
99 // amd64
100 GENOFFSET(AMD64,amd64,RAX);
101 GENOFFSET(AMD64,amd64,RBX);
102 GENOFFSET(AMD64,amd64,RCX);
103 GENOFFSET(AMD64,amd64,RDX);
104 GENOFFSET(AMD64,amd64,RSI);
105 GENOFFSET(AMD64,amd64,RDI);
106 GENOFFSET(AMD64,amd64,RSP);
107 GENOFFSET(AMD64,amd64,RBP);
108 GENOFFSET(AMD64,amd64,R8);
109 GENOFFSET(AMD64,amd64,R9);
110 GENOFFSET(AMD64,amd64,R10);
111 GENOFFSET(AMD64,amd64,R11);
112 GENOFFSET(AMD64,amd64,R12);
113 GENOFFSET(AMD64,amd64,R13);
114 GENOFFSET(AMD64,amd64,R14);
115 GENOFFSET(AMD64,amd64,R15);
116 GENOFFSET(AMD64,amd64,RIP);
117
118 // ppc32
119 GENOFFSET(PPC32,ppc32,GPR0);
120 GENOFFSET(PPC32,ppc32,GPR1);
121 GENOFFSET(PPC32,ppc32,GPR2);
122 GENOFFSET(PPC32,ppc32,GPR3);
123 GENOFFSET(PPC32,ppc32,GPR4);
124 GENOFFSET(PPC32,ppc32,GPR5);
125 GENOFFSET(PPC32,ppc32,GPR6);
126 GENOFFSET(PPC32,ppc32,GPR7);
127 GENOFFSET(PPC32,ppc32,GPR8);
128 GENOFFSET(PPC32,ppc32,GPR9);
129 GENOFFSET(PPC32,ppc32,GPR10);
130 GENOFFSET(PPC32,ppc32,CIA);
131 GENOFFSET(PPC32,ppc32,CR0_0);
132
133 // ppc64
134 GENOFFSET(PPC64,ppc64,GPR0);
135 GENOFFSET(PPC64,ppc64,GPR1);
136 GENOFFSET(PPC64,ppc64,GPR2);
137 GENOFFSET(PPC64,ppc64,GPR3);
138 GENOFFSET(PPC64,ppc64,GPR4);
139 GENOFFSET(PPC64,ppc64,GPR5);
140 GENOFFSET(PPC64,ppc64,GPR6);
141 GENOFFSET(PPC64,ppc64,GPR7);
142 GENOFFSET(PPC64,ppc64,GPR8);
143 GENOFFSET(PPC64,ppc64,GPR9);
144 GENOFFSET(PPC64,ppc64,GPR10);
145 GENOFFSET(PPC64,ppc64,CIA);
146 GENOFFSET(PPC64,ppc64,CR0_0);
147
148 // arm
149 GENOFFSET(ARM,arm,R0);
150 GENOFFSET(ARM,arm,R1);
151 GENOFFSET(ARM,arm,R2);
152 GENOFFSET(ARM,arm,R3);
153 GENOFFSET(ARM,arm,R4);
154 GENOFFSET(ARM,arm,R5);
155 GENOFFSET(ARM,arm,R7);
156 GENOFFSET(ARM,arm,R13);
157 GENOFFSET(ARM,arm,R14);
158 GENOFFSET(ARM,arm,R15T);
159
160 // s390x
161 GENOFFSET(S390X,s390x,r2);
162 GENOFFSET(S390X,s390x,r3);
163 GENOFFSET(S390X,s390x,r4);
164 GENOFFSET(S390X,s390x,r5);
165 GENOFFSET(S390X,s390x,r6);
166 GENOFFSET(S390X,s390x,r7);
167 GENOFFSET(S390X,s390x,r15);
168 GENOFFSET(S390X,s390x,IA);
169 GENOFFSET(S390X,s390x,SYSNO);
170 GENOFFSET(S390X,s390x,IP_AT_SYSCALL);
171 GENOFFSET(S390X,s390x,fpc);
172 }
173
174 /*--------------------------------------------------------------------*/
175 /*--- end genoffsets.c ---*/
176 /*--------------------------------------------------------------------*/
177