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