genoffsets.c revision ba69ffbb2336c0082c1c5fbb59af8c361155f92b
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 51ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj cross-compilation. */ 522825ac47817cec603c74d7224981560299c1a3basewardj 532825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_basictypes.h" 542825ac47817cec603c74d7224981560299c1a3basewardj#include "../pub/libvex_guest_x86.h" 558137b5baebea1d3e145ecc2ad56b871988aae167sewardj#include "../pub/libvex_guest_amd64.h" 56ed623dbefb52ca3211490d656abc999a129df060cerion#include "../pub/libvex_guest_ppc32.h" 57d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#include "../pub/libvex_guest_ppc64.h" 582825ac47817cec603c74d7224981560299c1a3basewardj 59ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFZ(__str) #__str 60ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define VG_STRINGIFY(__str) VG_STRINGIFZ(__str) 61ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj 62ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj/* This forces gcc to evaluate the __builtin_offset at compile time, 63ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj and then emits it in the assembly, along with the nonsense string 64ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj "xyzzy", for easy greppability. Once this file is compiled to 65ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj assembly, the lines containing "xyzzy" are grepped out and sed-ed 66ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj to produce the final result. See the Makefile rule for 67ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj pub/libvex_guest_offsets.h. */ 68ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj#define GENOFFSET(_structUppercase,_structLowercase,_fieldname) \ 69ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj __asm__ __volatile__ ( \ 70ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj "\n#define OFFSET_" \ 71ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj VG_STRINGIFY(_structLowercase) "_" \ 72ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj VG_STRINGIFY(_fieldname) \ 73ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj " xyzzy%0\n" : /*out*/ \ 74ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj : /*in*/ "n" \ 75ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj (__builtin_offsetof(VexGuest##_structUppercase##State, \ 76ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj guest_##_fieldname)) \ 77ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj ) 78ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj 79ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void ); 80ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj__attribute__((noinline)) 81ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardjvoid foo ( void ) 822825ac47817cec603c74d7224981560299c1a3basewardj{ 83ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj // x86 84ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EAX); 85ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EBX); 86ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,ECX); 87ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EDX); 88ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,ESI); 89ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EDI); 90ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EBP); 91ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,ESP); 92ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,EIP); 93ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,CS); 94ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,DS); 95ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,ES); 96ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,FS); 97ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,GS); 98ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(X86,x86,SS); 99ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj 100ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj // amd64 101ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RAX); 102ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RBX); 103ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RCX); 104ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RDX); 105ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RSI); 106ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RDI); 107ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RSP); 108ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RBP); 109ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R8); 110ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R9); 111ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R10); 112ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R11); 113ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R12); 114ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R13); 115ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R14); 116ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,R15); 117ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(AMD64,amd64,RIP); 118ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj 119ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj // ppc32 120ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR0); 121ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR2); 122ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR3); 123ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR4); 124ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR5); 125ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR6); 126ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR7); 127ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR8); 128ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR9); 129ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,GPR10); 130ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,CIA); 131ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC32,ppc32,CR0_0); 132ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj 133ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj // ppc64 134ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR0); 135ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR2); 136ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR3); 137ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR4); 138ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR5); 139ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR6); 140ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR7); 141ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR8); 142ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR9); 143ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,GPR10); 144ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,CIA); 145ba69ffbb2336c0082c1c5fbb59af8c361155f92bsewardj GENOFFSET(PPC64,ppc64,CR0_0); 1462825ac47817cec603c74d7224981560299c1a3basewardj} 147