1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin libvex.h ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Copyright (C) 2004-2011 OpenWorks LLP 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info@open-works.net 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02110-1301, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Neither the names of the U.S. Department of Energy nor the 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown University of California nor the names of its contributors may be 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used to endorse or promote products derived from this software 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown without prior written permission. 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __LIBVEX_H 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __LIBVEX_H 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_ir.h" 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- This file defines the top-level interface to LibVEX. ---*/ 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Architectures, variants, and other arch info ---*/ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum { 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArch_INVALID, 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchX86, 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchAMD64, 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchARM, 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchPPC32, 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VexArchPPC64, 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VexArchS390X 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArch; 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* For a given architecture, these specify extra capabilities beyond 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the minimum supported (baseline) capabilities. They may be OR'd 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown together, although some combinations don't make sense. (eg, SSE2 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown but not SSE1). LibVEX_Translate will check for nonsensical 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown combinations. */ 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* x86: baseline capability is Pentium-1 (FPU, MMX, but no SSE), with 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmpxchg8b. */ 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE1 (1<<1) /* SSE1 support (Pentium III) */ 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE2 (1<<2) /* SSE2 support (Pentium 4) */ 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE3 (1<<3) /* SSE3 support (>= Prescott) */ 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_LZCNT (1<<4) /* SSE4a LZCNT insn */ 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* amd64: baseline capability is SSE2, with cmpxchg8b but not 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown cmpxchg16b. */ 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_SSE3 (1<<5) /* SSE3 support */ 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_CX16 (1<<6) /* cmpxchg16b support */ 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_LZCNT (1<<7) /* SSE4a LZCNT insn */ 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ppc32: baseline capability is integer only */ 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_F (1<<8) /* basic (non-optional) FP */ 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_V (1<<9) /* Altivec (VMX) */ 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_FX (1<<10) /* FP extns (fsqrt, fsqrts) */ 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_GX (1<<11) /* Graphics extns 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (fres,frsqrte,fsel,stfiwx) */ 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC32_VX (1<<12) /* Vector-scalar floating-point (VSX); implies ISA 2.06 or higher */ 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ppc64: baseline capability is integer and basic FP insns */ 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_V (1<<13) /* Altivec (VMX) */ 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_FX (1<<14) /* FP extns (fsqrt, fsqrts) */ 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_GX (1<<15) /* Graphics extns 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (fres,frsqrte,fsel,stfiwx) */ 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_VX (1<<16) /* Vector-scalar floating-point (VSX); implies ISA 2.06 or higher */ 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* s390x: Hardware capability encoding 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Bits Information 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [26:31] Machine model 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [25] Long displacement facility 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [24] Extended-immediate facility 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [23] General-instruction-extension facility 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [22] Decimal floating point facility 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [21] FPR-GR transfer facility 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov [0:20] Currently unused; reserved for future use 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/ 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Model numbers must be assigned in chronological order. 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov They are used as array index. */ 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z900 0 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z800 1 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z990 2 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z890 3 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z9_EC 4 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z9_BC 5 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z10_EC 6 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z10_BC 7 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z196 8 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z114 9 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_INVALID 10 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_MASK 0x3F 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_LDISP (1<<6) /* Long-displacement facility */ 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_EIMM (1<<7) /* Extended-immediate facility */ 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_GIE (1<<8) /* General-instruction-extension facility */ 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_DFP (1<<9) /* Decimal floating point facility */ 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_FGX (1<<10) /* FPR-GR transfer facility */ 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Special value representing all available s390x hwcaps */ 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_ALL (VEX_HWCAPS_S390X_LDISP | \ 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VEX_HWCAPS_S390X_EIMM | \ 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VEX_HWCAPS_S390X_GIE | \ 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VEX_HWCAPS_S390X_DFP | \ 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VEX_HWCAPS_S390X_FGX) 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X(x) ((x) & ~VEX_S390X_MODEL_MASK) 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL(x) ((x) & VEX_S390X_MODEL_MASK) 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* arm: baseline capability is ARMv4 */ 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Bits 5:0 - architecture level (e.g. 5 for v5, 6 for v6 etc) */ 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP (1<<6) /* VFP extension */ 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP2 (1<<7) /* VFPv2 */ 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP3 (1<<8) /* VFPv3 */ 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Bits 15:10 reserved for (possible) future VFP revisions */ 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_NEON (1<<16) /* Advanced SIMD also known as NEON */ 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Get an ARM architecure level from HWCAPS */ 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_ARM_ARCHLEVEL(x) ((x) & 0x3f) 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These return statically allocated strings. */ 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const HChar* LibVEX_ppVexArch ( VexArch ); 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const HChar* LibVEX_ppVexHwCaps ( VexArch, UInt ); 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This struct is a bit of a hack, but is needed to carry misc 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown important bits of info about an arch. Fields which are meaningless 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown or ignored for the platform in question should be set to zero. */ 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* This is the only mandatory field. */ 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt hwcaps; 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC32/PPC64 only: size of cache line */ 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int ppc_cache_line_szB; 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC32/PPC64 only: sizes zeroed by the dcbz/dcbzl instructions 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * (bug#135264) */ 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt ppc_dcbz_szB; 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UInt ppc_dcbzl_szB; /* 0 means unsupported (SIGILL) */ 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchInfo; 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write default settings info *vai. */ 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ); 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This struct carries guest and host ABI variant information that may 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown be needed. Fields which are meaningless or ignored for the 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown platform in question should be set to zero. 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Settings which are believed to be correct are: 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_stack_redzone_size 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-linux ==> 0 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-linux ==> 288 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-aix5 ==> 220 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-aix5 ==> unknown 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is amd64-linux ==> 128 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_amd64_assume_fs_is_zero 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is amd64-linux ==> True 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is amd64-darwin ==> False 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_amd64_assume_gs_is_0x60 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is amd64-darwin ==> True 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is amd64-linux ==> False 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_ppc_zap_RZ_at_blr 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-linux ==> True 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-linux ==> False 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-aix5 ==> unknown 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-aix5 ==> False 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_ppc_zap_RZ_at_bl 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-linux ==> const True 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-linux ==> const False 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc64-aix5 ==> unknown 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-aix5 ==> True except for calls to 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown millicode, $SAVEFn, $RESTFn 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest_ppc_sc_continues_at_LR: 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-aix5 or ppc64-aix5 ==> True 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is ppc32-linux or ppc64-linux ==> False 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest is other ==> inapplicable 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host_ppc_calls_use_fndescrs: 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is ppc32-linux ==> False 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is ppc64-linux ==> True 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is ppc32-aix5 or ppc64-aix5 ==> True 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is other ==> inapplicable 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host_ppc32_regalign_int64_args: 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is ppc32-linux ==> True 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is ppc32-aix5 ==> False 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown host is other ==> inapplicable 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC and AMD64 GUESTS only: how many bytes below the 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack pointer are validly addressible? */ 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int guest_stack_redzone_size; 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* AMD64 GUESTS only: should we translate %fs-prefixed 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown instructions using the assumption that %fs always contains 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero? */ 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool guest_amd64_assume_fs_is_zero; 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* AMD64 GUESTS only: should we translate %gs-prefixed 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown instructions using the assumption that %gs always contains 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0x60? */ 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool guest_amd64_assume_gs_is_0x60; 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC GUESTS only: should we zap the stack red zone at a 'blr' 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (function return) ? */ 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool guest_ppc_zap_RZ_at_blr; 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC GUESTS only: should we zap the stack red zone at a 'bl' 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (function call) ? Is supplied with the guest address of the 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown target of the call since that may be significant. If NULL, 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown is assumed equivalent to a fn which always returns False. */ 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool (*guest_ppc_zap_RZ_at_bl)(Addr64); 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC32/PPC64 GUESTS only: where does the kernel resume after 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 'sc'? False => Linux style, at the next insn. True => AIX 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown style, at the address stated in the link register. */ 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool guest_ppc_sc_continues_at_LR; 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC32/PPC64 HOSTS only: does '&f' give us a pointer to a 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown function descriptor on the host, or to the function code 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown itself? True => descriptor, False => code. */ 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool host_ppc_calls_use_fndescrs; 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* PPC32 HOSTS only: when generating code to pass a 64-bit value 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (actual parameter) in a pair of regs, should we skip an arg 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown reg if it is even-numbered? True => yes, False => no. */ 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool host_ppc32_regalign_int64_args; 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexAbiInfo; 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write default settings info *vbi. */ 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi ); 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Control of Vex's optimiser (iropt). ---*/ 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Control of Vex's optimiser. */ 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Controls verbosity of iropt. 0 = no output. */ 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int iropt_verbosity; 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Control aggressiveness of iropt. 0 = no opt, 1 = simple 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown opts, 2 (default) = max optimisation. */ 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int iropt_level; 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Ensure all integer registers are up to date at potential 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown memory exception points? True(default)=yes, False=no, only 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the guest's stack pointer. */ 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool iropt_precise_memory_exns; 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* How aggressive should iropt be in unrolling loops? Higher 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown numbers make it more enthusiastic about loop unrolling. 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Default=120. A setting of zero disables unrolling. */ 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int iropt_unroll_thresh; 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* What's the maximum basic block length the front end(s) allow? 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown BBs longer than this are split up. Default=50 (guest 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown insns). */ 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int guest_max_insns; 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* How aggressive should front ends be in following 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unconditional branches to known destinations? Default=10, 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown meaning that if a block contains less than 10 guest insns so 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown far, the front end(s) will attempt to chase into its 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown successor. A setting of zero disables chasing. */ 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int guest_chase_thresh; 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* EXPERIMENTAL: chase across conditional branches? Not all 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown front ends honour this. Default: NO. */ 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool guest_chase_cond; 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexControl; 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write the default settings into *vcon. */ 324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon ); 327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Storage management control ---*/ 331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate in Vex's temporary allocation area. Be careful with this. 334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You can only call it inside an instrumentation or optimisation 335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown callback that you have previously specified in a call to 336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LibVEX_Translate. The storage allocated will only stay alive until 337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown translation of the current basic block is complete. 338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_first; 340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_curr; 341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_last; 342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void private_LibVEX_alloc_OOM(void) __attribute__((noreturn)); 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void* LibVEX_Alloc ( Int nbytes ) 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Nasty debugging hack, do not use. */ 348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return malloc(nbytes); 349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HChar* curr; 351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown HChar* next; 352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int ALIGN; 353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ALIGN = sizeof(void*)-1; 354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown nbytes = (nbytes + ALIGN) & ~ALIGN; 355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown curr = private_LibVEX_alloc_curr; 356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown next = curr + nbytes; 357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (next >= private_LibVEX_alloc_last) 358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown private_LibVEX_alloc_OOM(); 359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown private_LibVEX_alloc_curr = next; 360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return curr; 361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Show Vex allocation statistics. */ 365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_ShowAllocStats ( void ); 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Describing guest state layout ---*/ 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describe the guest state enough that the instrumentation 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown functions can work. */ 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The max number of guest state chunks which we can describe as 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown always defined (for the benefit of Memcheck). */ 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEXGLO_N_ALWAYSDEFD 24 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Total size of the guest state, in bytes. Must be 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8-aligned. */ 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int total_sizeB; 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Whereabouts is the stack pointer? */ 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int offset_SP; 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sizeof_SP; /* 4 or 8 */ 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Whereabouts is the frame pointer? */ 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int offset_FP; 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sizeof_FP; /* 4 or 8 */ 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Whereabouts is the instruction pointer? */ 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int offset_IP; 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int sizeof_IP; /* 4 or 8 */ 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Describe parts of the guest state regarded as 'always 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown defined'. */ 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int n_alwaysDefd; 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int offset; 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int size; 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } alwaysDefd[VEXGLO_N_ALWAYSDEFD]; 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestLayout; 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A note about guest state layout. 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LibVEX defines the layout for the guest state, in the file 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown pub/libvex_guest_<arch>.h. The struct will have an 16-aligned 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown size. Each translated bb is assumed to be entered with a specified 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown register pointing at such a struct. Beyond that is two copies of 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the shadow state area with the same size as the struct. Beyond 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown that is a spill area that LibVEX may spill into. It must have size 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown LibVEX_N_SPILL_BYTES, and this must be a 16-aligned number. 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown On entry, the baseblock pointer register must be 16-aligned. 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown There must be no holes in between the primary guest state, its two 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown copies, and the spill area. In short, all 4 areas must have a 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16-aligned size and be 16-aligned, and placed back-to-back. 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LibVEX_N_SPILL_BYTES 4096 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Initialisation of the library ---*/ 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Initialise the library. You must call this first. */ 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_Init ( 430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* failure exit function */ 432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# if __cplusplus == 1 && __GNUC__ && __GNUC__ <= 3 433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* g++ 3.x doesn't understand attributes on function parameters. 434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov See #265762. */ 435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# else 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __attribute__ ((noreturn)) 437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov# endif 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*failure_exit) ( void ), 439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* logging output function */ 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void (*log_bytes) ( HChar*, Int nbytes ), 442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* debug paranoia level */ 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int debuglevel, 445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Are we supporting valgrind checking? */ 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool valgrind_support, 448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Control ... */ 450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*READONLY*/VexControl* vcon 451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown); 452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Make a translation ---*/ 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describes the outcome of a translation attempt. */ 459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct { 461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* overall status */ 462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov enum { VexTransOK, 463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VexTransAccessFail, VexTransOutputFull } status; 464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* The number of extents that have a self-check (0 to 3) */ 465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt n_sc_extents; 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexTranslateResult; 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describes precisely the pieces of guest code that a translation 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown covers. Now that Vex can chase across BB boundaries, the old 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown scheme of describing a chunk of guest code merely by its start 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown address and length is inadequate. 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Hopefully this struct is only 32 bytes long. Space is important as 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown clients will have to store one of these for each translation made. 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr64 base[3]; 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UShort len[3]; 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UShort n_used; 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestExtents; 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A structure to carry arguments for LibVEX_Translate. There are so 488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown many of them, it seems better to have a structure. */ 489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: The instruction sets we are translating from and to. And 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest/host misc info. */ 493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArch arch_guest; 494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchInfo archinfo_guest; 495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArch arch_host; 496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexArchInfo archinfo_host; 497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexAbiInfo abiinfo_both; 498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: an opaque value which is passed as the first arg to all 500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown callback functions supplied in this struct. Vex has no idea 501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown what's at the other end of this pointer. */ 502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* callback_opaque; 503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: the block to translate, and its guest address. */ 505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* where are the actual bytes in the host's address space? */ 506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar* guest_bytes; 507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* where do the bytes really come from in the guest's aspace? 508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This is the post-redirection guest address. Not that Vex 509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown understands anything about redirection; that is all done on 510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the Valgrind side. */ 511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Addr64 guest_bytes_addr; 512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Is it OK to chase into this guest address? May not be 514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NULL. */ 515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool (*chase_into_ok) ( /*callback_opaque*/void*, Addr64 ); 516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* OUT: which bits of guest code actually got translated */ 518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestExtents* guest_extents; 519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: a place to put the resulting code, and its size */ 521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown UChar* host_bytes; 522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int host_bytes_size; 523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* OUT: how much of the output area is used. */ 524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int* host_bytes_used; 525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: optionally, two instrumentation functions. May be 527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown NULL. */ 528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRSB* (*instrument1) ( /*callback_opaque*/void*, 529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRSB*, 530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestLayout*, 531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestExtents*, 532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRType gWordTy, IRType hWordTy ); 533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRSB* (*instrument2) ( /*callback_opaque*/void*, 534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRSB*, 535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestLayout*, 536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestExtents*, 537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRType gWordTy, IRType hWordTy ); 538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown IRSB* (*finaltidy) ( IRSB* ); 540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* IN: a callback used to ask the caller which of the extents, 542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if any, a self check is required for. Must not be NULL. 543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov The returned value is a bitmask with a 1 in position i indicating 544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov that the i'th extent needs a check. Since there can be at most 545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 3 extents, the returned values must be between 0 and 7. */ 546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt (*needs_self_check)( /*callback_opaque*/void*, 547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov VexGuestExtents* ); 548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: optionally, a callback which allows the caller to add its 550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown own IR preamble following the self-check and any other 551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VEX-generated preamble, if any. May be NULL. If non-NULL, 552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the IRSB under construction is handed to this function, which 553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown presumably adds IR statements to it. The callback may 554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown optionally complete the block and direct bb_to_IR not to 555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown disassemble any instructions into it; this is indicated by 556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the callback returning True. 557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Bool (*preamble_function)(/*callback_opaque*/void*, IRSB*); 559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* IN: debug: trace vex activity at various points */ 561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Int traceflags; 562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov /* IN: address of the dispatcher entry points. Describes the 564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov places where generated code should jump to at the end of each 565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bb. 566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown At the end of each translation, the next guest address is 568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown placed in the host's standard return register (x86: %eax, 569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown amd64: %rax, ppc32: %r3, ppc64: %r3). Optionally, the guest 570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown state pointer register (on host x86: %ebp; amd64: %rbp; 571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppc32/64: r31) may be set to a VEX_TRC_ value to indicate any 572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown special action required before the next block is run. 573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Control is then passed back to the dispatcher (beyond Vex's 575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown control; caller supplies this) in the following way: 576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - On host archs which lack a link register (x86, amd64), by a 578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov jump to the host address specified in 579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 'dispatcher_assisted', if the guest state pointer has been 580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov changed so as to request some action before the next block 581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov is run, or 'dispatcher_unassisted' (the fast path), in 582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov which it is assumed that the guest state pointer is 583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov unchanged and we wish to continue directly with the next 584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov translation. Both of these must be non-NULL. 585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown - On host archs which have a link register (ppc32, ppc64), by 587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a branch to the link register (which is guaranteed to be 588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unchanged from whatever it was at entry to the 589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov translation). 'dispatch_assisted' and 590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 'dispatch_unassisted' must be NULL. 591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The aim is to get back and forth between translations and the 593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown dispatcher without creating memory traffic to store return 594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown addresses. 595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void* dispatch_unassisted; 597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov void* dispatch_assisted; 598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexTranslateArgs; 600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVexTranslateResult LibVEX_Translate ( VexTranslateArgs* ); 604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A subtlety re interaction between self-checking translations and 606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bb-chasing. The supplied chase_into_ok function should say NO 607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (False) when presented with any address for which you might want to 608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown make a self-checking translation. 609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown If it doesn't do that, you may end up with Vex chasing from BB #1 611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to BB #2 (fine); but if you wanted checking for #2 and not #1, that 612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown would not be the result. Therefore chase_into_ok should disallow 613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown following into #2. That will force the caller to eventually 614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown request a new translation starting at #2, at which point Vex will 615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown correctly observe the make-a-self-check flag. */ 616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Show accumulated statistics ---*/ 620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_ShowStats ( void ); 623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Notes ---*/ 627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/ 628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Code generation conventions that need to be recorded somewhere. 630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown x86 633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~ 634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Generated code should be entered using a JMP instruction. On 635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown entry, %ebp should point to the guest state, and %esp should be a 636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown valid stack pointer. The generated code may change %eax, %ebx, 637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown %ecx, %edx, %esi, %edi, all the FP registers and control state, and 638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown all the XMM registers. 639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown On entry, the FPU control word should be set to 0x027F, and the SSE 641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown control word (%mxcsr) should be set to 0x1F80. On exit, they 642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown should still have those values (after masking off the lowest 6 bits 643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown of %mxcsr). If they don't, there is a bug in VEX-generated code. 644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Generated code returns to the scheduler using a JMP instruction, to 646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the address specified in the .dispatch field of VexTranslateArgs. 647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown %eax (or %eax:%edx, if simulating a 64-bit target) will contain the 648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest address of the next block to execute. %ebp may be changed 649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown to a VEX_TRC_ value, otherwise it should be as it was at entry. 650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown CRITICAL ISSUES in x86 code generation. The only known critical 652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown issue is that the host FPU and SSE state is not properly saved 653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown across calls to helper functions. If any helper references any 654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown such state, it is likely (1) to misbehave itself, since the FP 655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown stack tags will not be as expected, and (2) after returning to 656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown generated code, the generated code is likely to go wrong. This 657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown really should be fixed. 658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown amd64 660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~~~ 661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Analogous to x86. 662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppc32 664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~~~ 665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown On entry, guest state pointer is r31. .dispatch must be NULL. 666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Control is returned with a branch to the link register. Generated 667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown code will not change lr. At return, r3 holds the next guest addr 668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (or r3:r4 ?). r31 may be may be changed to a VEX_TRC_ value, 669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown otherwise it should be as it was at entry. 670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ppc64 672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~~~ 673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Same as ppc32. 674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ALL GUEST ARCHITECTURES 676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ~~~~~~~~~~~~~~~~~~~~~~~ 677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The guest state must contain two pseudo-registers, guest_TISTART 678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown and guest_TILEN. These are used to pass the address of areas of 679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest code, translations of which are to be invalidated, back to 680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the despatcher. Both pseudo-regs must have size equal to the guest 681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown word size. 682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The architecture must a third pseudo-register, guest_NRADDR, also 684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown guest-word-sized. This is used to record the unredirected guest 685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown address at the start of a translation whose start has been 686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown redirected. By reading this pseudo-register shortly afterwards, 687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown the translation can find out what the corresponding no-redirection 688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown address was. Note, this is only set for wrap-style redirects, not 689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for replace-style ones. 690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __LIBVEX_H */ 692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- libvex.h ---*/ 695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 696