1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin libvex_guest_amd64.h ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2004-2013 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_PUB_GUEST_AMD64_H 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __LIBVEX_PUB_GUEST_AMD64_H 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Vex's representation of the AMD64 CPU state. ---*/ 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* See detailed comments at the top of libvex_guest_x86.h for 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown further info. This representation closely follows the 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown x86 representation. 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Event check fail addr, counter, and padding to make RAX 16 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng aligned. */ 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 0 */ ULong host_EvC_FAILADDR; 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 8 */ UInt host_EvC_COUNTER; 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 12 */ UInt pad0; 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 16 */ ULong guest_RAX; 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 24 */ ULong guest_RCX; 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 32 */ ULong guest_RDX; 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 40 */ ULong guest_RBX; 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 48 */ ULong guest_RSP; 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 56 */ ULong guest_RBP; 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 64 */ ULong guest_RSI; 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 72 */ ULong guest_RDI; 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 80 */ ULong guest_R8; 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 88 */ ULong guest_R9; 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 96 */ ULong guest_R10; 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 104 */ ULong guest_R11; 71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 112 */ ULong guest_R12; 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 120 */ ULong guest_R13; 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 128 */ ULong guest_R14; 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 136 */ ULong guest_R15; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 4-word thunk used to calculate O S Z A C P flags. */ 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 144 */ ULong guest_CC_OP; 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 152 */ ULong guest_CC_DEP1; 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 160 */ ULong guest_CC_DEP2; 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 168 */ ULong guest_CC_NDEP; 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* The D flag is stored here, encoded as either -1 or +1 */ 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 176 */ ULong guest_DFLAG; 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 184 */ ULong guest_RIP; 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Bit 18 (AC) of eflags stored here, as either 0 or 1. */ 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ... */ ULong guest_ACFLAG; 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Bit 21 (ID) of eflags stored here, as either 0 or 1. */ 86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 192 */ ULong guest_IDFLAG; 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Probably a lot more stuff too. 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown D,ID flags 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 16 128-bit SSE registers 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown all the old x87 FPU gunk 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown segment registers */ 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* HACK to make tls on amd64-linux work. %fs only ever seems to 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown hold zero, and so guest_FS_ZERO holds the 64-bit offset 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown associated with a %fs value of zero. */ 96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 200 */ ULong guest_FS_ZERO; 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* YMM registers. Note that these must be allocated 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown consecutively in order that the SSE4.2 PCMP{E,I}STR{I,M} 100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng helpers can treat them as an array. YMM16 is a fake reg used 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown as an intermediary in handling aforementioned insns. */ 102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 208 */ULong guest_SSEROUND; 103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* 216 */U256 guest_YMM0; 104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM1; 105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM2; 106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM3; 107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM4; 108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM5; 109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM6; 110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM7; 111663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM8; 112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM9; 113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM10; 114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM11; 115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM12; 116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM13; 117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM14; 118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM15; 119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng U256 guest_YMM16; 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* FPU */ 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Note. Setting guest_FTOP to be ULong messes up the 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown delicately-balanced PutI/GetI optimisation machinery. 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Therefore best to leave it as a UInt. */ 125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UInt guest_FTOP; 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong guest_FPREG[8]; 127663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UChar guest_FPTAG[8]; 128663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong guest_FPROUND; 129663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong guest_FC3210; 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov /* Emulation notes */ 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov UInt guest_EMNOTE; 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Translation-invalidation area description. Not used on amd64 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (there is no invalidate-icache insn), but needed so as to 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown allow users of the library to uniformly assume that the guest 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown state contains these two fields -- otherwise there is 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown compilation breakage. On amd64, these two fields are set to 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown zero by LibVEX_GuestAMD64_initialise and then should be 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ignored forever thereafter. */ 141eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov ULong guest_CMSTART; 142eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov ULong guest_CMLEN; 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Used to record the unredirected guest address at the start of 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a translation whose start has been redirected. By reading 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown this pseudo-register shortly afterwards, the translation can 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown find out what the corresponding no-redirection address was. 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Note, this is only set for wrap-style redirects, not for 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown replace-style ones. */ 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong guest_NRADDR; 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Used for Darwin syscall dispatching. */ 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong guest_SC_CLASS; 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* HACK to make tls on darwin work. %gs only ever seems to 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown hold 0x60, and so guest_GS_0x60 holds the 64-bit offset 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown associated with a %gs value of 0x60. (A direct analogue 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown of the %fs-zero hack for amd64-linux). */ 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong guest_GS_0x60; 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Needed for Darwin (but mandated for all guest architectures): 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown RIP at the last syscall insn (int 0x80/81/82, sysenter, 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown syscall). Used when backing up to restart a syscall that has 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown been interrupted by a signal. */ 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ULong guest_IP_AT_SYSCALL; 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* Padding to make it have an 16-aligned size */ 168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ULong pad1; 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VexGuestAMD64State; 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Utility functions for amd64 guest stuff. ---*/ 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ALL THE FOLLOWING ARE VISIBLE TO LIBRARY CLIENT */ 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Initialise all guest amd64 state. The FPU is put in default 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mode. */ 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestAMD64_initialise ( /*OUT*/VexGuestAMD64State* vex_state ); 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Extract from the supplied VexGuestAMD64State structure the 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown corresponding native %rflags value. */ 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovULong LibVEX_GuestAMD64_get_rflags ( /*IN*/const VexGuestAMD64State* vex_state ); 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Set the carry flag in the given state to 'new_carry_flag', which 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown should be zero or one. */ 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownLibVEX_GuestAMD64_put_rflag_c ( ULong new_carry_flag, 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*MOD*/VexGuestAMD64State* vex_state ); 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __LIBVEX_PUB_GUEST_AMD64_H */ 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- libvex_guest_amd64.h ---*/ 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/ 204