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