genoffsets.c revision d2dc14a515b7d1b8ede72c6c8db5e04395576769
12825ac47817cec603c74d7224981560299c1a3basewardj
27bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--------------------------------------------------------------------*/
37bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*---                                                              ---*/
47bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--- This file (auxprogs/genoffsets.c) is                         ---*/
57bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--- Copyright (C) OpenWorks LLP.  All rights reserved.           ---*/
67bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*---                                                              ---*/
77bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*--------------------------------------------------------------------*/
87bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
97bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj/*
107bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This file is part of LibVEX, a library for dynamic binary
117bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   instrumentation and translation.
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
13a26d820966b130a3227b2dfc087b7a87beaf24besewardj   Copyright (C) 2004-2008 OpenWorks LLP.  All rights reserved.
147bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
157bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This library is made available under a dual licensing scheme.
167bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   If you link LibVEX against other code all of which is itself
187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   licensed under the GNU General Public License, version 2 dated June
197bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL
207bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   v2, as appearing in the file LICENSE.GPL.  If the file LICENSE.GPL
217bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   is missing, you can obtain a copy of the GPL v2 from the Free
227bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA
237bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
247bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
257bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   For any other uses of LibVEX, you must first obtain a commercial
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   license from OpenWorks LLP.  Please contact info@open-works.co.uk
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   for information about commercial licensing.
287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
297bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This software is provided by OpenWorks LLP "as is" and any express
307bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   or implied warranties, including, but not limited to, the implied
317bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   warranties of merchantability and fitness for a particular purpose
327bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   are disclaimed.  In no event shall OpenWorks LLP be liable for any
337bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   direct, indirect, incidental, special, exemplary, or consequential
347bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   damages (including, but not limited to, procurement of substitute
357bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   goods or services; loss of use, data, or profits; or business
367bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   interruption) however caused and on any theory of liability,
377bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   whether in contract, strict liability, or tort (including
387bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   negligence or otherwise) arising in any way out of the use of this
397bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   software, even if advised of the possibility of such damage.
407bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
417bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Neither the names of the U.S. Department of Energy nor the
427bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   University of California nor the names of its contributors may be
437bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   used to endorse or promote products derived from this software
447bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   without prior written permission.
457bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj*/
467bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
472825ac47817cec603c74d7224981560299c1a3basewardj#include <stdio.h>
482825ac47817cec603c74d7224981560299c1a3basewardj
49ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj/* A program which, when compiled to assembly, exposes various guest
50ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   state offsets.  The program isn't executed, since that breaks
51d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   cross-compilation.
52d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj
53d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   It does rely on the assumption that 'my_offsetof(Ty,Field)' is
54d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   folded to a constant at a compile time, which seems a bit dodgy
55d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   to me.  On gcc4 it is possible to use __builtin_offsetof, which
56d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj   sounds safer, but that doesn't exist on older gccs.  Oh Well.
57d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj*/
582825ac47817cec603c74d7224981560299c1a3basewardj
592825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_basictypes.h"
602825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_guest_x86.h"
618137b5baebea1d3e145ecc2ad56b871988aae167sewardj#include "../pub/libvex_guest_amd64.h"
62ed623dbefb52ca3211490d656abc999a129df060cerion#include "../pub/libvex_guest_ppc32.h"
63d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#include "../pub/libvex_guest_ppc64.h"
642825ac47817cec603c74d7224981560299c1a3basewardj
65ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFZ(__str)  #__str
66ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFY(__str)  VG_STRINGIFZ(__str)
67ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
68d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj#define my_offsetof(__type,__field) (&((__type*)0)->__field)
69d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj
70d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj/* This forces gcc to evaluate the my_offsetof call at compile time,
71ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   and then emits it in the assembly, along with the nonsense string
72ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   "xyzzy", for easy greppability.  Once this file is compiled to
73ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   assembly, the lines containing "xyzzy" are grepped out and sed-ed
74ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   to produce the final result.  See the Makefile rule for
75ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   pub/libvex_guest_offsets.h. */
76ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define GENOFFSET(_structUppercase,_structLowercase,_fieldname)  \
77ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   __asm__ __volatile__ ( \
78ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      "\n#define OFFSET_" \
79ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      VG_STRINGIFY(_structLowercase) "_" \
80ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      VG_STRINGIFY(_fieldname) \
81ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj      " xyzzy%0\n" : /*out*/ \
82ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj                   : /*in*/ "n" \
83d2dc14a515b7d1b8ede72c6c8db5e04395576769sewardj         (my_offsetof(VexGuest##_structUppercase##State, \
84ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj          guest_##_fieldname)) \
85ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   )
86ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
87ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void );
88ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj__attribute__((noinline))
89ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void )
902825ac47817cec603c74d7224981560299c1a3basewardj{
91ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // x86
92ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EAX);
93ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EBX);
94ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ECX);
95ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EDX);
96ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ESI);
97ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EDI);
98ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EBP);
99ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ESP);
100ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,EIP);
101ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,CS);
102ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,DS);
103ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,ES);
104ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,FS);
105ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,GS);
106ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(X86,x86,SS);
107ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
108ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // amd64
109ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RAX);
110ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RBX);
111ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RCX);
112ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RDX);
113ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RSI);
114ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RDI);
115ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RSP);
116ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RBP);
117ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R8);
118ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R9);
119ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R10);
120ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R11);
121ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R12);
122ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R13);
123ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R14);
124ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,R15);
125ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(AMD64,amd64,RIP);
126ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
127ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // ppc32
128ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR0);
129ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR2);
130ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR3);
131ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR4);
132ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR5);
133ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR6);
134ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR7);
135ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR8);
136ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR9);
137ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,GPR10);
138ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,CIA);
139ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC32,ppc32,CR0_0);
140ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj
141ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   // ppc64
142ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR0);
143ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR2);
144ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR3);
145ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR4);
146ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR5);
147ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR6);
148ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR7);
149ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR8);
150ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR9);
151ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,GPR10);
152ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,CIA);
153ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj   GENOFFSET(PPC64,ppc64,CR0_0);
1542825ac47817cec603c74d7224981560299c1a3basewardj}
155