1*9a0e4156SSadaf Ebrahimi /*===-- X86DisassemblerDecoderInternal.h - Disassembler decoder ---*- C -*-===* 2*9a0e4156SSadaf Ebrahimi * 3*9a0e4156SSadaf Ebrahimi * The LLVM Compiler Infrastructure 4*9a0e4156SSadaf Ebrahimi * 5*9a0e4156SSadaf Ebrahimi * This file is distributed under the University of Illinois Open Source 6*9a0e4156SSadaf Ebrahimi * License. See LICENSE.TXT for details. 7*9a0e4156SSadaf Ebrahimi * 8*9a0e4156SSadaf Ebrahimi *===----------------------------------------------------------------------===* 9*9a0e4156SSadaf Ebrahimi * 10*9a0e4156SSadaf Ebrahimi * This file is part of the X86 Disassembler. 11*9a0e4156SSadaf Ebrahimi * It contains the public interface of the instruction decoder. 12*9a0e4156SSadaf Ebrahimi * Documentation for the disassembler can be found in X86Disassembler.h. 13*9a0e4156SSadaf Ebrahimi * 14*9a0e4156SSadaf Ebrahimi *===----------------------------------------------------------------------===*/ 15*9a0e4156SSadaf Ebrahimi 16*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */ 17*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */ 18*9a0e4156SSadaf Ebrahimi 19*9a0e4156SSadaf Ebrahimi #ifndef CS_X86_DISASSEMBLERDECODER_H 20*9a0e4156SSadaf Ebrahimi #define CS_X86_DISASSEMBLERDECODER_H 21*9a0e4156SSadaf Ebrahimi 22*9a0e4156SSadaf Ebrahimi #if defined(CAPSTONE_HAS_OSXKERNEL) 23*9a0e4156SSadaf Ebrahimi #include <libkern/libkern.h> 24*9a0e4156SSadaf Ebrahimi #else 25*9a0e4156SSadaf Ebrahimi #include <stdio.h> 26*9a0e4156SSadaf Ebrahimi #endif 27*9a0e4156SSadaf Ebrahimi 28*9a0e4156SSadaf Ebrahimi #include "X86DisassemblerDecoderCommon.h" 29*9a0e4156SSadaf Ebrahimi 30*9a0e4156SSadaf Ebrahimi /* 31*9a0e4156SSadaf Ebrahimi * Accessor functions for various fields of an Intel instruction 32*9a0e4156SSadaf Ebrahimi */ 33*9a0e4156SSadaf Ebrahimi #define modFromModRM(modRM) (((modRM) & 0xc0) >> 6) 34*9a0e4156SSadaf Ebrahimi #define regFromModRM(modRM) (((modRM) & 0x38) >> 3) 35*9a0e4156SSadaf Ebrahimi #define rmFromModRM(modRM) ((modRM) & 0x7) 36*9a0e4156SSadaf Ebrahimi #define scaleFromSIB(sib) (((sib) & 0xc0) >> 6) 37*9a0e4156SSadaf Ebrahimi #define indexFromSIB(sib) (((sib) & 0x38) >> 3) 38*9a0e4156SSadaf Ebrahimi #define baseFromSIB(sib) ((sib) & 0x7) 39*9a0e4156SSadaf Ebrahimi #define wFromREX(rex) (((rex) & 0x8) >> 3) 40*9a0e4156SSadaf Ebrahimi #define rFromREX(rex) (((rex) & 0x4) >> 2) 41*9a0e4156SSadaf Ebrahimi #define xFromREX(rex) (((rex) & 0x2) >> 1) 42*9a0e4156SSadaf Ebrahimi #define bFromREX(rex) ((rex) & 0x1) 43*9a0e4156SSadaf Ebrahimi 44*9a0e4156SSadaf Ebrahimi #define rFromEVEX2of4(evex) (((~(evex)) & 0x80) >> 7) 45*9a0e4156SSadaf Ebrahimi #define xFromEVEX2of4(evex) (((~(evex)) & 0x40) >> 6) 46*9a0e4156SSadaf Ebrahimi #define bFromEVEX2of4(evex) (((~(evex)) & 0x20) >> 5) 47*9a0e4156SSadaf Ebrahimi #define r2FromEVEX2of4(evex) (((~(evex)) & 0x10) >> 4) 48*9a0e4156SSadaf Ebrahimi #define mmFromEVEX2of4(evex) ((evex) & 0x3) 49*9a0e4156SSadaf Ebrahimi #define wFromEVEX3of4(evex) (((evex) & 0x80) >> 7) 50*9a0e4156SSadaf Ebrahimi #define vvvvFromEVEX3of4(evex) (((~(evex)) & 0x78) >> 3) 51*9a0e4156SSadaf Ebrahimi #define ppFromEVEX3of4(evex) ((evex) & 0x3) 52*9a0e4156SSadaf Ebrahimi #define zFromEVEX4of4(evex) (((evex) & 0x80) >> 7) 53*9a0e4156SSadaf Ebrahimi #define l2FromEVEX4of4(evex) (((evex) & 0x40) >> 6) 54*9a0e4156SSadaf Ebrahimi #define lFromEVEX4of4(evex) (((evex) & 0x20) >> 5) 55*9a0e4156SSadaf Ebrahimi #define bFromEVEX4of4(evex) (((evex) & 0x10) >> 4) 56*9a0e4156SSadaf Ebrahimi #define v2FromEVEX4of4(evex) (((~evex) & 0x8) >> 3) 57*9a0e4156SSadaf Ebrahimi #define aaaFromEVEX4of4(evex) ((evex) & 0x7) 58*9a0e4156SSadaf Ebrahimi 59*9a0e4156SSadaf Ebrahimi #define rFromVEX2of3(vex) (((~(vex)) & 0x80) >> 7) 60*9a0e4156SSadaf Ebrahimi #define xFromVEX2of3(vex) (((~(vex)) & 0x40) >> 6) 61*9a0e4156SSadaf Ebrahimi #define bFromVEX2of3(vex) (((~(vex)) & 0x20) >> 5) 62*9a0e4156SSadaf Ebrahimi #define mmmmmFromVEX2of3(vex) ((vex) & 0x1f) 63*9a0e4156SSadaf Ebrahimi #define wFromVEX3of3(vex) (((vex) & 0x80) >> 7) 64*9a0e4156SSadaf Ebrahimi #define vvvvFromVEX3of3(vex) (((~(vex)) & 0x78) >> 3) 65*9a0e4156SSadaf Ebrahimi #define lFromVEX3of3(vex) (((vex) & 0x4) >> 2) 66*9a0e4156SSadaf Ebrahimi #define ppFromVEX3of3(vex) ((vex) & 0x3) 67*9a0e4156SSadaf Ebrahimi 68*9a0e4156SSadaf Ebrahimi #define rFromVEX2of2(vex) (((~(vex)) & 0x80) >> 7) 69*9a0e4156SSadaf Ebrahimi #define vvvvFromVEX2of2(vex) (((~(vex)) & 0x78) >> 3) 70*9a0e4156SSadaf Ebrahimi #define lFromVEX2of2(vex) (((vex) & 0x4) >> 2) 71*9a0e4156SSadaf Ebrahimi #define ppFromVEX2of2(vex) ((vex) & 0x3) 72*9a0e4156SSadaf Ebrahimi 73*9a0e4156SSadaf Ebrahimi #define rFromXOP2of3(xop) (((~(xop)) & 0x80) >> 7) 74*9a0e4156SSadaf Ebrahimi #define xFromXOP2of3(xop) (((~(xop)) & 0x40) >> 6) 75*9a0e4156SSadaf Ebrahimi #define bFromXOP2of3(xop) (((~(xop)) & 0x20) >> 5) 76*9a0e4156SSadaf Ebrahimi #define mmmmmFromXOP2of3(xop) ((xop) & 0x1f) 77*9a0e4156SSadaf Ebrahimi #define wFromXOP3of3(xop) (((xop) & 0x80) >> 7) 78*9a0e4156SSadaf Ebrahimi #define vvvvFromXOP3of3(vex) (((~(vex)) & 0x78) >> 3) 79*9a0e4156SSadaf Ebrahimi #define lFromXOP3of3(xop) (((xop) & 0x4) >> 2) 80*9a0e4156SSadaf Ebrahimi #define ppFromXOP3of3(xop) ((xop) & 0x3) 81*9a0e4156SSadaf Ebrahimi 82*9a0e4156SSadaf Ebrahimi /* 83*9a0e4156SSadaf Ebrahimi * These enums represent Intel registers for use by the decoder. 84*9a0e4156SSadaf Ebrahimi */ 85*9a0e4156SSadaf Ebrahimi 86*9a0e4156SSadaf Ebrahimi #define REGS_8BIT \ 87*9a0e4156SSadaf Ebrahimi ENTRY(AL) \ 88*9a0e4156SSadaf Ebrahimi ENTRY(CL) \ 89*9a0e4156SSadaf Ebrahimi ENTRY(DL) \ 90*9a0e4156SSadaf Ebrahimi ENTRY(BL) \ 91*9a0e4156SSadaf Ebrahimi ENTRY(AH) \ 92*9a0e4156SSadaf Ebrahimi ENTRY(CH) \ 93*9a0e4156SSadaf Ebrahimi ENTRY(DH) \ 94*9a0e4156SSadaf Ebrahimi ENTRY(BH) \ 95*9a0e4156SSadaf Ebrahimi ENTRY(R8B) \ 96*9a0e4156SSadaf Ebrahimi ENTRY(R9B) \ 97*9a0e4156SSadaf Ebrahimi ENTRY(R10B) \ 98*9a0e4156SSadaf Ebrahimi ENTRY(R11B) \ 99*9a0e4156SSadaf Ebrahimi ENTRY(R12B) \ 100*9a0e4156SSadaf Ebrahimi ENTRY(R13B) \ 101*9a0e4156SSadaf Ebrahimi ENTRY(R14B) \ 102*9a0e4156SSadaf Ebrahimi ENTRY(R15B) \ 103*9a0e4156SSadaf Ebrahimi ENTRY(SPL) \ 104*9a0e4156SSadaf Ebrahimi ENTRY(BPL) \ 105*9a0e4156SSadaf Ebrahimi ENTRY(SIL) \ 106*9a0e4156SSadaf Ebrahimi ENTRY(DIL) 107*9a0e4156SSadaf Ebrahimi 108*9a0e4156SSadaf Ebrahimi #define EA_BASES_16BIT \ 109*9a0e4156SSadaf Ebrahimi ENTRY(BX_SI) \ 110*9a0e4156SSadaf Ebrahimi ENTRY(BX_DI) \ 111*9a0e4156SSadaf Ebrahimi ENTRY(BP_SI) \ 112*9a0e4156SSadaf Ebrahimi ENTRY(BP_DI) \ 113*9a0e4156SSadaf Ebrahimi ENTRY(SI) \ 114*9a0e4156SSadaf Ebrahimi ENTRY(DI) \ 115*9a0e4156SSadaf Ebrahimi ENTRY(BP) \ 116*9a0e4156SSadaf Ebrahimi ENTRY(BX) \ 117*9a0e4156SSadaf Ebrahimi ENTRY(R8W) \ 118*9a0e4156SSadaf Ebrahimi ENTRY(R9W) \ 119*9a0e4156SSadaf Ebrahimi ENTRY(R10W) \ 120*9a0e4156SSadaf Ebrahimi ENTRY(R11W) \ 121*9a0e4156SSadaf Ebrahimi ENTRY(R12W) \ 122*9a0e4156SSadaf Ebrahimi ENTRY(R13W) \ 123*9a0e4156SSadaf Ebrahimi ENTRY(R14W) \ 124*9a0e4156SSadaf Ebrahimi ENTRY(R15W) 125*9a0e4156SSadaf Ebrahimi 126*9a0e4156SSadaf Ebrahimi #define REGS_16BIT \ 127*9a0e4156SSadaf Ebrahimi ENTRY(AX) \ 128*9a0e4156SSadaf Ebrahimi ENTRY(CX) \ 129*9a0e4156SSadaf Ebrahimi ENTRY(DX) \ 130*9a0e4156SSadaf Ebrahimi ENTRY(BX) \ 131*9a0e4156SSadaf Ebrahimi ENTRY(SP) \ 132*9a0e4156SSadaf Ebrahimi ENTRY(BP) \ 133*9a0e4156SSadaf Ebrahimi ENTRY(SI) \ 134*9a0e4156SSadaf Ebrahimi ENTRY(DI) \ 135*9a0e4156SSadaf Ebrahimi ENTRY(R8W) \ 136*9a0e4156SSadaf Ebrahimi ENTRY(R9W) \ 137*9a0e4156SSadaf Ebrahimi ENTRY(R10W) \ 138*9a0e4156SSadaf Ebrahimi ENTRY(R11W) \ 139*9a0e4156SSadaf Ebrahimi ENTRY(R12W) \ 140*9a0e4156SSadaf Ebrahimi ENTRY(R13W) \ 141*9a0e4156SSadaf Ebrahimi ENTRY(R14W) \ 142*9a0e4156SSadaf Ebrahimi ENTRY(R15W) 143*9a0e4156SSadaf Ebrahimi 144*9a0e4156SSadaf Ebrahimi #define EA_BASES_32BIT \ 145*9a0e4156SSadaf Ebrahimi ENTRY(EAX) \ 146*9a0e4156SSadaf Ebrahimi ENTRY(ECX) \ 147*9a0e4156SSadaf Ebrahimi ENTRY(EDX) \ 148*9a0e4156SSadaf Ebrahimi ENTRY(EBX) \ 149*9a0e4156SSadaf Ebrahimi ENTRY(sib) \ 150*9a0e4156SSadaf Ebrahimi ENTRY(EBP) \ 151*9a0e4156SSadaf Ebrahimi ENTRY(ESI) \ 152*9a0e4156SSadaf Ebrahimi ENTRY(EDI) \ 153*9a0e4156SSadaf Ebrahimi ENTRY(R8D) \ 154*9a0e4156SSadaf Ebrahimi ENTRY(R9D) \ 155*9a0e4156SSadaf Ebrahimi ENTRY(R10D) \ 156*9a0e4156SSadaf Ebrahimi ENTRY(R11D) \ 157*9a0e4156SSadaf Ebrahimi ENTRY(R12D) \ 158*9a0e4156SSadaf Ebrahimi ENTRY(R13D) \ 159*9a0e4156SSadaf Ebrahimi ENTRY(R14D) \ 160*9a0e4156SSadaf Ebrahimi ENTRY(R15D) 161*9a0e4156SSadaf Ebrahimi 162*9a0e4156SSadaf Ebrahimi #define REGS_32BIT \ 163*9a0e4156SSadaf Ebrahimi ENTRY(EAX) \ 164*9a0e4156SSadaf Ebrahimi ENTRY(ECX) \ 165*9a0e4156SSadaf Ebrahimi ENTRY(EDX) \ 166*9a0e4156SSadaf Ebrahimi ENTRY(EBX) \ 167*9a0e4156SSadaf Ebrahimi ENTRY(ESP) \ 168*9a0e4156SSadaf Ebrahimi ENTRY(EBP) \ 169*9a0e4156SSadaf Ebrahimi ENTRY(ESI) \ 170*9a0e4156SSadaf Ebrahimi ENTRY(EDI) \ 171*9a0e4156SSadaf Ebrahimi ENTRY(R8D) \ 172*9a0e4156SSadaf Ebrahimi ENTRY(R9D) \ 173*9a0e4156SSadaf Ebrahimi ENTRY(R10D) \ 174*9a0e4156SSadaf Ebrahimi ENTRY(R11D) \ 175*9a0e4156SSadaf Ebrahimi ENTRY(R12D) \ 176*9a0e4156SSadaf Ebrahimi ENTRY(R13D) \ 177*9a0e4156SSadaf Ebrahimi ENTRY(R14D) \ 178*9a0e4156SSadaf Ebrahimi ENTRY(R15D) 179*9a0e4156SSadaf Ebrahimi 180*9a0e4156SSadaf Ebrahimi #define EA_BASES_64BIT \ 181*9a0e4156SSadaf Ebrahimi ENTRY(RAX) \ 182*9a0e4156SSadaf Ebrahimi ENTRY(RCX) \ 183*9a0e4156SSadaf Ebrahimi ENTRY(RDX) \ 184*9a0e4156SSadaf Ebrahimi ENTRY(RBX) \ 185*9a0e4156SSadaf Ebrahimi ENTRY(sib64) \ 186*9a0e4156SSadaf Ebrahimi ENTRY(RBP) \ 187*9a0e4156SSadaf Ebrahimi ENTRY(RSI) \ 188*9a0e4156SSadaf Ebrahimi ENTRY(RDI) \ 189*9a0e4156SSadaf Ebrahimi ENTRY(R8) \ 190*9a0e4156SSadaf Ebrahimi ENTRY(R9) \ 191*9a0e4156SSadaf Ebrahimi ENTRY(R10) \ 192*9a0e4156SSadaf Ebrahimi ENTRY(R11) \ 193*9a0e4156SSadaf Ebrahimi ENTRY(R12) \ 194*9a0e4156SSadaf Ebrahimi ENTRY(R13) \ 195*9a0e4156SSadaf Ebrahimi ENTRY(R14) \ 196*9a0e4156SSadaf Ebrahimi ENTRY(R15) 197*9a0e4156SSadaf Ebrahimi 198*9a0e4156SSadaf Ebrahimi #define REGS_64BIT \ 199*9a0e4156SSadaf Ebrahimi ENTRY(RAX) \ 200*9a0e4156SSadaf Ebrahimi ENTRY(RCX) \ 201*9a0e4156SSadaf Ebrahimi ENTRY(RDX) \ 202*9a0e4156SSadaf Ebrahimi ENTRY(RBX) \ 203*9a0e4156SSadaf Ebrahimi ENTRY(RSP) \ 204*9a0e4156SSadaf Ebrahimi ENTRY(RBP) \ 205*9a0e4156SSadaf Ebrahimi ENTRY(RSI) \ 206*9a0e4156SSadaf Ebrahimi ENTRY(RDI) \ 207*9a0e4156SSadaf Ebrahimi ENTRY(R8) \ 208*9a0e4156SSadaf Ebrahimi ENTRY(R9) \ 209*9a0e4156SSadaf Ebrahimi ENTRY(R10) \ 210*9a0e4156SSadaf Ebrahimi ENTRY(R11) \ 211*9a0e4156SSadaf Ebrahimi ENTRY(R12) \ 212*9a0e4156SSadaf Ebrahimi ENTRY(R13) \ 213*9a0e4156SSadaf Ebrahimi ENTRY(R14) \ 214*9a0e4156SSadaf Ebrahimi ENTRY(R15) 215*9a0e4156SSadaf Ebrahimi 216*9a0e4156SSadaf Ebrahimi #define REGS_MMX \ 217*9a0e4156SSadaf Ebrahimi ENTRY(MM0) \ 218*9a0e4156SSadaf Ebrahimi ENTRY(MM1) \ 219*9a0e4156SSadaf Ebrahimi ENTRY(MM2) \ 220*9a0e4156SSadaf Ebrahimi ENTRY(MM3) \ 221*9a0e4156SSadaf Ebrahimi ENTRY(MM4) \ 222*9a0e4156SSadaf Ebrahimi ENTRY(MM5) \ 223*9a0e4156SSadaf Ebrahimi ENTRY(MM6) \ 224*9a0e4156SSadaf Ebrahimi ENTRY(MM7) 225*9a0e4156SSadaf Ebrahimi 226*9a0e4156SSadaf Ebrahimi #define REGS_XMM \ 227*9a0e4156SSadaf Ebrahimi ENTRY(XMM0) \ 228*9a0e4156SSadaf Ebrahimi ENTRY(XMM1) \ 229*9a0e4156SSadaf Ebrahimi ENTRY(XMM2) \ 230*9a0e4156SSadaf Ebrahimi ENTRY(XMM3) \ 231*9a0e4156SSadaf Ebrahimi ENTRY(XMM4) \ 232*9a0e4156SSadaf Ebrahimi ENTRY(XMM5) \ 233*9a0e4156SSadaf Ebrahimi ENTRY(XMM6) \ 234*9a0e4156SSadaf Ebrahimi ENTRY(XMM7) \ 235*9a0e4156SSadaf Ebrahimi ENTRY(XMM8) \ 236*9a0e4156SSadaf Ebrahimi ENTRY(XMM9) \ 237*9a0e4156SSadaf Ebrahimi ENTRY(XMM10) \ 238*9a0e4156SSadaf Ebrahimi ENTRY(XMM11) \ 239*9a0e4156SSadaf Ebrahimi ENTRY(XMM12) \ 240*9a0e4156SSadaf Ebrahimi ENTRY(XMM13) \ 241*9a0e4156SSadaf Ebrahimi ENTRY(XMM14) \ 242*9a0e4156SSadaf Ebrahimi ENTRY(XMM15) \ 243*9a0e4156SSadaf Ebrahimi ENTRY(XMM16) \ 244*9a0e4156SSadaf Ebrahimi ENTRY(XMM17) \ 245*9a0e4156SSadaf Ebrahimi ENTRY(XMM18) \ 246*9a0e4156SSadaf Ebrahimi ENTRY(XMM19) \ 247*9a0e4156SSadaf Ebrahimi ENTRY(XMM20) \ 248*9a0e4156SSadaf Ebrahimi ENTRY(XMM21) \ 249*9a0e4156SSadaf Ebrahimi ENTRY(XMM22) \ 250*9a0e4156SSadaf Ebrahimi ENTRY(XMM23) \ 251*9a0e4156SSadaf Ebrahimi ENTRY(XMM24) \ 252*9a0e4156SSadaf Ebrahimi ENTRY(XMM25) \ 253*9a0e4156SSadaf Ebrahimi ENTRY(XMM26) \ 254*9a0e4156SSadaf Ebrahimi ENTRY(XMM27) \ 255*9a0e4156SSadaf Ebrahimi ENTRY(XMM28) \ 256*9a0e4156SSadaf Ebrahimi ENTRY(XMM29) \ 257*9a0e4156SSadaf Ebrahimi ENTRY(XMM30) \ 258*9a0e4156SSadaf Ebrahimi ENTRY(XMM31) 259*9a0e4156SSadaf Ebrahimi 260*9a0e4156SSadaf Ebrahimi 261*9a0e4156SSadaf Ebrahimi #define REGS_YMM \ 262*9a0e4156SSadaf Ebrahimi ENTRY(YMM0) \ 263*9a0e4156SSadaf Ebrahimi ENTRY(YMM1) \ 264*9a0e4156SSadaf Ebrahimi ENTRY(YMM2) \ 265*9a0e4156SSadaf Ebrahimi ENTRY(YMM3) \ 266*9a0e4156SSadaf Ebrahimi ENTRY(YMM4) \ 267*9a0e4156SSadaf Ebrahimi ENTRY(YMM5) \ 268*9a0e4156SSadaf Ebrahimi ENTRY(YMM6) \ 269*9a0e4156SSadaf Ebrahimi ENTRY(YMM7) \ 270*9a0e4156SSadaf Ebrahimi ENTRY(YMM8) \ 271*9a0e4156SSadaf Ebrahimi ENTRY(YMM9) \ 272*9a0e4156SSadaf Ebrahimi ENTRY(YMM10) \ 273*9a0e4156SSadaf Ebrahimi ENTRY(YMM11) \ 274*9a0e4156SSadaf Ebrahimi ENTRY(YMM12) \ 275*9a0e4156SSadaf Ebrahimi ENTRY(YMM13) \ 276*9a0e4156SSadaf Ebrahimi ENTRY(YMM14) \ 277*9a0e4156SSadaf Ebrahimi ENTRY(YMM15) \ 278*9a0e4156SSadaf Ebrahimi ENTRY(YMM16) \ 279*9a0e4156SSadaf Ebrahimi ENTRY(YMM17) \ 280*9a0e4156SSadaf Ebrahimi ENTRY(YMM18) \ 281*9a0e4156SSadaf Ebrahimi ENTRY(YMM19) \ 282*9a0e4156SSadaf Ebrahimi ENTRY(YMM20) \ 283*9a0e4156SSadaf Ebrahimi ENTRY(YMM21) \ 284*9a0e4156SSadaf Ebrahimi ENTRY(YMM22) \ 285*9a0e4156SSadaf Ebrahimi ENTRY(YMM23) \ 286*9a0e4156SSadaf Ebrahimi ENTRY(YMM24) \ 287*9a0e4156SSadaf Ebrahimi ENTRY(YMM25) \ 288*9a0e4156SSadaf Ebrahimi ENTRY(YMM26) \ 289*9a0e4156SSadaf Ebrahimi ENTRY(YMM27) \ 290*9a0e4156SSadaf Ebrahimi ENTRY(YMM28) \ 291*9a0e4156SSadaf Ebrahimi ENTRY(YMM29) \ 292*9a0e4156SSadaf Ebrahimi ENTRY(YMM30) \ 293*9a0e4156SSadaf Ebrahimi ENTRY(YMM31) 294*9a0e4156SSadaf Ebrahimi 295*9a0e4156SSadaf Ebrahimi #define REGS_ZMM \ 296*9a0e4156SSadaf Ebrahimi ENTRY(ZMM0) \ 297*9a0e4156SSadaf Ebrahimi ENTRY(ZMM1) \ 298*9a0e4156SSadaf Ebrahimi ENTRY(ZMM2) \ 299*9a0e4156SSadaf Ebrahimi ENTRY(ZMM3) \ 300*9a0e4156SSadaf Ebrahimi ENTRY(ZMM4) \ 301*9a0e4156SSadaf Ebrahimi ENTRY(ZMM5) \ 302*9a0e4156SSadaf Ebrahimi ENTRY(ZMM6) \ 303*9a0e4156SSadaf Ebrahimi ENTRY(ZMM7) \ 304*9a0e4156SSadaf Ebrahimi ENTRY(ZMM8) \ 305*9a0e4156SSadaf Ebrahimi ENTRY(ZMM9) \ 306*9a0e4156SSadaf Ebrahimi ENTRY(ZMM10) \ 307*9a0e4156SSadaf Ebrahimi ENTRY(ZMM11) \ 308*9a0e4156SSadaf Ebrahimi ENTRY(ZMM12) \ 309*9a0e4156SSadaf Ebrahimi ENTRY(ZMM13) \ 310*9a0e4156SSadaf Ebrahimi ENTRY(ZMM14) \ 311*9a0e4156SSadaf Ebrahimi ENTRY(ZMM15) \ 312*9a0e4156SSadaf Ebrahimi ENTRY(ZMM16) \ 313*9a0e4156SSadaf Ebrahimi ENTRY(ZMM17) \ 314*9a0e4156SSadaf Ebrahimi ENTRY(ZMM18) \ 315*9a0e4156SSadaf Ebrahimi ENTRY(ZMM19) \ 316*9a0e4156SSadaf Ebrahimi ENTRY(ZMM20) \ 317*9a0e4156SSadaf Ebrahimi ENTRY(ZMM21) \ 318*9a0e4156SSadaf Ebrahimi ENTRY(ZMM22) \ 319*9a0e4156SSadaf Ebrahimi ENTRY(ZMM23) \ 320*9a0e4156SSadaf Ebrahimi ENTRY(ZMM24) \ 321*9a0e4156SSadaf Ebrahimi ENTRY(ZMM25) \ 322*9a0e4156SSadaf Ebrahimi ENTRY(ZMM26) \ 323*9a0e4156SSadaf Ebrahimi ENTRY(ZMM27) \ 324*9a0e4156SSadaf Ebrahimi ENTRY(ZMM28) \ 325*9a0e4156SSadaf Ebrahimi ENTRY(ZMM29) \ 326*9a0e4156SSadaf Ebrahimi ENTRY(ZMM30) \ 327*9a0e4156SSadaf Ebrahimi ENTRY(ZMM31) 328*9a0e4156SSadaf Ebrahimi 329*9a0e4156SSadaf Ebrahimi #define REGS_MASKS \ 330*9a0e4156SSadaf Ebrahimi ENTRY(K0) \ 331*9a0e4156SSadaf Ebrahimi ENTRY(K1) \ 332*9a0e4156SSadaf Ebrahimi ENTRY(K2) \ 333*9a0e4156SSadaf Ebrahimi ENTRY(K3) \ 334*9a0e4156SSadaf Ebrahimi ENTRY(K4) \ 335*9a0e4156SSadaf Ebrahimi ENTRY(K5) \ 336*9a0e4156SSadaf Ebrahimi ENTRY(K6) \ 337*9a0e4156SSadaf Ebrahimi ENTRY(K7) 338*9a0e4156SSadaf Ebrahimi 339*9a0e4156SSadaf Ebrahimi #define REGS_SEGMENT \ 340*9a0e4156SSadaf Ebrahimi ENTRY(ES) \ 341*9a0e4156SSadaf Ebrahimi ENTRY(CS) \ 342*9a0e4156SSadaf Ebrahimi ENTRY(SS) \ 343*9a0e4156SSadaf Ebrahimi ENTRY(DS) \ 344*9a0e4156SSadaf Ebrahimi ENTRY(FS) \ 345*9a0e4156SSadaf Ebrahimi ENTRY(GS) 346*9a0e4156SSadaf Ebrahimi 347*9a0e4156SSadaf Ebrahimi #define REGS_DEBUG \ 348*9a0e4156SSadaf Ebrahimi ENTRY(DR0) \ 349*9a0e4156SSadaf Ebrahimi ENTRY(DR1) \ 350*9a0e4156SSadaf Ebrahimi ENTRY(DR2) \ 351*9a0e4156SSadaf Ebrahimi ENTRY(DR3) \ 352*9a0e4156SSadaf Ebrahimi ENTRY(DR4) \ 353*9a0e4156SSadaf Ebrahimi ENTRY(DR5) \ 354*9a0e4156SSadaf Ebrahimi ENTRY(DR6) \ 355*9a0e4156SSadaf Ebrahimi ENTRY(DR7) \ 356*9a0e4156SSadaf Ebrahimi ENTRY(DR8) \ 357*9a0e4156SSadaf Ebrahimi ENTRY(DR9) \ 358*9a0e4156SSadaf Ebrahimi ENTRY(DR10) \ 359*9a0e4156SSadaf Ebrahimi ENTRY(DR11) \ 360*9a0e4156SSadaf Ebrahimi ENTRY(DR12) \ 361*9a0e4156SSadaf Ebrahimi ENTRY(DR13) \ 362*9a0e4156SSadaf Ebrahimi ENTRY(DR14) \ 363*9a0e4156SSadaf Ebrahimi ENTRY(DR15) 364*9a0e4156SSadaf Ebrahimi 365*9a0e4156SSadaf Ebrahimi #define REGS_CONTROL \ 366*9a0e4156SSadaf Ebrahimi ENTRY(CR0) \ 367*9a0e4156SSadaf Ebrahimi ENTRY(CR1) \ 368*9a0e4156SSadaf Ebrahimi ENTRY(CR2) \ 369*9a0e4156SSadaf Ebrahimi ENTRY(CR3) \ 370*9a0e4156SSadaf Ebrahimi ENTRY(CR4) \ 371*9a0e4156SSadaf Ebrahimi ENTRY(CR5) \ 372*9a0e4156SSadaf Ebrahimi ENTRY(CR6) \ 373*9a0e4156SSadaf Ebrahimi ENTRY(CR7) \ 374*9a0e4156SSadaf Ebrahimi ENTRY(CR8) \ 375*9a0e4156SSadaf Ebrahimi ENTRY(CR9) \ 376*9a0e4156SSadaf Ebrahimi ENTRY(CR10) \ 377*9a0e4156SSadaf Ebrahimi ENTRY(CR11) \ 378*9a0e4156SSadaf Ebrahimi ENTRY(CR12) \ 379*9a0e4156SSadaf Ebrahimi ENTRY(CR13) \ 380*9a0e4156SSadaf Ebrahimi ENTRY(CR14) \ 381*9a0e4156SSadaf Ebrahimi ENTRY(CR15) 382*9a0e4156SSadaf Ebrahimi 383*9a0e4156SSadaf Ebrahimi #define ALL_EA_BASES \ 384*9a0e4156SSadaf Ebrahimi EA_BASES_16BIT \ 385*9a0e4156SSadaf Ebrahimi EA_BASES_32BIT \ 386*9a0e4156SSadaf Ebrahimi EA_BASES_64BIT 387*9a0e4156SSadaf Ebrahimi 388*9a0e4156SSadaf Ebrahimi #define ALL_SIB_BASES \ 389*9a0e4156SSadaf Ebrahimi REGS_32BIT \ 390*9a0e4156SSadaf Ebrahimi REGS_64BIT 391*9a0e4156SSadaf Ebrahimi 392*9a0e4156SSadaf Ebrahimi #define ALL_REGS \ 393*9a0e4156SSadaf Ebrahimi REGS_8BIT \ 394*9a0e4156SSadaf Ebrahimi REGS_16BIT \ 395*9a0e4156SSadaf Ebrahimi REGS_32BIT \ 396*9a0e4156SSadaf Ebrahimi REGS_64BIT \ 397*9a0e4156SSadaf Ebrahimi REGS_MMX \ 398*9a0e4156SSadaf Ebrahimi REGS_XMM \ 399*9a0e4156SSadaf Ebrahimi REGS_YMM \ 400*9a0e4156SSadaf Ebrahimi REGS_ZMM \ 401*9a0e4156SSadaf Ebrahimi REGS_MASKS \ 402*9a0e4156SSadaf Ebrahimi REGS_SEGMENT \ 403*9a0e4156SSadaf Ebrahimi REGS_DEBUG \ 404*9a0e4156SSadaf Ebrahimi REGS_CONTROL \ 405*9a0e4156SSadaf Ebrahimi ENTRY(RIP) 406*9a0e4156SSadaf Ebrahimi 407*9a0e4156SSadaf Ebrahimi /* 408*9a0e4156SSadaf Ebrahimi * EABase - All possible values of the base field for effective-address 409*9a0e4156SSadaf Ebrahimi * computations, a.k.a. the Mod and R/M fields of the ModR/M byte. We 410*9a0e4156SSadaf Ebrahimi * distinguish between bases (EA_BASE_*) and registers that just happen to be 411*9a0e4156SSadaf Ebrahimi * referred to when Mod == 0b11 (EA_REG_*). 412*9a0e4156SSadaf Ebrahimi */ 413*9a0e4156SSadaf Ebrahimi typedef enum { 414*9a0e4156SSadaf Ebrahimi EA_BASE_NONE, 415*9a0e4156SSadaf Ebrahimi #define ENTRY(x) EA_BASE_##x, 416*9a0e4156SSadaf Ebrahimi ALL_EA_BASES 417*9a0e4156SSadaf Ebrahimi #undef ENTRY 418*9a0e4156SSadaf Ebrahimi #define ENTRY(x) EA_REG_##x, 419*9a0e4156SSadaf Ebrahimi ALL_REGS 420*9a0e4156SSadaf Ebrahimi #undef ENTRY 421*9a0e4156SSadaf Ebrahimi EA_max 422*9a0e4156SSadaf Ebrahimi } EABase; 423*9a0e4156SSadaf Ebrahimi 424*9a0e4156SSadaf Ebrahimi /* 425*9a0e4156SSadaf Ebrahimi * SIBIndex - All possible values of the SIB index field. 426*9a0e4156SSadaf Ebrahimi * Borrows entries from ALL_EA_BASES with the special case that 427*9a0e4156SSadaf Ebrahimi * sib is synonymous with NONE. 428*9a0e4156SSadaf Ebrahimi * Vector SIB: index can be XMM or YMM. 429*9a0e4156SSadaf Ebrahimi */ 430*9a0e4156SSadaf Ebrahimi typedef enum { 431*9a0e4156SSadaf Ebrahimi SIB_INDEX_NONE, 432*9a0e4156SSadaf Ebrahimi #define ENTRY(x) SIB_INDEX_##x, 433*9a0e4156SSadaf Ebrahimi ALL_EA_BASES 434*9a0e4156SSadaf Ebrahimi REGS_XMM 435*9a0e4156SSadaf Ebrahimi REGS_YMM 436*9a0e4156SSadaf Ebrahimi REGS_ZMM 437*9a0e4156SSadaf Ebrahimi #undef ENTRY 438*9a0e4156SSadaf Ebrahimi SIB_INDEX_max 439*9a0e4156SSadaf Ebrahimi } SIBIndex; 440*9a0e4156SSadaf Ebrahimi 441*9a0e4156SSadaf Ebrahimi /* 442*9a0e4156SSadaf Ebrahimi * SIBBase - All possible values of the SIB base field. 443*9a0e4156SSadaf Ebrahimi */ 444*9a0e4156SSadaf Ebrahimi typedef enum { 445*9a0e4156SSadaf Ebrahimi SIB_BASE_NONE, 446*9a0e4156SSadaf Ebrahimi #define ENTRY(x) SIB_BASE_##x, 447*9a0e4156SSadaf Ebrahimi ALL_SIB_BASES 448*9a0e4156SSadaf Ebrahimi #undef ENTRY 449*9a0e4156SSadaf Ebrahimi SIB_BASE_max 450*9a0e4156SSadaf Ebrahimi } SIBBase; 451*9a0e4156SSadaf Ebrahimi 452*9a0e4156SSadaf Ebrahimi /* 453*9a0e4156SSadaf Ebrahimi * EADisplacement - Possible displacement types for effective-address 454*9a0e4156SSadaf Ebrahimi * computations. 455*9a0e4156SSadaf Ebrahimi */ 456*9a0e4156SSadaf Ebrahimi typedef enum { 457*9a0e4156SSadaf Ebrahimi EA_DISP_NONE, 458*9a0e4156SSadaf Ebrahimi EA_DISP_8, 459*9a0e4156SSadaf Ebrahimi EA_DISP_16, 460*9a0e4156SSadaf Ebrahimi EA_DISP_32 461*9a0e4156SSadaf Ebrahimi } EADisplacement; 462*9a0e4156SSadaf Ebrahimi 463*9a0e4156SSadaf Ebrahimi /* 464*9a0e4156SSadaf Ebrahimi * Reg - All possible values of the reg field in the ModR/M byte. 465*9a0e4156SSadaf Ebrahimi */ 466*9a0e4156SSadaf Ebrahimi typedef enum { 467*9a0e4156SSadaf Ebrahimi #define ENTRY(x) MODRM_REG_##x, 468*9a0e4156SSadaf Ebrahimi ALL_REGS 469*9a0e4156SSadaf Ebrahimi #undef ENTRY 470*9a0e4156SSadaf Ebrahimi MODRM_REG_max 471*9a0e4156SSadaf Ebrahimi } Reg; 472*9a0e4156SSadaf Ebrahimi 473*9a0e4156SSadaf Ebrahimi /* 474*9a0e4156SSadaf Ebrahimi * SegmentOverride - All possible segment overrides. 475*9a0e4156SSadaf Ebrahimi */ 476*9a0e4156SSadaf Ebrahimi typedef enum { 477*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_NONE, 478*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_CS, 479*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_SS, 480*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_DS, 481*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_ES, 482*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_FS, 483*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_GS, 484*9a0e4156SSadaf Ebrahimi SEG_OVERRIDE_max 485*9a0e4156SSadaf Ebrahimi } SegmentOverride; 486*9a0e4156SSadaf Ebrahimi 487*9a0e4156SSadaf Ebrahimi /* 488*9a0e4156SSadaf Ebrahimi * VEXLeadingOpcodeByte - Possible values for the VEX.m-mmmm field 489*9a0e4156SSadaf Ebrahimi */ 490*9a0e4156SSadaf Ebrahimi typedef enum { 491*9a0e4156SSadaf Ebrahimi VEX_LOB_0F = 0x1, 492*9a0e4156SSadaf Ebrahimi VEX_LOB_0F38 = 0x2, 493*9a0e4156SSadaf Ebrahimi VEX_LOB_0F3A = 0x3 494*9a0e4156SSadaf Ebrahimi } VEXLeadingOpcodeByte; 495*9a0e4156SSadaf Ebrahimi 496*9a0e4156SSadaf Ebrahimi typedef enum { 497*9a0e4156SSadaf Ebrahimi XOP_MAP_SELECT_8 = 0x8, 498*9a0e4156SSadaf Ebrahimi XOP_MAP_SELECT_9 = 0x9, 499*9a0e4156SSadaf Ebrahimi XOP_MAP_SELECT_A = 0xA 500*9a0e4156SSadaf Ebrahimi } XOPMapSelect; 501*9a0e4156SSadaf Ebrahimi 502*9a0e4156SSadaf Ebrahimi /* 503*9a0e4156SSadaf Ebrahimi * VEXPrefixCode - Possible values for the VEX.pp/EVEX.pp field 504*9a0e4156SSadaf Ebrahimi */ 505*9a0e4156SSadaf Ebrahimi typedef enum { 506*9a0e4156SSadaf Ebrahimi VEX_PREFIX_NONE = 0x0, 507*9a0e4156SSadaf Ebrahimi VEX_PREFIX_66 = 0x1, 508*9a0e4156SSadaf Ebrahimi VEX_PREFIX_F3 = 0x2, 509*9a0e4156SSadaf Ebrahimi VEX_PREFIX_F2 = 0x3 510*9a0e4156SSadaf Ebrahimi } VEXPrefixCode; 511*9a0e4156SSadaf Ebrahimi 512*9a0e4156SSadaf Ebrahimi typedef enum { 513*9a0e4156SSadaf Ebrahimi TYPE_NO_VEX_XOP = 0x0, 514*9a0e4156SSadaf Ebrahimi TYPE_VEX_2B = 0x1, 515*9a0e4156SSadaf Ebrahimi TYPE_VEX_3B = 0x2, 516*9a0e4156SSadaf Ebrahimi TYPE_EVEX = 0x3, 517*9a0e4156SSadaf Ebrahimi TYPE_XOP = 0x4 518*9a0e4156SSadaf Ebrahimi } VectorExtensionType; 519*9a0e4156SSadaf Ebrahimi 520*9a0e4156SSadaf Ebrahimi struct reader_info { 521*9a0e4156SSadaf Ebrahimi const uint8_t *code; 522*9a0e4156SSadaf Ebrahimi uint64_t size; 523*9a0e4156SSadaf Ebrahimi uint64_t offset; 524*9a0e4156SSadaf Ebrahimi }; 525*9a0e4156SSadaf Ebrahimi 526*9a0e4156SSadaf Ebrahimi /* 527*9a0e4156SSadaf Ebrahimi * byteReader_t - Type for the byte reader that the consumer must provide to 528*9a0e4156SSadaf Ebrahimi * the decoder. Reads a single byte from the instruction's address space. 529*9a0e4156SSadaf Ebrahimi * @param arg - A baton that the consumer can associate with any internal 530*9a0e4156SSadaf Ebrahimi * state that it needs. 531*9a0e4156SSadaf Ebrahimi * @param byte - A pointer to a single byte in memory that should be set to 532*9a0e4156SSadaf Ebrahimi * contain the value at address. 533*9a0e4156SSadaf Ebrahimi * @param address - The address in the instruction's address space that should 534*9a0e4156SSadaf Ebrahimi * be read from. 535*9a0e4156SSadaf Ebrahimi * @return - -1 if the byte cannot be read for any reason; 0 otherwise. 536*9a0e4156SSadaf Ebrahimi */ 537*9a0e4156SSadaf Ebrahimi typedef int (*byteReader_t)(const struct reader_info *arg, uint8_t* byte, uint64_t address); 538*9a0e4156SSadaf Ebrahimi 539*9a0e4156SSadaf Ebrahimi /* 540*9a0e4156SSadaf Ebrahimi * dlog_t - Type for the logging function that the consumer can provide to 541*9a0e4156SSadaf Ebrahimi * get debugging output from the decoder. 542*9a0e4156SSadaf Ebrahimi * @param arg - A baton that the consumer can associate with any internal 543*9a0e4156SSadaf Ebrahimi * state that it needs. 544*9a0e4156SSadaf Ebrahimi * @param log - A string that contains the message. Will be reused after 545*9a0e4156SSadaf Ebrahimi * the logger returns. 546*9a0e4156SSadaf Ebrahimi */ 547*9a0e4156SSadaf Ebrahimi typedef void (*dlog_t)(void* arg, const char *log); 548*9a0e4156SSadaf Ebrahimi 549*9a0e4156SSadaf Ebrahimi /// The specification for how to extract and interpret a full instruction and 550*9a0e4156SSadaf Ebrahimi /// its operands. 551*9a0e4156SSadaf Ebrahimi struct InstructionSpecifier { 552*9a0e4156SSadaf Ebrahimi uint16_t operands; 553*9a0e4156SSadaf Ebrahimi }; 554*9a0e4156SSadaf Ebrahimi 555*9a0e4156SSadaf Ebrahimi /* 556*9a0e4156SSadaf Ebrahimi * The x86 internal instruction, which is produced by the decoder. 557*9a0e4156SSadaf Ebrahimi */ 558*9a0e4156SSadaf Ebrahimi typedef struct InternalInstruction { 559*9a0e4156SSadaf Ebrahimi // from here, all members must be initialized to ZERO to work properly 560*9a0e4156SSadaf Ebrahimi uint8_t operandSize; 561*9a0e4156SSadaf Ebrahimi uint8_t prefix0, prefix1, prefix2, prefix3; 562*9a0e4156SSadaf Ebrahimi /* true if the prefix byte corresponding to the entry is present; false if not */ 563*9a0e4156SSadaf Ebrahimi bool isPrefix26; 564*9a0e4156SSadaf Ebrahimi bool isPrefix2e; 565*9a0e4156SSadaf Ebrahimi bool isPrefix36; 566*9a0e4156SSadaf Ebrahimi bool isPrefix3e; 567*9a0e4156SSadaf Ebrahimi bool isPrefix64; 568*9a0e4156SSadaf Ebrahimi bool isPrefix65; 569*9a0e4156SSadaf Ebrahimi bool isPrefix66; 570*9a0e4156SSadaf Ebrahimi bool isPrefix67; 571*9a0e4156SSadaf Ebrahimi bool isPrefixf0; 572*9a0e4156SSadaf Ebrahimi bool isPrefixf2; 573*9a0e4156SSadaf Ebrahimi bool isPrefixf3; 574*9a0e4156SSadaf Ebrahimi /* contains the location (for use with the reader) of the prefix byte */ 575*9a0e4156SSadaf Ebrahimi uint64_t prefix26; 576*9a0e4156SSadaf Ebrahimi uint64_t prefix2e; 577*9a0e4156SSadaf Ebrahimi uint64_t prefix36; 578*9a0e4156SSadaf Ebrahimi uint64_t prefix3e; 579*9a0e4156SSadaf Ebrahimi uint64_t prefix64; 580*9a0e4156SSadaf Ebrahimi uint64_t prefix65; 581*9a0e4156SSadaf Ebrahimi uint64_t prefix66; 582*9a0e4156SSadaf Ebrahimi uint64_t prefix67; 583*9a0e4156SSadaf Ebrahimi uint64_t prefixf0; 584*9a0e4156SSadaf Ebrahimi uint64_t prefixf2; 585*9a0e4156SSadaf Ebrahimi uint64_t prefixf3; 586*9a0e4156SSadaf Ebrahimi /* The value of the REX prefix, if present */ 587*9a0e4156SSadaf Ebrahimi uint8_t rexPrefix; 588*9a0e4156SSadaf Ebrahimi /* The segment override type */ 589*9a0e4156SSadaf Ebrahimi SegmentOverride segmentOverride; 590*9a0e4156SSadaf Ebrahimi bool consumedModRM; 591*9a0e4156SSadaf Ebrahimi uint8_t orgModRM; // save original modRM because we will modify modRM 592*9a0e4156SSadaf Ebrahimi /* The SIB byte, used for more complex 32- or 64-bit memory operands */ 593*9a0e4156SSadaf Ebrahimi bool consumedSIB; 594*9a0e4156SSadaf Ebrahimi uint8_t sib; 595*9a0e4156SSadaf Ebrahimi /* The displacement, used for memory operands */ 596*9a0e4156SSadaf Ebrahimi bool consumedDisplacement; 597*9a0e4156SSadaf Ebrahimi int64_t displacement; 598*9a0e4156SSadaf Ebrahimi /* The value of the two-byte escape prefix (usually 0x0f) */ 599*9a0e4156SSadaf Ebrahimi uint8_t twoByteEscape; 600*9a0e4156SSadaf Ebrahimi /* The value of the three-byte escape prefix (usually 0x38 or 0x3a) */ 601*9a0e4156SSadaf Ebrahimi uint8_t threeByteEscape; 602*9a0e4156SSadaf Ebrahimi /* SIB state */ 603*9a0e4156SSadaf Ebrahimi SIBIndex sibIndex; 604*9a0e4156SSadaf Ebrahimi uint8_t sibScale; 605*9a0e4156SSadaf Ebrahimi SIBBase sibBase; 606*9a0e4156SSadaf Ebrahimi uint8_t numImmediatesConsumed; 607*9a0e4156SSadaf Ebrahimi /* true if the prefix byte, 0xf2 or 0xf3 is xacquire or xrelease */ 608*9a0e4156SSadaf Ebrahimi bool xAcquireRelease; 609*9a0e4156SSadaf Ebrahimi 610*9a0e4156SSadaf Ebrahimi /* The value of the vector extension prefix(EVEX/VEX/XOP), if present */ 611*9a0e4156SSadaf Ebrahimi uint8_t vectorExtensionPrefix[4]; 612*9a0e4156SSadaf Ebrahimi 613*9a0e4156SSadaf Ebrahimi /* Offsets from the start of the instruction to the pieces of data, which is 614*9a0e4156SSadaf Ebrahimi needed to find relocation entries for adding symbolic operands */ 615*9a0e4156SSadaf Ebrahimi uint8_t displacementOffset; 616*9a0e4156SSadaf Ebrahimi uint8_t immediateOffset; 617*9a0e4156SSadaf Ebrahimi uint8_t modRMOffset; 618*9a0e4156SSadaf Ebrahimi 619*9a0e4156SSadaf Ebrahimi // end-of-zero-members 620*9a0e4156SSadaf Ebrahimi 621*9a0e4156SSadaf Ebrahimi /* Reader interface (C) */ 622*9a0e4156SSadaf Ebrahimi byteReader_t reader; 623*9a0e4156SSadaf Ebrahimi 624*9a0e4156SSadaf Ebrahimi /* Opaque value passed to the reader */ 625*9a0e4156SSadaf Ebrahimi const void* readerArg; 626*9a0e4156SSadaf Ebrahimi /* The address of the next byte to read via the reader */ 627*9a0e4156SSadaf Ebrahimi uint64_t readerCursor; 628*9a0e4156SSadaf Ebrahimi 629*9a0e4156SSadaf Ebrahimi /* Logger interface (C) */ 630*9a0e4156SSadaf Ebrahimi dlog_t dlog; 631*9a0e4156SSadaf Ebrahimi /* Opaque value passed to the logger */ 632*9a0e4156SSadaf Ebrahimi void* dlogArg; 633*9a0e4156SSadaf Ebrahimi 634*9a0e4156SSadaf Ebrahimi /* General instruction information */ 635*9a0e4156SSadaf Ebrahimi 636*9a0e4156SSadaf Ebrahimi /* The mode to disassemble for (64-bit, protected, real) */ 637*9a0e4156SSadaf Ebrahimi DisassemblerMode mode; 638*9a0e4156SSadaf Ebrahimi /* The start of the instruction, usable with the reader */ 639*9a0e4156SSadaf Ebrahimi uint64_t startLocation; 640*9a0e4156SSadaf Ebrahimi /* The length of the instruction, in bytes */ 641*9a0e4156SSadaf Ebrahimi size_t length; 642*9a0e4156SSadaf Ebrahimi 643*9a0e4156SSadaf Ebrahimi /* Prefix state */ 644*9a0e4156SSadaf Ebrahimi 645*9a0e4156SSadaf Ebrahimi /* The type of the vector extension prefix */ 646*9a0e4156SSadaf Ebrahimi VectorExtensionType vectorExtensionType; 647*9a0e4156SSadaf Ebrahimi 648*9a0e4156SSadaf Ebrahimi /* The location where a mandatory prefix would have to be (i.e., right before 649*9a0e4156SSadaf Ebrahimi the opcode, or right before the REX prefix if one is present) */ 650*9a0e4156SSadaf Ebrahimi uint64_t necessaryPrefixLocation; 651*9a0e4156SSadaf Ebrahimi 652*9a0e4156SSadaf Ebrahimi /* Sizes of various critical pieces of data, in bytes */ 653*9a0e4156SSadaf Ebrahimi uint8_t registerSize; 654*9a0e4156SSadaf Ebrahimi uint8_t addressSize; 655*9a0e4156SSadaf Ebrahimi uint8_t displacementSize; 656*9a0e4156SSadaf Ebrahimi uint8_t immediateSize; 657*9a0e4156SSadaf Ebrahimi 658*9a0e4156SSadaf Ebrahimi uint8_t immSize; // immediate size for X86_OP_IMM operand 659*9a0e4156SSadaf Ebrahimi 660*9a0e4156SSadaf Ebrahimi /* opcode state */ 661*9a0e4156SSadaf Ebrahimi 662*9a0e4156SSadaf Ebrahimi /* The last byte of the opcode, not counting any ModR/M extension */ 663*9a0e4156SSadaf Ebrahimi uint8_t opcode; 664*9a0e4156SSadaf Ebrahimi 665*9a0e4156SSadaf Ebrahimi /* decode state */ 666*9a0e4156SSadaf Ebrahimi 667*9a0e4156SSadaf Ebrahimi /* The type of opcode, used for indexing into the array of decode tables */ 668*9a0e4156SSadaf Ebrahimi OpcodeType opcodeType; 669*9a0e4156SSadaf Ebrahimi /* The instruction ID, extracted from the decode table */ 670*9a0e4156SSadaf Ebrahimi uint16_t instructionID; 671*9a0e4156SSadaf Ebrahimi /* The specifier for the instruction, from the instruction info table */ 672*9a0e4156SSadaf Ebrahimi const struct InstructionSpecifier *spec; 673*9a0e4156SSadaf Ebrahimi 674*9a0e4156SSadaf Ebrahimi /* state for additional bytes, consumed during operand decode. Pattern: 675*9a0e4156SSadaf Ebrahimi consumed___ indicates that the byte was already consumed and does not 676*9a0e4156SSadaf Ebrahimi need to be consumed again */ 677*9a0e4156SSadaf Ebrahimi 678*9a0e4156SSadaf Ebrahimi /* The VEX.vvvv field, which contains a third register operand for some AVX 679*9a0e4156SSadaf Ebrahimi instructions */ 680*9a0e4156SSadaf Ebrahimi Reg vvvv; 681*9a0e4156SSadaf Ebrahimi 682*9a0e4156SSadaf Ebrahimi /* The writemask for AVX-512 instructions which is contained in EVEX.aaa */ 683*9a0e4156SSadaf Ebrahimi Reg writemask; 684*9a0e4156SSadaf Ebrahimi 685*9a0e4156SSadaf Ebrahimi /* The ModR/M byte, which contains most register operands and some portion of 686*9a0e4156SSadaf Ebrahimi all memory operands */ 687*9a0e4156SSadaf Ebrahimi uint8_t modRM; 688*9a0e4156SSadaf Ebrahimi 689*9a0e4156SSadaf Ebrahimi // special data to handle MOVcr, MOVdr, MOVrc, MOVrd 690*9a0e4156SSadaf Ebrahimi uint8_t firstByte; // save the first byte in stream 691*9a0e4156SSadaf Ebrahimi 692*9a0e4156SSadaf Ebrahimi /* Immediates. There can be two in some cases */ 693*9a0e4156SSadaf Ebrahimi uint8_t numImmediatesTranslated; 694*9a0e4156SSadaf Ebrahimi uint64_t immediates[2]; 695*9a0e4156SSadaf Ebrahimi 696*9a0e4156SSadaf Ebrahimi /* A register or immediate operand encoded into the opcode */ 697*9a0e4156SSadaf Ebrahimi Reg opcodeRegister; 698*9a0e4156SSadaf Ebrahimi 699*9a0e4156SSadaf Ebrahimi /* Portions of the ModR/M byte */ 700*9a0e4156SSadaf Ebrahimi 701*9a0e4156SSadaf Ebrahimi /* These fields determine the allowable values for the ModR/M fields, which 702*9a0e4156SSadaf Ebrahimi depend on operand and address widths */ 703*9a0e4156SSadaf Ebrahimi EABase eaBaseBase; 704*9a0e4156SSadaf Ebrahimi EABase eaRegBase; 705*9a0e4156SSadaf Ebrahimi Reg regBase; 706*9a0e4156SSadaf Ebrahimi 707*9a0e4156SSadaf Ebrahimi /* The Mod and R/M fields can encode a base for an effective address, or a 708*9a0e4156SSadaf Ebrahimi register. These are separated into two fields here */ 709*9a0e4156SSadaf Ebrahimi EABase eaBase; 710*9a0e4156SSadaf Ebrahimi EADisplacement eaDisplacement; 711*9a0e4156SSadaf Ebrahimi /* The reg field always encodes a register */ 712*9a0e4156SSadaf Ebrahimi Reg reg; 713*9a0e4156SSadaf Ebrahimi 714*9a0e4156SSadaf Ebrahimi const struct OperandSpecifier *operands; 715*9a0e4156SSadaf Ebrahimi } InternalInstruction; 716*9a0e4156SSadaf Ebrahimi 717*9a0e4156SSadaf Ebrahimi /* decodeInstruction - Decode one instruction and store the decoding results in 718*9a0e4156SSadaf Ebrahimi * a buffer provided by the consumer. 719*9a0e4156SSadaf Ebrahimi * @param insn - The buffer to store the instruction in. Allocated by the 720*9a0e4156SSadaf Ebrahimi * consumer. 721*9a0e4156SSadaf Ebrahimi * @param reader - The byteReader_t for the bytes to be read. 722*9a0e4156SSadaf Ebrahimi * @param readerArg - An argument to pass to the reader for storing context 723*9a0e4156SSadaf Ebrahimi * specific to the consumer. May be NULL. 724*9a0e4156SSadaf Ebrahimi * @param logger - The dlog_t to be used in printing status messages from the 725*9a0e4156SSadaf Ebrahimi * disassembler. May be NULL. 726*9a0e4156SSadaf Ebrahimi * @param loggerArg - An argument to pass to the logger for storing context 727*9a0e4156SSadaf Ebrahimi * specific to the logger. May be NULL. 728*9a0e4156SSadaf Ebrahimi * @param startLoc - The address (in the reader's address space) of the first 729*9a0e4156SSadaf Ebrahimi * byte in the instruction. 730*9a0e4156SSadaf Ebrahimi * @param mode - The mode (16-bit, 32-bit, 64-bit) to decode in. 731*9a0e4156SSadaf Ebrahimi * @return - Nonzero if there was an error during decode, 0 otherwise. 732*9a0e4156SSadaf Ebrahimi */ 733*9a0e4156SSadaf Ebrahimi int decodeInstruction(struct InternalInstruction* insn, 734*9a0e4156SSadaf Ebrahimi byteReader_t reader, 735*9a0e4156SSadaf Ebrahimi const void* readerArg, 736*9a0e4156SSadaf Ebrahimi uint64_t startLoc, 737*9a0e4156SSadaf Ebrahimi DisassemblerMode mode); 738*9a0e4156SSadaf Ebrahimi 739*9a0e4156SSadaf Ebrahimi //const char *x86DisassemblerGetInstrName(unsigned Opcode, const void *mii); 740*9a0e4156SSadaf Ebrahimi 741*9a0e4156SSadaf Ebrahimi #endif 742