xref: /qemu/target/i386/emulate/x86_decode.h (revision c97d6d2cdf97edb4aebe832fdba65d701ad7bcb6)
1*c97d6d2cSSergio Andres Gomez Del Real /*
2*c97d6d2cSSergio Andres Gomez Del Real  * Copyright (C) 2016 Veertu Inc,
3*c97d6d2cSSergio Andres Gomez Del Real  *
4*c97d6d2cSSergio Andres Gomez Del Real  * This program is free software; you can redistribute it and/or
5*c97d6d2cSSergio Andres Gomez Del Real  * modify it under the terms of the GNU General Public License as
6*c97d6d2cSSergio Andres Gomez Del Real  * published by the Free Software Foundation; either version 2 or
7*c97d6d2cSSergio Andres Gomez Del Real  * (at your option) version 3 of the License.
8*c97d6d2cSSergio Andres Gomez Del Real  *
9*c97d6d2cSSergio Andres Gomez Del Real  * This program is distributed in the hope that it will be useful,
10*c97d6d2cSSergio Andres Gomez Del Real  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*c97d6d2cSSergio Andres Gomez Del Real  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*c97d6d2cSSergio Andres Gomez Del Real  * GNU General Public License for more details.
13*c97d6d2cSSergio Andres Gomez Del Real  *
14*c97d6d2cSSergio Andres Gomez Del Real  * You should have received a copy of the GNU General Public License along
15*c97d6d2cSSergio Andres Gomez Del Real  * with this program; if not, see <http://www.gnu.org/licenses/>.
16*c97d6d2cSSergio Andres Gomez Del Real  */
17*c97d6d2cSSergio Andres Gomez Del Real 
18*c97d6d2cSSergio Andres Gomez Del Real #pragma once
19*c97d6d2cSSergio Andres Gomez Del Real 
20*c97d6d2cSSergio Andres Gomez Del Real #include <sys/types.h>
21*c97d6d2cSSergio Andres Gomez Del Real #include <sys/ioctl.h>
22*c97d6d2cSSergio Andres Gomez Del Real #include <sys/mman.h>
23*c97d6d2cSSergio Andres Gomez Del Real #include <stdarg.h>
24*c97d6d2cSSergio Andres Gomez Del Real #include "qemu-common.h"
25*c97d6d2cSSergio Andres Gomez Del Real #include "x86.h"
26*c97d6d2cSSergio Andres Gomez Del Real #include "cpu.h"
27*c97d6d2cSSergio Andres Gomez Del Real 
28*c97d6d2cSSergio Andres Gomez Del Real typedef enum x86_prefix {
29*c97d6d2cSSergio Andres Gomez Del Real     /* group 1 */
30*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_LOCK =                  0xf0,
31*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_REPN =                  0xf2,
32*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_REP =                   0xf3,
33*c97d6d2cSSergio Andres Gomez Del Real     /* group 2 */
34*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_CS_SEG_OVEERIDE =       0x2e,
35*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_SS_SEG_OVEERIDE =       0x36,
36*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_DS_SEG_OVEERIDE =       0x3e,
37*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_ES_SEG_OVEERIDE =       0x26,
38*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_FS_SEG_OVEERIDE =       0x64,
39*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_GS_SEG_OVEERIDE =       0x65,
40*c97d6d2cSSergio Andres Gomez Del Real     /* group 3 */
41*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_OP_SIZE_OVERRIDE =      0x66,
42*c97d6d2cSSergio Andres Gomez Del Real     /* group 4 */
43*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_ADDR_SIZE_OVERRIDE =    0x67,
44*c97d6d2cSSergio Andres Gomez Del Real 
45*c97d6d2cSSergio Andres Gomez Del Real     PREFIX_REX                   = 0x40,
46*c97d6d2cSSergio Andres Gomez Del Real } x86_prefix;
47*c97d6d2cSSergio Andres Gomez Del Real 
48*c97d6d2cSSergio Andres Gomez Del Real enum x86_decode_cmd {
49*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_INVL = 0,
50*c97d6d2cSSergio Andres Gomez Del Real 
51*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_PUSH,
52*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_PUSH_SEG,
53*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_POP,
54*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_POP_SEG,
55*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV,
56*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOVSX,
57*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOVZX,
58*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CALL_NEAR,
59*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CALL_NEAR_ABS_INDIRECT,
60*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CALL_FAR_ABS_INDIRECT,
61*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CALL_FAR,
62*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_RET_NEAR,
63*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_RET_FAR,
64*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_ADD,
65*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_OR,
66*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_ADC,
67*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SBB,
68*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_AND,
69*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SUB,
70*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_XOR,
71*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMP,
72*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_INC,
73*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_DEC,
74*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_TST,
75*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_NOT,
76*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_NEG,
77*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JMP_NEAR,
78*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JMP_NEAR_ABS_INDIRECT,
79*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JMP_FAR,
80*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JMP_FAR_ABS_INDIRECT,
81*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LEA,
82*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JXX,
83*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_JCXZ,
84*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SETXX,
85*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_TO_SEG,
86*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_FROM_SEG,
87*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CLI,
88*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_STI,
89*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CLD,
90*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_STD,
91*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_STC,
92*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CLC,
93*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_OUT,
94*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IN,
95*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_INS,
96*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_OUTS,
97*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LIDT,
98*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SIDT,
99*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LGDT,
100*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SGDT,
101*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SMSW,
102*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LMSW,
103*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_RDTSCP,
104*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_INVLPG,
105*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_TO_CR,
106*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_FROM_CR,
107*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_TO_DR,
108*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOV_FROM_DR,
109*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_PUSHF,
110*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_POPF,
111*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CPUID,
112*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_ROL,
113*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_ROR,
114*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_RCL,
115*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_RCR,
116*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SHL,
117*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SAL,
118*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SHR,
119*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SHRD,
120*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SHLD,
121*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SAR,
122*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_DIV,
123*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IDIV,
124*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MUL,
125*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IMUL_3,
126*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IMUL_2,
127*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IMUL_1,
128*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MOVS,
129*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMPS,
130*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SCAS,
131*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LODS,
132*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_STOS,
133*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BSWAP,
134*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_XCHG,
135*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_RDTSC,
136*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_RDMSR,
137*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_WRMSR,
138*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_ENTER,
139*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LEAVE,
140*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BT,
141*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BTS,
142*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BTC,
143*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BTR,
144*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BSF,
145*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_BSR,
146*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_IRET,
147*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_INT,
148*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_POPA,
149*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_PUSHA,
150*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CWD,
151*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CBW,
152*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_DAS,
153*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_AAD,
154*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_AAM,
155*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_AAS,
156*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LOOP,
157*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SLDT,
158*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_STR,
159*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LLDT,
160*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LTR,
161*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_VERR,
162*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_VERW,
163*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SAHF,
164*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LAHF,
165*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_WBINVD,
166*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LDS,
167*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LSS,
168*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LES,
169*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_XMD_LGS,
170*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LFS,
171*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMC,
172*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_XLAT,
173*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_NOP,
174*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMOV,
175*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CLTS,
176*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_XADD,
177*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_HLT,
178*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMPXCHG8B,
179*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CMPXCHG,
180*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_POPCNT,
181*c97d6d2cSSergio Andres Gomez Del Real 
182*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FNINIT,
183*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FLD,
184*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FLDxx,
185*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FNSTCW,
186*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FNSTSW,
187*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FNSETPM,
188*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FSAVE,
189*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FRSTOR,
190*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FXSAVE,
191*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FXRSTOR,
192*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FDIV,
193*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FMUL,
194*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FSUB,
195*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FADD,
196*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_EMMS,
197*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_MFENCE,
198*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_SFENCE,
199*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LFENCE,
200*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_PREFETCH,
201*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_CLFLUSH,
202*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FST,
203*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FABS,
204*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FUCOM,
205*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FUCOMI,
206*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FLDCW,
207*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FXCH,
208*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FCHS,
209*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FCMOV,
210*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FRNDINT,
211*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_FXAM,
212*c97d6d2cSSergio Andres Gomez Del Real 
213*c97d6d2cSSergio Andres Gomez Del Real     X86_DECODE_CMD_LAST,
214*c97d6d2cSSergio Andres Gomez Del Real };
215*c97d6d2cSSergio Andres Gomez Del Real 
216*c97d6d2cSSergio Andres Gomez Del Real const char *decode_cmd_to_string(enum x86_decode_cmd cmd);
217*c97d6d2cSSergio Andres Gomez Del Real 
218*c97d6d2cSSergio Andres Gomez Del Real typedef struct x86_modrm {
219*c97d6d2cSSergio Andres Gomez Del Real     union {
220*c97d6d2cSSergio Andres Gomez Del Real         uint8_t modrm;
221*c97d6d2cSSergio Andres Gomez Del Real         struct {
222*c97d6d2cSSergio Andres Gomez Del Real             uint8_t rm:3;
223*c97d6d2cSSergio Andres Gomez Del Real             uint8_t reg:3;
224*c97d6d2cSSergio Andres Gomez Del Real             uint8_t mod:2;
225*c97d6d2cSSergio Andres Gomez Del Real         };
226*c97d6d2cSSergio Andres Gomez Del Real     };
227*c97d6d2cSSergio Andres Gomez Del Real } __attribute__ ((__packed__)) x86_modrm;
228*c97d6d2cSSergio Andres Gomez Del Real 
229*c97d6d2cSSergio Andres Gomez Del Real typedef struct x86_sib {
230*c97d6d2cSSergio Andres Gomez Del Real     union {
231*c97d6d2cSSergio Andres Gomez Del Real         uint8_t sib;
232*c97d6d2cSSergio Andres Gomez Del Real         struct {
233*c97d6d2cSSergio Andres Gomez Del Real             uint8_t base:3;
234*c97d6d2cSSergio Andres Gomez Del Real             uint8_t index:3;
235*c97d6d2cSSergio Andres Gomez Del Real             uint8_t scale:2;
236*c97d6d2cSSergio Andres Gomez Del Real         };
237*c97d6d2cSSergio Andres Gomez Del Real     };
238*c97d6d2cSSergio Andres Gomez Del Real } __attribute__ ((__packed__)) x86_sib;
239*c97d6d2cSSergio Andres Gomez Del Real 
240*c97d6d2cSSergio Andres Gomez Del Real typedef struct x86_rex {
241*c97d6d2cSSergio Andres Gomez Del Real     union {
242*c97d6d2cSSergio Andres Gomez Del Real         uint8_t rex;
243*c97d6d2cSSergio Andres Gomez Del Real         struct {
244*c97d6d2cSSergio Andres Gomez Del Real             uint8_t b:1;
245*c97d6d2cSSergio Andres Gomez Del Real             uint8_t x:1;
246*c97d6d2cSSergio Andres Gomez Del Real             uint8_t r:1;
247*c97d6d2cSSergio Andres Gomez Del Real             uint8_t w:1;
248*c97d6d2cSSergio Andres Gomez Del Real             uint8_t unused:4;
249*c97d6d2cSSergio Andres Gomez Del Real         };
250*c97d6d2cSSergio Andres Gomez Del Real     };
251*c97d6d2cSSergio Andres Gomez Del Real } __attribute__ ((__packed__)) x86_rex;
252*c97d6d2cSSergio Andres Gomez Del Real 
253*c97d6d2cSSergio Andres Gomez Del Real typedef enum x86_var_type {
254*c97d6d2cSSergio Andres Gomez Del Real     X86_VAR_IMMEDIATE,
255*c97d6d2cSSergio Andres Gomez Del Real     X86_VAR_OFFSET,
256*c97d6d2cSSergio Andres Gomez Del Real     X86_VAR_REG,
257*c97d6d2cSSergio Andres Gomez Del Real     X86_VAR_RM,
258*c97d6d2cSSergio Andres Gomez Del Real 
259*c97d6d2cSSergio Andres Gomez Del Real     /* for floating point computations */
260*c97d6d2cSSergio Andres Gomez Del Real     X87_VAR_REG,
261*c97d6d2cSSergio Andres Gomez Del Real     X87_VAR_FLOATP,
262*c97d6d2cSSergio Andres Gomez Del Real     X87_VAR_INTP,
263*c97d6d2cSSergio Andres Gomez Del Real     X87_VAR_BYTEP,
264*c97d6d2cSSergio Andres Gomez Del Real } x86_var_type;
265*c97d6d2cSSergio Andres Gomez Del Real 
266*c97d6d2cSSergio Andres Gomez Del Real typedef struct x86_decode_op {
267*c97d6d2cSSergio Andres Gomez Del Real     enum x86_var_type type;
268*c97d6d2cSSergio Andres Gomez Del Real     int size;
269*c97d6d2cSSergio Andres Gomez Del Real 
270*c97d6d2cSSergio Andres Gomez Del Real     int reg;
271*c97d6d2cSSergio Andres Gomez Del Real     addr_t val;
272*c97d6d2cSSergio Andres Gomez Del Real 
273*c97d6d2cSSergio Andres Gomez Del Real     addr_t ptr;
274*c97d6d2cSSergio Andres Gomez Del Real } x86_decode_op;
275*c97d6d2cSSergio Andres Gomez Del Real 
276*c97d6d2cSSergio Andres Gomez Del Real typedef struct x86_decode {
277*c97d6d2cSSergio Andres Gomez Del Real     int len;
278*c97d6d2cSSergio Andres Gomez Del Real     uint8_t opcode[4];
279*c97d6d2cSSergio Andres Gomez Del Real     uint8_t opcode_len;
280*c97d6d2cSSergio Andres Gomez Del Real     enum x86_decode_cmd cmd;
281*c97d6d2cSSergio Andres Gomez Del Real     int addressing_size;
282*c97d6d2cSSergio Andres Gomez Del Real     int operand_size;
283*c97d6d2cSSergio Andres Gomez Del Real     int lock;
284*c97d6d2cSSergio Andres Gomez Del Real     int rep;
285*c97d6d2cSSergio Andres Gomez Del Real     int op_size_override;
286*c97d6d2cSSergio Andres Gomez Del Real     int addr_size_override;
287*c97d6d2cSSergio Andres Gomez Del Real     int segment_override;
288*c97d6d2cSSergio Andres Gomez Del Real     int control_change_inst;
289*c97d6d2cSSergio Andres Gomez Del Real     bool fwait;
290*c97d6d2cSSergio Andres Gomez Del Real     bool fpop_stack;
291*c97d6d2cSSergio Andres Gomez Del Real     bool frev;
292*c97d6d2cSSergio Andres Gomez Del Real 
293*c97d6d2cSSergio Andres Gomez Del Real     uint32_t displacement;
294*c97d6d2cSSergio Andres Gomez Del Real     uint8_t displacement_size;
295*c97d6d2cSSergio Andres Gomez Del Real     struct x86_rex rex;
296*c97d6d2cSSergio Andres Gomez Del Real     bool is_modrm;
297*c97d6d2cSSergio Andres Gomez Del Real     bool sib_present;
298*c97d6d2cSSergio Andres Gomez Del Real     struct x86_sib sib;
299*c97d6d2cSSergio Andres Gomez Del Real     struct x86_modrm modrm;
300*c97d6d2cSSergio Andres Gomez Del Real     struct x86_decode_op op[4];
301*c97d6d2cSSergio Andres Gomez Del Real     bool is_fpu;
302*c97d6d2cSSergio Andres Gomez Del Real     addr_t flags_mask;
303*c97d6d2cSSergio Andres Gomez Del Real 
304*c97d6d2cSSergio Andres Gomez Del Real } x86_decode;
305*c97d6d2cSSergio Andres Gomez Del Real 
306*c97d6d2cSSergio Andres Gomez Del Real uint64_t sign(uint64_t val, int size);
307*c97d6d2cSSergio Andres Gomez Del Real 
308*c97d6d2cSSergio Andres Gomez Del Real uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode);
309*c97d6d2cSSergio Andres Gomez Del Real 
310*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_ref(CPUX86State *env, int reg, int is_extended, int size);
311*c97d6d2cSSergio Andres Gomez Del Real addr_t get_reg_val(CPUX86State *env, int reg, int is_extended, int size);
312*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand(CPUX86State *env, struct x86_decode *decode,
313*c97d6d2cSSergio Andres Gomez Del Real                         struct x86_decode_op *op);
314*c97d6d2cSSergio Andres Gomez Del Real addr_t decode_linear_addr(CPUX86State *env, struct x86_decode *decode,
315*c97d6d2cSSergio Andres Gomez Del Real                           addr_t addr, x86_reg_segment seg);
316*c97d6d2cSSergio Andres Gomez Del Real 
317*c97d6d2cSSergio Andres Gomez Del Real void init_decoder(void);
318*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand16(CPUX86State *env, struct x86_decode *decode,
319*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op);
320*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand32(CPUX86State *env, struct x86_decode *decode,
321*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op);
322*c97d6d2cSSergio Andres Gomez Del Real void calc_modrm_operand64(CPUX86State *env, struct x86_decode *decode,
323*c97d6d2cSSergio Andres Gomez Del Real                           struct x86_decode_op *op);
324*c97d6d2cSSergio Andres Gomez Del Real void set_addressing_size(CPUX86State *env, struct x86_decode *decode);
325*c97d6d2cSSergio Andres Gomez Del Real void set_operand_size(CPUX86State *env, struct x86_decode *decode);
326