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