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
78void foo ( void );
79__attribute__((noinline))
80void 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