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