xref: /qemu/target/i386/hvf/x86_decode.h (revision 8af82b8e)
169e0a03cSPaolo Bonzini /*
269e0a03cSPaolo Bonzini  * Copyright (C) 2016 Veertu Inc,
369e0a03cSPaolo Bonzini  *
469e0a03cSPaolo Bonzini  * This program is free software; you can redistribute it and/or
569e0a03cSPaolo Bonzini  * modify it under the terms of the GNU Lesser General Public
669e0a03cSPaolo Bonzini  * License as published by the Free Software Foundation; either
7*8af82b8eSChetan Pant  * version 2.1 of the License, or (at your option) any later version.
869e0a03cSPaolo Bonzini  *
969e0a03cSPaolo Bonzini  * This program is distributed in the hope that it will be useful,
1069e0a03cSPaolo Bonzini  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1169e0a03cSPaolo Bonzini  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1269e0a03cSPaolo Bonzini  * Lesser General Public License for more details.
1369e0a03cSPaolo Bonzini  *
1469e0a03cSPaolo Bonzini  * You should have received a copy of the GNU Lesser General Public
1569e0a03cSPaolo Bonzini  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
1669e0a03cSPaolo Bonzini  */
1769e0a03cSPaolo Bonzini 
18f9fea777SPaolo Bonzini #ifndef HVF_X86_DECODE_H
19177d9e0dSMarkus Armbruster #define HVF_X86_DECODE_H
2069e0a03cSPaolo Bonzini 
2169e0a03cSPaolo Bonzini #include "cpu.h"
22f9fea777SPaolo Bonzini #include "x86.h"
2369e0a03cSPaolo Bonzini 
2469e0a03cSPaolo Bonzini typedef enum x86_prefix {
2569e0a03cSPaolo Bonzini     /* group 1 */
2669e0a03cSPaolo Bonzini     PREFIX_LOCK =                  0xf0,
2769e0a03cSPaolo Bonzini     PREFIX_REPN =                  0xf2,
2869e0a03cSPaolo Bonzini     PREFIX_REP =                   0xf3,
2969e0a03cSPaolo Bonzini     /* 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,
3669e0a03cSPaolo Bonzini     /* group 3 */
3769e0a03cSPaolo Bonzini     PREFIX_OP_SIZE_OVERRIDE =      0x66,
3869e0a03cSPaolo Bonzini     /* group 4 */
3969e0a03cSPaolo Bonzini     PREFIX_ADDR_SIZE_OVERRIDE =    0x67,
4069e0a03cSPaolo Bonzini 
4169e0a03cSPaolo Bonzini     PREFIX_REX                   = 0x40,
4269e0a03cSPaolo Bonzini } x86_prefix;
4369e0a03cSPaolo Bonzini 
4469e0a03cSPaolo Bonzini enum x86_decode_cmd {
4569e0a03cSPaolo Bonzini     X86_DECODE_CMD_INVL = 0,
4669e0a03cSPaolo Bonzini 
4769e0a03cSPaolo Bonzini     X86_DECODE_CMD_PUSH,
4869e0a03cSPaolo Bonzini     X86_DECODE_CMD_PUSH_SEG,
4969e0a03cSPaolo Bonzini     X86_DECODE_CMD_POP,
5069e0a03cSPaolo Bonzini     X86_DECODE_CMD_POP_SEG,
5169e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV,
5269e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOVSX,
5369e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOVZX,
5469e0a03cSPaolo Bonzini     X86_DECODE_CMD_CALL_NEAR,
5569e0a03cSPaolo Bonzini     X86_DECODE_CMD_CALL_NEAR_ABS_INDIRECT,
5669e0a03cSPaolo Bonzini     X86_DECODE_CMD_CALL_FAR_ABS_INDIRECT,
5769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CALL_FAR,
5869e0a03cSPaolo Bonzini     X86_DECODE_RET_NEAR,
5969e0a03cSPaolo Bonzini     X86_DECODE_RET_FAR,
6069e0a03cSPaolo Bonzini     X86_DECODE_CMD_ADD,
6169e0a03cSPaolo Bonzini     X86_DECODE_CMD_OR,
6269e0a03cSPaolo Bonzini     X86_DECODE_CMD_ADC,
6369e0a03cSPaolo Bonzini     X86_DECODE_CMD_SBB,
6469e0a03cSPaolo Bonzini     X86_DECODE_CMD_AND,
6569e0a03cSPaolo Bonzini     X86_DECODE_CMD_SUB,
6669e0a03cSPaolo Bonzini     X86_DECODE_CMD_XOR,
6769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMP,
6869e0a03cSPaolo Bonzini     X86_DECODE_CMD_INC,
6969e0a03cSPaolo Bonzini     X86_DECODE_CMD_DEC,
7069e0a03cSPaolo Bonzini     X86_DECODE_CMD_TST,
7169e0a03cSPaolo Bonzini     X86_DECODE_CMD_NOT,
7269e0a03cSPaolo Bonzini     X86_DECODE_CMD_NEG,
7369e0a03cSPaolo Bonzini     X86_DECODE_CMD_JMP_NEAR,
7469e0a03cSPaolo Bonzini     X86_DECODE_CMD_JMP_NEAR_ABS_INDIRECT,
7569e0a03cSPaolo Bonzini     X86_DECODE_CMD_JMP_FAR,
7669e0a03cSPaolo Bonzini     X86_DECODE_CMD_JMP_FAR_ABS_INDIRECT,
7769e0a03cSPaolo Bonzini     X86_DECODE_CMD_LEA,
7869e0a03cSPaolo Bonzini     X86_DECODE_CMD_JXX,
7969e0a03cSPaolo Bonzini     X86_DECODE_CMD_JCXZ,
8069e0a03cSPaolo Bonzini     X86_DECODE_CMD_SETXX,
8169e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_TO_SEG,
8269e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_FROM_SEG,
8369e0a03cSPaolo Bonzini     X86_DECODE_CMD_CLI,
8469e0a03cSPaolo Bonzini     X86_DECODE_CMD_STI,
8569e0a03cSPaolo Bonzini     X86_DECODE_CMD_CLD,
8669e0a03cSPaolo Bonzini     X86_DECODE_CMD_STD,
8769e0a03cSPaolo Bonzini     X86_DECODE_CMD_STC,
8869e0a03cSPaolo Bonzini     X86_DECODE_CMD_CLC,
8969e0a03cSPaolo Bonzini     X86_DECODE_CMD_OUT,
9069e0a03cSPaolo Bonzini     X86_DECODE_CMD_IN,
9169e0a03cSPaolo Bonzini     X86_DECODE_CMD_INS,
9269e0a03cSPaolo Bonzini     X86_DECODE_CMD_OUTS,
9369e0a03cSPaolo Bonzini     X86_DECODE_CMD_LIDT,
9469e0a03cSPaolo Bonzini     X86_DECODE_CMD_SIDT,
9569e0a03cSPaolo Bonzini     X86_DECODE_CMD_LGDT,
9669e0a03cSPaolo Bonzini     X86_DECODE_CMD_SGDT,
9769e0a03cSPaolo Bonzini     X86_DECODE_CMD_SMSW,
9869e0a03cSPaolo Bonzini     X86_DECODE_CMD_LMSW,
9969e0a03cSPaolo Bonzini     X86_DECODE_CMD_RDTSCP,
10069e0a03cSPaolo Bonzini     X86_DECODE_CMD_INVLPG,
10169e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_TO_CR,
10269e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_FROM_CR,
10369e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_TO_DR,
10469e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOV_FROM_DR,
10569e0a03cSPaolo Bonzini     X86_DECODE_CMD_PUSHF,
10669e0a03cSPaolo Bonzini     X86_DECODE_CMD_POPF,
10769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CPUID,
10869e0a03cSPaolo Bonzini     X86_DECODE_CMD_ROL,
10969e0a03cSPaolo Bonzini     X86_DECODE_CMD_ROR,
11069e0a03cSPaolo Bonzini     X86_DECODE_CMD_RCL,
11169e0a03cSPaolo Bonzini     X86_DECODE_CMD_RCR,
11269e0a03cSPaolo Bonzini     X86_DECODE_CMD_SHL,
11369e0a03cSPaolo Bonzini     X86_DECODE_CMD_SAL,
11469e0a03cSPaolo Bonzini     X86_DECODE_CMD_SHR,
11569e0a03cSPaolo Bonzini     X86_DECODE_CMD_SHRD,
11669e0a03cSPaolo Bonzini     X86_DECODE_CMD_SHLD,
11769e0a03cSPaolo Bonzini     X86_DECODE_CMD_SAR,
11869e0a03cSPaolo Bonzini     X86_DECODE_CMD_DIV,
11969e0a03cSPaolo Bonzini     X86_DECODE_CMD_IDIV,
12069e0a03cSPaolo Bonzini     X86_DECODE_CMD_MUL,
12169e0a03cSPaolo Bonzini     X86_DECODE_CMD_IMUL_3,
12269e0a03cSPaolo Bonzini     X86_DECODE_CMD_IMUL_2,
12369e0a03cSPaolo Bonzini     X86_DECODE_CMD_IMUL_1,
12469e0a03cSPaolo Bonzini     X86_DECODE_CMD_MOVS,
12569e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMPS,
12669e0a03cSPaolo Bonzini     X86_DECODE_CMD_SCAS,
12769e0a03cSPaolo Bonzini     X86_DECODE_CMD_LODS,
12869e0a03cSPaolo Bonzini     X86_DECODE_CMD_STOS,
12969e0a03cSPaolo Bonzini     X86_DECODE_CMD_BSWAP,
13069e0a03cSPaolo Bonzini     X86_DECODE_CMD_XCHG,
13169e0a03cSPaolo Bonzini     X86_DECODE_CMD_RDTSC,
13269e0a03cSPaolo Bonzini     X86_DECODE_CMD_RDMSR,
13369e0a03cSPaolo Bonzini     X86_DECODE_CMD_WRMSR,
13469e0a03cSPaolo Bonzini     X86_DECODE_CMD_ENTER,
13569e0a03cSPaolo Bonzini     X86_DECODE_CMD_LEAVE,
13669e0a03cSPaolo Bonzini     X86_DECODE_CMD_BT,
13769e0a03cSPaolo Bonzini     X86_DECODE_CMD_BTS,
13869e0a03cSPaolo Bonzini     X86_DECODE_CMD_BTC,
13969e0a03cSPaolo Bonzini     X86_DECODE_CMD_BTR,
14069e0a03cSPaolo Bonzini     X86_DECODE_CMD_BSF,
14169e0a03cSPaolo Bonzini     X86_DECODE_CMD_BSR,
14269e0a03cSPaolo Bonzini     X86_DECODE_CMD_IRET,
14369e0a03cSPaolo Bonzini     X86_DECODE_CMD_INT,
14469e0a03cSPaolo Bonzini     X86_DECODE_CMD_POPA,
14569e0a03cSPaolo Bonzini     X86_DECODE_CMD_PUSHA,
14669e0a03cSPaolo Bonzini     X86_DECODE_CMD_CWD,
14769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CBW,
14869e0a03cSPaolo Bonzini     X86_DECODE_CMD_DAS,
14969e0a03cSPaolo Bonzini     X86_DECODE_CMD_AAD,
15069e0a03cSPaolo Bonzini     X86_DECODE_CMD_AAM,
15169e0a03cSPaolo Bonzini     X86_DECODE_CMD_AAS,
15269e0a03cSPaolo Bonzini     X86_DECODE_CMD_LOOP,
15369e0a03cSPaolo Bonzini     X86_DECODE_CMD_SLDT,
15469e0a03cSPaolo Bonzini     X86_DECODE_CMD_STR,
15569e0a03cSPaolo Bonzini     X86_DECODE_CMD_LLDT,
15669e0a03cSPaolo Bonzini     X86_DECODE_CMD_LTR,
15769e0a03cSPaolo Bonzini     X86_DECODE_CMD_VERR,
15869e0a03cSPaolo Bonzini     X86_DECODE_CMD_VERW,
15969e0a03cSPaolo Bonzini     X86_DECODE_CMD_SAHF,
16069e0a03cSPaolo Bonzini     X86_DECODE_CMD_LAHF,
16169e0a03cSPaolo Bonzini     X86_DECODE_CMD_WBINVD,
16269e0a03cSPaolo Bonzini     X86_DECODE_CMD_LDS,
16369e0a03cSPaolo Bonzini     X86_DECODE_CMD_LSS,
16469e0a03cSPaolo Bonzini     X86_DECODE_CMD_LES,
16569e0a03cSPaolo Bonzini     X86_DECODE_XMD_LGS,
16669e0a03cSPaolo Bonzini     X86_DECODE_CMD_LFS,
16769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMC,
16869e0a03cSPaolo Bonzini     X86_DECODE_CMD_XLAT,
16969e0a03cSPaolo Bonzini     X86_DECODE_CMD_NOP,
17069e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMOV,
17169e0a03cSPaolo Bonzini     X86_DECODE_CMD_CLTS,
17269e0a03cSPaolo Bonzini     X86_DECODE_CMD_XADD,
17369e0a03cSPaolo Bonzini     X86_DECODE_CMD_HLT,
17469e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMPXCHG8B,
17569e0a03cSPaolo Bonzini     X86_DECODE_CMD_CMPXCHG,
17669e0a03cSPaolo Bonzini     X86_DECODE_CMD_POPCNT,
17769e0a03cSPaolo Bonzini 
17869e0a03cSPaolo Bonzini     X86_DECODE_CMD_FNINIT,
17969e0a03cSPaolo Bonzini     X86_DECODE_CMD_FLD,
18069e0a03cSPaolo Bonzini     X86_DECODE_CMD_FLDxx,
18169e0a03cSPaolo Bonzini     X86_DECODE_CMD_FNSTCW,
18269e0a03cSPaolo Bonzini     X86_DECODE_CMD_FNSTSW,
18369e0a03cSPaolo Bonzini     X86_DECODE_CMD_FNSETPM,
18469e0a03cSPaolo Bonzini     X86_DECODE_CMD_FSAVE,
18569e0a03cSPaolo Bonzini     X86_DECODE_CMD_FRSTOR,
18669e0a03cSPaolo Bonzini     X86_DECODE_CMD_FXSAVE,
18769e0a03cSPaolo Bonzini     X86_DECODE_CMD_FXRSTOR,
18869e0a03cSPaolo Bonzini     X86_DECODE_CMD_FDIV,
18969e0a03cSPaolo Bonzini     X86_DECODE_CMD_FMUL,
19069e0a03cSPaolo Bonzini     X86_DECODE_CMD_FSUB,
19169e0a03cSPaolo Bonzini     X86_DECODE_CMD_FADD,
19269e0a03cSPaolo Bonzini     X86_DECODE_CMD_EMMS,
19369e0a03cSPaolo Bonzini     X86_DECODE_CMD_MFENCE,
19469e0a03cSPaolo Bonzini     X86_DECODE_CMD_SFENCE,
19569e0a03cSPaolo Bonzini     X86_DECODE_CMD_LFENCE,
19669e0a03cSPaolo Bonzini     X86_DECODE_CMD_PREFETCH,
19769e0a03cSPaolo Bonzini     X86_DECODE_CMD_CLFLUSH,
19869e0a03cSPaolo Bonzini     X86_DECODE_CMD_FST,
19969e0a03cSPaolo Bonzini     X86_DECODE_CMD_FABS,
20069e0a03cSPaolo Bonzini     X86_DECODE_CMD_FUCOM,
20169e0a03cSPaolo Bonzini     X86_DECODE_CMD_FUCOMI,
20269e0a03cSPaolo Bonzini     X86_DECODE_CMD_FLDCW,
20369e0a03cSPaolo Bonzini     X86_DECODE_CMD_FXCH,
20469e0a03cSPaolo Bonzini     X86_DECODE_CMD_FCHS,
20569e0a03cSPaolo Bonzini     X86_DECODE_CMD_FCMOV,
20669e0a03cSPaolo Bonzini     X86_DECODE_CMD_FRNDINT,
20769e0a03cSPaolo Bonzini     X86_DECODE_CMD_FXAM,
20869e0a03cSPaolo Bonzini 
20969e0a03cSPaolo Bonzini     X86_DECODE_CMD_LAST,
21069e0a03cSPaolo Bonzini };
21169e0a03cSPaolo Bonzini 
21269e0a03cSPaolo Bonzini const char *decode_cmd_to_string(enum x86_decode_cmd cmd);
21369e0a03cSPaolo Bonzini 
21469e0a03cSPaolo Bonzini typedef struct x86_modrm {
21569e0a03cSPaolo Bonzini     union {
21669e0a03cSPaolo Bonzini         uint8_t modrm;
21769e0a03cSPaolo Bonzini         struct {
21869e0a03cSPaolo Bonzini             uint8_t rm:3;
21969e0a03cSPaolo Bonzini             uint8_t reg:3;
22069e0a03cSPaolo Bonzini             uint8_t mod:2;
22169e0a03cSPaolo Bonzini         };
22269e0a03cSPaolo Bonzini     };
22369e0a03cSPaolo Bonzini } __attribute__ ((__packed__)) x86_modrm;
22469e0a03cSPaolo Bonzini 
22569e0a03cSPaolo Bonzini typedef struct x86_sib {
22669e0a03cSPaolo Bonzini     union {
22769e0a03cSPaolo Bonzini         uint8_t sib;
22869e0a03cSPaolo Bonzini         struct {
22969e0a03cSPaolo Bonzini             uint8_t base:3;
23069e0a03cSPaolo Bonzini             uint8_t index:3;
23169e0a03cSPaolo Bonzini             uint8_t scale:2;
23269e0a03cSPaolo Bonzini         };
23369e0a03cSPaolo Bonzini     };
23469e0a03cSPaolo Bonzini } __attribute__ ((__packed__)) x86_sib;
23569e0a03cSPaolo Bonzini 
23669e0a03cSPaolo Bonzini typedef struct x86_rex {
23769e0a03cSPaolo Bonzini     union {
23869e0a03cSPaolo Bonzini         uint8_t rex;
23969e0a03cSPaolo Bonzini         struct {
24069e0a03cSPaolo Bonzini             uint8_t b:1;
24169e0a03cSPaolo Bonzini             uint8_t x:1;
24269e0a03cSPaolo Bonzini             uint8_t r:1;
24369e0a03cSPaolo Bonzini             uint8_t w:1;
24469e0a03cSPaolo Bonzini             uint8_t unused:4;
24569e0a03cSPaolo Bonzini         };
24669e0a03cSPaolo Bonzini     };
24769e0a03cSPaolo Bonzini } __attribute__ ((__packed__)) x86_rex;
24869e0a03cSPaolo Bonzini 
24969e0a03cSPaolo Bonzini typedef enum x86_var_type {
25069e0a03cSPaolo Bonzini     X86_VAR_IMMEDIATE,
25169e0a03cSPaolo Bonzini     X86_VAR_OFFSET,
25269e0a03cSPaolo Bonzini     X86_VAR_REG,
25369e0a03cSPaolo Bonzini     X86_VAR_RM,
25469e0a03cSPaolo Bonzini 
25569e0a03cSPaolo Bonzini     /* for floating point computations */
25669e0a03cSPaolo Bonzini     X87_VAR_REG,
25769e0a03cSPaolo Bonzini     X87_VAR_FLOATP,
25869e0a03cSPaolo Bonzini     X87_VAR_INTP,
25969e0a03cSPaolo Bonzini     X87_VAR_BYTEP,
26069e0a03cSPaolo Bonzini } x86_var_type;
26169e0a03cSPaolo Bonzini 
26269e0a03cSPaolo Bonzini typedef struct x86_decode_op {
26369e0a03cSPaolo Bonzini     enum x86_var_type type;
26469e0a03cSPaolo Bonzini     int size;
26569e0a03cSPaolo Bonzini 
26669e0a03cSPaolo Bonzini     int reg;
267ff2de166SPaolo Bonzini     target_ulong val;
26869e0a03cSPaolo Bonzini 
269ff2de166SPaolo Bonzini     target_ulong ptr;
27069e0a03cSPaolo Bonzini } x86_decode_op;
27169e0a03cSPaolo Bonzini 
27269e0a03cSPaolo Bonzini typedef struct x86_decode {
27369e0a03cSPaolo Bonzini     int len;
27469e0a03cSPaolo Bonzini     uint8_t opcode[4];
27569e0a03cSPaolo Bonzini     uint8_t opcode_len;
27669e0a03cSPaolo Bonzini     enum x86_decode_cmd cmd;
27769e0a03cSPaolo Bonzini     int addressing_size;
27869e0a03cSPaolo Bonzini     int operand_size;
27969e0a03cSPaolo Bonzini     int lock;
28069e0a03cSPaolo Bonzini     int rep;
28169e0a03cSPaolo Bonzini     int op_size_override;
28269e0a03cSPaolo Bonzini     int addr_size_override;
28369e0a03cSPaolo Bonzini     int segment_override;
28469e0a03cSPaolo Bonzini     int control_change_inst;
28569e0a03cSPaolo Bonzini     bool fwait;
28669e0a03cSPaolo Bonzini     bool fpop_stack;
28769e0a03cSPaolo Bonzini     bool frev;
28869e0a03cSPaolo Bonzini 
28969e0a03cSPaolo Bonzini     uint32_t displacement;
29069e0a03cSPaolo Bonzini     uint8_t displacement_size;
29169e0a03cSPaolo Bonzini     struct x86_rex rex;
29269e0a03cSPaolo Bonzini     bool is_modrm;
29369e0a03cSPaolo Bonzini     bool sib_present;
29469e0a03cSPaolo Bonzini     struct x86_sib sib;
29569e0a03cSPaolo Bonzini     struct x86_modrm modrm;
29669e0a03cSPaolo Bonzini     struct x86_decode_op op[4];
29769e0a03cSPaolo Bonzini     bool is_fpu;
298ff2de166SPaolo Bonzini     uint32_t flags_mask;
29969e0a03cSPaolo Bonzini 
30069e0a03cSPaolo Bonzini } x86_decode;
30169e0a03cSPaolo Bonzini 
30269e0a03cSPaolo Bonzini uint64_t sign(uint64_t val, int size);
30369e0a03cSPaolo Bonzini 
30469e0a03cSPaolo Bonzini uint32_t decode_instruction(CPUX86State *env, struct x86_decode *decode);
30569e0a03cSPaolo Bonzini 
3068c3b0e9eSCameron Esfahani target_ulong get_reg_ref(CPUX86State *env, int reg, int rex_present,
3078c3b0e9eSCameron Esfahani                          int is_extended, int size);
3088c3b0e9eSCameron Esfahani target_ulong get_reg_val(CPUX86State *env, int reg, int rex_present,
3098c3b0e9eSCameron Esfahani                          int is_extended, int size);
31069e0a03cSPaolo Bonzini void calc_modrm_operand(CPUX86State *env, struct x86_decode *decode,
31169e0a03cSPaolo Bonzini                         struct x86_decode_op *op);
312ff2de166SPaolo Bonzini target_ulong decode_linear_addr(CPUX86State *env, struct x86_decode *decode,
313ff2de166SPaolo Bonzini                                target_ulong addr, enum X86Seg seg);
31469e0a03cSPaolo Bonzini 
31569e0a03cSPaolo Bonzini void init_decoder(void);
31669e0a03cSPaolo Bonzini void calc_modrm_operand16(CPUX86State *env, struct x86_decode *decode,
31769e0a03cSPaolo Bonzini                           struct x86_decode_op *op);
31869e0a03cSPaolo Bonzini void calc_modrm_operand32(CPUX86State *env, struct x86_decode *decode,
31969e0a03cSPaolo Bonzini                           struct x86_decode_op *op);
32069e0a03cSPaolo Bonzini void calc_modrm_operand64(CPUX86State *env, struct x86_decode *decode,
32169e0a03cSPaolo Bonzini                           struct x86_decode_op *op);
32269e0a03cSPaolo Bonzini void set_addressing_size(CPUX86State *env, struct x86_decode *decode);
32369e0a03cSPaolo Bonzini void set_operand_size(CPUX86State *env, struct x86_decode *decode);
324f9fea777SPaolo Bonzini 
325f9fea777SPaolo Bonzini #endif
326