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