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-2013 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_arm64.h"
55#include "../pub/libvex_guest_s390x.h"
56#include "../pub/libvex_guest_mips32.h"
57#include "../pub/libvex_guest_mips64.h"
58
59#define VG_STRINGIFZ(__str)  #__str
60#define VG_STRINGIFY(__str)  VG_STRINGIFZ(__str)
61
62#define my_offsetof(__type,__field) (&((__type*)0)->__field)
63
64/* This forces gcc to evaluate the my_offsetof call at compile time,
65   and then emits it in the assembly, along with the nonsense string
66   "xyzzy", for easy greppability.  Once this file is compiled to
67   assembly, the lines containing "xyzzy" are grepped out and sed-ed
68   to produce the final result.  See the Makefile rule for
69   pub/libvex_guest_offsets.h. */
70#define GENOFFSET(_structUppercase,_structLowercase,_fieldname)  \
71   __asm__ __volatile__ ( \
72      "\n#define OFFSET_" \
73      VG_STRINGIFY(_structLowercase) "_" \
74      VG_STRINGIFY(_fieldname) \
75      " xyzzy%0\n" : /*out*/ \
76                   : /*in*/ "n" \
77         (my_offsetof(VexGuest##_structUppercase##State, \
78          guest_##_fieldname)) \
79   )
80
81void foo ( void );
82__attribute__((noinline))
83void foo ( void )
84{
85   // x86
86   GENOFFSET(X86,x86,EAX);
87   GENOFFSET(X86,x86,EBX);
88   GENOFFSET(X86,x86,ECX);
89   GENOFFSET(X86,x86,EDX);
90   GENOFFSET(X86,x86,ESI);
91   GENOFFSET(X86,x86,EDI);
92   GENOFFSET(X86,x86,EBP);
93   GENOFFSET(X86,x86,ESP);
94   GENOFFSET(X86,x86,EIP);
95   GENOFFSET(X86,x86,CS);
96   GENOFFSET(X86,x86,DS);
97   GENOFFSET(X86,x86,ES);
98   GENOFFSET(X86,x86,FS);
99   GENOFFSET(X86,x86,GS);
100   GENOFFSET(X86,x86,SS);
101
102   // amd64
103   GENOFFSET(AMD64,amd64,RAX);
104   GENOFFSET(AMD64,amd64,RBX);
105   GENOFFSET(AMD64,amd64,RCX);
106   GENOFFSET(AMD64,amd64,RDX);
107   GENOFFSET(AMD64,amd64,RSI);
108   GENOFFSET(AMD64,amd64,RDI);
109   GENOFFSET(AMD64,amd64,RSP);
110   GENOFFSET(AMD64,amd64,RBP);
111   GENOFFSET(AMD64,amd64,R8);
112   GENOFFSET(AMD64,amd64,R9);
113   GENOFFSET(AMD64,amd64,R10);
114   GENOFFSET(AMD64,amd64,R11);
115   GENOFFSET(AMD64,amd64,R12);
116   GENOFFSET(AMD64,amd64,R13);
117   GENOFFSET(AMD64,amd64,R14);
118   GENOFFSET(AMD64,amd64,R15);
119   GENOFFSET(AMD64,amd64,RIP);
120
121   // ppc32
122   GENOFFSET(PPC32,ppc32,GPR0);
123   GENOFFSET(PPC32,ppc32,GPR1);
124   GENOFFSET(PPC32,ppc32,GPR2);
125   GENOFFSET(PPC32,ppc32,GPR3);
126   GENOFFSET(PPC32,ppc32,GPR4);
127   GENOFFSET(PPC32,ppc32,GPR5);
128   GENOFFSET(PPC32,ppc32,GPR6);
129   GENOFFSET(PPC32,ppc32,GPR7);
130   GENOFFSET(PPC32,ppc32,GPR8);
131   GENOFFSET(PPC32,ppc32,GPR9);
132   GENOFFSET(PPC32,ppc32,GPR10);
133   GENOFFSET(PPC32,ppc32,CIA);
134   GENOFFSET(PPC32,ppc32,CR0_0);
135
136   // ppc64
137   GENOFFSET(PPC64,ppc64,GPR0);
138   GENOFFSET(PPC64,ppc64,GPR1);
139   GENOFFSET(PPC64,ppc64,GPR2);
140   GENOFFSET(PPC64,ppc64,GPR3);
141   GENOFFSET(PPC64,ppc64,GPR4);
142   GENOFFSET(PPC64,ppc64,GPR5);
143   GENOFFSET(PPC64,ppc64,GPR6);
144   GENOFFSET(PPC64,ppc64,GPR7);
145   GENOFFSET(PPC64,ppc64,GPR8);
146   GENOFFSET(PPC64,ppc64,GPR9);
147   GENOFFSET(PPC64,ppc64,GPR10);
148   GENOFFSET(PPC64,ppc64,CIA);
149   GENOFFSET(PPC64,ppc64,CR0_0);
150
151   // arm
152   GENOFFSET(ARM,arm,R0);
153   GENOFFSET(ARM,arm,R1);
154   GENOFFSET(ARM,arm,R2);
155   GENOFFSET(ARM,arm,R3);
156   GENOFFSET(ARM,arm,R4);
157   GENOFFSET(ARM,arm,R5);
158   GENOFFSET(ARM,arm,R7);
159   GENOFFSET(ARM,arm,R13);
160   GENOFFSET(ARM,arm,R14);
161   GENOFFSET(ARM,arm,R15T);
162
163   // arm64
164   GENOFFSET(ARM64,arm64,X0);
165   GENOFFSET(ARM64,arm64,X1);
166   GENOFFSET(ARM64,arm64,X2);
167   GENOFFSET(ARM64,arm64,X3);
168   GENOFFSET(ARM64,arm64,X4);
169   GENOFFSET(ARM64,arm64,X5);
170   GENOFFSET(ARM64,arm64,X6);
171   GENOFFSET(ARM64,arm64,X7);
172   GENOFFSET(ARM64,arm64,X8);
173   GENOFFSET(ARM64,arm64,XSP);
174   GENOFFSET(ARM64,arm64,PC);
175
176   // s390x
177   GENOFFSET(S390X,s390x,r2);
178   GENOFFSET(S390X,s390x,r3);
179   GENOFFSET(S390X,s390x,r4);
180   GENOFFSET(S390X,s390x,r5);
181   GENOFFSET(S390X,s390x,r6);
182   GENOFFSET(S390X,s390x,r7);
183   GENOFFSET(S390X,s390x,r15);
184   GENOFFSET(S390X,s390x,IA);
185   GENOFFSET(S390X,s390x,SYSNO);
186   GENOFFSET(S390X,s390x,IP_AT_SYSCALL);
187   GENOFFSET(S390X,s390x,fpc);
188   GENOFFSET(S390X,s390x,CC_OP);
189   GENOFFSET(S390X,s390x,CC_DEP1);
190   GENOFFSET(S390X,s390x,CC_DEP2);
191   GENOFFSET(S390X,s390x,CC_NDEP);
192
193   // MIPS32
194   GENOFFSET(MIPS32,mips32,r0);
195   GENOFFSET(MIPS32,mips32,r1);
196   GENOFFSET(MIPS32,mips32,r2);
197   GENOFFSET(MIPS32,mips32,r3);
198   GENOFFSET(MIPS32,mips32,r4);
199   GENOFFSET(MIPS32,mips32,r5);
200   GENOFFSET(MIPS32,mips32,r6);
201   GENOFFSET(MIPS32,mips32,r7);
202   GENOFFSET(MIPS32,mips32,r8);
203   GENOFFSET(MIPS32,mips32,r9);
204   GENOFFSET(MIPS32,mips32,r10);
205   GENOFFSET(MIPS32,mips32,r11);
206   GENOFFSET(MIPS32,mips32,r12);
207   GENOFFSET(MIPS32,mips32,r13);
208   GENOFFSET(MIPS32,mips32,r14);
209   GENOFFSET(MIPS32,mips32,r15);
210   GENOFFSET(MIPS32,mips32,r15);
211   GENOFFSET(MIPS32,mips32,r17);
212   GENOFFSET(MIPS32,mips32,r18);
213   GENOFFSET(MIPS32,mips32,r19);
214   GENOFFSET(MIPS32,mips32,r20);
215   GENOFFSET(MIPS32,mips32,r21);
216   GENOFFSET(MIPS32,mips32,r22);
217   GENOFFSET(MIPS32,mips32,r23);
218   GENOFFSET(MIPS32,mips32,r24);
219   GENOFFSET(MIPS32,mips32,r25);
220   GENOFFSET(MIPS32,mips32,r26);
221   GENOFFSET(MIPS32,mips32,r27);
222   GENOFFSET(MIPS32,mips32,r28);
223   GENOFFSET(MIPS32,mips32,r29);
224   GENOFFSET(MIPS32,mips32,r30);
225   GENOFFSET(MIPS32,mips32,r31);
226   GENOFFSET(MIPS32,mips32,PC);
227   GENOFFSET(MIPS32,mips32,HI);
228   GENOFFSET(MIPS32,mips32,LO);
229
230   // MIPS64
231   GENOFFSET(MIPS64,mips64,r0);
232   GENOFFSET(MIPS64,mips64,r1);
233   GENOFFSET(MIPS64,mips64,r2);
234   GENOFFSET(MIPS64,mips64,r3);
235   GENOFFSET(MIPS64,mips64,r4);
236   GENOFFSET(MIPS64,mips64,r5);
237   GENOFFSET(MIPS64,mips64,r6);
238   GENOFFSET(MIPS64,mips64,r7);
239   GENOFFSET(MIPS64,mips64,r8);
240   GENOFFSET(MIPS64,mips64,r9);
241   GENOFFSET(MIPS64,mips64,r10);
242   GENOFFSET(MIPS64,mips64,r11);
243   GENOFFSET(MIPS64,mips64,r12);
244   GENOFFSET(MIPS64,mips64,r13);
245   GENOFFSET(MIPS64,mips64,r14);
246   GENOFFSET(MIPS64,mips64,r15);
247   GENOFFSET(MIPS64,mips64,r15);
248   GENOFFSET(MIPS64,mips64,r17);
249   GENOFFSET(MIPS64,mips64,r18);
250   GENOFFSET(MIPS64,mips64,r19);
251   GENOFFSET(MIPS64,mips64,r20);
252   GENOFFSET(MIPS64,mips64,r21);
253   GENOFFSET(MIPS64,mips64,r22);
254   GENOFFSET(MIPS64,mips64,r23);
255   GENOFFSET(MIPS64,mips64,r24);
256   GENOFFSET(MIPS64,mips64,r25);
257   GENOFFSET(MIPS64,mips64,r26);
258   GENOFFSET(MIPS64,mips64,r27);
259   GENOFFSET(MIPS64,mips64,r28);
260   GENOFFSET(MIPS64,mips64,r29);
261   GENOFFSET(MIPS64,mips64,r30);
262   GENOFFSET(MIPS64,mips64,r31);
263   GENOFFSET(MIPS64,mips64,PC);
264   GENOFFSET(MIPS64,mips64,HI);
265   GENOFFSET(MIPS64,mips64,LO);
266}
267
268/*--------------------------------------------------------------------*/
269/*--- end                                             genoffsets.c ---*/
270/*--------------------------------------------------------------------*/
271