131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu/*===-- X86DisassemblerDecoderInternal.h - Disassembler decoder ---*- C -*-===* 28ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * 38ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * The LLVM Compiler Infrastructure 48ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * 58ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * This file is distributed under the University of Illinois Open Source 68ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * License. See LICENSE.TXT for details. 78ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * 88ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *===----------------------------------------------------------------------===* 98ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * 108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * This file is part of the X86 Disassembler. 118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * It contains the public interface of the instruction decoder. 128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Documentation for the disassembler can be found in X86Disassembler.h. 138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * 148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan *===----------------------------------------------------------------------===*/ 158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#ifndef X86DISASSEMBLERDECODER_H 178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define X86DISASSEMBLERDECODER_H 188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#ifdef __cplusplus 208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananextern "C" { 218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif 22a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 235a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper#define INSTRUCTION_SPECIFIER_FIELDS \ 245a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper uint16_t operands; 258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define INSTRUCTION_IDS \ 27ce8f4c58d8804ee2cfda7751cdc6520bc5f43dd7Craig Topper unsigned instructionIDs; 288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#include "X86DisassemblerDecoderCommon.h" 30a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef INSTRUCTION_SPECIFIER_FIELDS 328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef INSTRUCTION_IDS 33a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Accessor functions for various fields of an Intel instruction 368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 37a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define modFromModRM(modRM) (((modRM) & 0xc0) >> 6) 38a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define regFromModRM(modRM) (((modRM) & 0x38) >> 3) 39a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rmFromModRM(modRM) ((modRM) & 0x7) 40a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define scaleFromSIB(sib) (((sib) & 0xc0) >> 6) 41a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define indexFromSIB(sib) (((sib) & 0x38) >> 3) 42a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define baseFromSIB(sib) ((sib) & 0x7) 43a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define wFromREX(rex) (((rex) & 0x8) >> 3) 44a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromREX(rex) (((rex) & 0x4) >> 2) 45a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define xFromREX(rex) (((rex) & 0x2) >> 1) 46a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define bFromREX(rex) ((rex) & 0x1) 47a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 48a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromVEX2of3(vex) (((~(vex)) & 0x80) >> 7) 49a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define xFromVEX2of3(vex) (((~(vex)) & 0x40) >> 6) 50a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define bFromVEX2of3(vex) (((~(vex)) & 0x20) >> 5) 51a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define mmmmmFromVEX2of3(vex) ((vex) & 0x1f) 52a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define wFromVEX3of3(vex) (((vex) & 0x80) >> 7) 53a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define vvvvFromVEX3of3(vex) (((~(vex)) & 0x78) >> 3) 54a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define lFromVEX3of3(vex) (((vex) & 0x4) >> 2) 55a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define ppFromVEX3of3(vex) ((vex) & 0x3) 56a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 57a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define rFromVEX2of2(vex) (((~(vex)) & 0x80) >> 7) 58a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define vvvvFromVEX2of2(vex) (((~(vex)) & 0x78) >> 3) 59a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define lFromVEX2of2(vex) (((vex) & 0x4) >> 2) 60a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define ppFromVEX2of2(vex) ((vex) & 0x3) 618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * These enums represent Intel registers for use by the decoder. 648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_8BIT \ 678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(AL) \ 688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(CL) \ 698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DL) \ 708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BL) \ 718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(AH) \ 728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(CH) \ 738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DH) \ 748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BH) \ 758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8B) \ 768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9B) \ 778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10B) \ 788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11B) \ 798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12B) \ 808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13B) \ 818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14B) \ 828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15B) \ 838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SPL) \ 848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BPL) \ 858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SIL) \ 868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DIL) 878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_16BIT \ 898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BX_SI) \ 908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BX_DI) \ 918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BP_SI) \ 928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BP_DI) \ 938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SI) \ 948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DI) \ 958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BP) \ 968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BX) \ 978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8W) \ 988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9W) \ 998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10W) \ 1008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11W) \ 1018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12W) \ 1028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13W) \ 1038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14W) \ 1048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15W) 1058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_16BIT \ 1078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(AX) \ 1088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(CX) \ 1098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DX) \ 1108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BX) \ 1118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SP) \ 1128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(BP) \ 1138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SI) \ 1148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DI) \ 1158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8W) \ 1168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9W) \ 1178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10W) \ 1188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11W) \ 1198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12W) \ 1208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13W) \ 1218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14W) \ 1228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15W) 1238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_32BIT \ 1258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EAX) \ 1268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ECX) \ 1278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EDX) \ 1288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EBX) \ 1298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(sib) \ 1308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EBP) \ 1318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ESI) \ 1328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EDI) \ 1338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8D) \ 1348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9D) \ 1358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10D) \ 1368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11D) \ 1378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12D) \ 1388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13D) \ 1398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14D) \ 1408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15D) 1418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_32BIT \ 1438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EAX) \ 1448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ECX) \ 1458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EDX) \ 1468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EBX) \ 1478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ESP) \ 1488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EBP) \ 1498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ESI) \ 1508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(EDI) \ 1518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8D) \ 1528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9D) \ 1538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10D) \ 1548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11D) \ 1558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12D) \ 1568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13D) \ 1578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14D) \ 1588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15D) 1598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define EA_BASES_64BIT \ 1618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RAX) \ 1628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RCX) \ 1638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RDX) \ 1648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RBX) \ 1658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(sib64) \ 1668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RBP) \ 1678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RSI) \ 1688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RDI) \ 1698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8) \ 1708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9) \ 1718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10) \ 1728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11) \ 1738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12) \ 1748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13) \ 1758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14) \ 1768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15) 1778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_64BIT \ 1798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RAX) \ 1808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RCX) \ 1818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RDX) \ 1828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RBX) \ 1838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RSP) \ 1848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RBP) \ 1858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RSI) \ 1868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RDI) \ 1878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R8) \ 1888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R9) \ 1898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R10) \ 1908ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R11) \ 1918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R12) \ 1928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R13) \ 1938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R14) \ 1948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(R15) 1958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 1968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_MMX \ 1978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM0) \ 1988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM1) \ 1998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM2) \ 2008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM3) \ 2018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM4) \ 2028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM5) \ 2038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM6) \ 2048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(MM7) 2058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 2068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_XMM \ 2078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM0) \ 2088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM1) \ 2098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM2) \ 2108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM3) \ 2118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM4) \ 2128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM5) \ 2138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM6) \ 2148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM7) \ 2158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM8) \ 2168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM9) \ 2178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM10) \ 2188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM11) \ 2198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM12) \ 2208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM13) \ 2218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM14) \ 2228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(XMM15) 223a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 224a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan#define REGS_YMM \ 225a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM0) \ 226a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM1) \ 227a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM2) \ 228a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM3) \ 229a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM4) \ 230a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM5) \ 231a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM6) \ 232a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM7) \ 233a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM8) \ 234a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM9) \ 235a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM10) \ 236a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM11) \ 237a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM12) \ 238a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM13) \ 239a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM14) \ 240a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan ENTRY(YMM15) 241a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 2428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_SEGMENT \ 2438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(ES) \ 2448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(CS) \ 2458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(SS) \ 2468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DS) \ 2478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(FS) \ 2488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(GS) 249a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 2508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define REGS_DEBUG \ 2518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR0) \ 2528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR1) \ 2538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR2) \ 2548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR3) \ 2558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR4) \ 2568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR5) \ 2578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR6) \ 2588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(DR7) 2598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 2601a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan#define REGS_CONTROL \ 2611a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR0) \ 2621a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR1) \ 2631a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR2) \ 2641a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR3) \ 2651a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR4) \ 2661a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR5) \ 2671a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR6) \ 2681a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR7) \ 2691a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan ENTRY(CR8) 270a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 2718ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_EA_BASES \ 2728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_BASES_16BIT \ 2738ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_BASES_32BIT \ 2748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_BASES_64BIT 275a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 2768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_SIB_BASES \ 2778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_32BIT \ 2788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_64BIT 2798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 2808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ALL_REGS \ 2818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_8BIT \ 2828ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_16BIT \ 2838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_32BIT \ 2848ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_64BIT \ 2858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_MMX \ 2868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_XMM \ 287a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan REGS_YMM \ 2888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_SEGMENT \ 2898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan REGS_DEBUG \ 2901a8b789a4b8290d263c1c75411788ca45bae3230Sean Callanan REGS_CONTROL \ 2918ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ENTRY(RIP) 2928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 2938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 294a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper * EABase - All possible values of the base field for effective-address 2958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * computations, a.k.a. the Mod and R/M fields of the ModR/M byte. We 2968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * distinguish between bases (EA_BASE_*) and registers that just happen to be 2978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * referred to when Mod == 0b11 (EA_REG_*). 2988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 2998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 3008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_BASE_NONE, 3018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) EA_BASE_##x, 3028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ALL_EA_BASES 3038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY 3048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) EA_REG_##x, 3058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ALL_REGS 3068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY 3078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_max 3088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} EABase; 309a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 310a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper/* 3118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SIBIndex - All possible values of the SIB index field. 3128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Borrows entries from ALL_EA_BASES with the special case that 3138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * sib is synonymous with NONE. 3141f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren * Vector SIB: index can be XMM or YMM. 3158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 3168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 3178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIB_INDEX_NONE, 3188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) SIB_INDEX_##x, 3198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ALL_EA_BASES 3201f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren REGS_XMM 3211f7a1b68a07ea6bdf521525a7928f4a8c5216713Manman Ren REGS_YMM 3228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY 3238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIB_INDEX_max 3248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SIBIndex; 325a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 3268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 3278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SIBBase - All possible values of the SIB base field. 3288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 3298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 3308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIB_BASE_NONE, 3318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#define ENTRY(x) SIB_BASE_##x, 3328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ALL_SIB_BASES 3338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY 3348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIB_BASE_max 3358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SIBBase; 3368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 3378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 3388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * EADisplacement - Possible displacement types for effective-address 3398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * computations. 3408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 3418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 3428ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_DISP_NONE, 3438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_DISP_8, 3448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_DISP_16, 3458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EA_DISP_32 3468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} EADisplacement; 3478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 3488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 3498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * Reg - All possible values of the reg field in the ModR/M byte. 3508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 3518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 35206b766d1c0ff7373e911fe5f8c42f62aa2f67e92Sean Callanan#define ENTRY(x) MODRM_REG_##x, 3538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan ALL_REGS 3548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#undef ENTRY 35506b766d1c0ff7373e911fe5f8c42f62aa2f67e92Sean Callanan MODRM_REG_max 3568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} Reg; 357a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 3588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 3598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * SegmentOverride - All possible segment overrides. 3608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 3618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef enum { 3628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_NONE, 3638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_CS, 3648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_SS, 3658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_DS, 3668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_ES, 3678ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_FS, 3688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_GS, 3698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SEG_OVERRIDE_max 3708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} SegmentOverride; 371a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 372a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan/* 373a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan * VEXLeadingOpcodeByte - Possible values for the VEX.m-mmmm field 374a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan */ 375a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 376a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanantypedef enum { 377a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_LOB_0F = 0x1, 378a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_LOB_0F38 = 0x2, 379a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_LOB_0F3A = 0x3 380a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan} VEXLeadingOpcodeByte; 381a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 382a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan/* 383a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan * VEXPrefixCode - Possible values for the VEX.pp field 384a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan */ 385a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 386a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanantypedef enum { 387a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_PREFIX_NONE = 0x0, 388a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_PREFIX_66 = 0x1, 389a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_PREFIX_F3 = 0x2, 390a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan VEX_PREFIX_F2 = 0x3 391a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan} VEXPrefixCode; 3928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 3938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef uint8_t BOOL; 3948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 3958ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 3968ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * byteReader_t - Type for the byte reader that the consumer must provide to 3978ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * the decoder. Reads a single byte from the instruction's address space. 3988ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param arg - A baton that the consumer can associate with any internal 3998ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * state that it needs. 4008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param byte - A pointer to a single byte in memory that should be set to 4018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * contain the value at address. 4028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param address - The address in the instruction's address space that should 4038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * be read from. 4048ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @return - -1 if the byte cannot be read for any reason; 0 otherwise. 4058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 406b438615abdc826a2fef33895b50dc60e3f39f988Roman Divackytypedef int (*byteReader_t)(const void* arg, uint8_t* byte, uint64_t address); 4078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 4088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 4098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * dlog_t - Type for the logging function that the consumer can provide to 4108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * get debugging output from the decoder. 4118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param arg - A baton that the consumer can associate with any internal 4128ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * state that it needs. 4138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param log - A string that contains the message. Will be reused after 4148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * the logger returns. 4158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 4168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanantypedef void (*dlog_t)(void* arg, const char *log); 4178ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 4188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* 4198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * The x86 internal instruction, which is produced by the decoder. 4208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 4218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananstruct InternalInstruction { 4228ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Reader interface (C) */ 4238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan byteReader_t reader; 4248ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Opaque value passed to the reader */ 425b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky const void* readerArg; 4268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The address of the next byte to read via the reader */ 4278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t readerCursor; 4288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 4298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Logger interface (C) */ 4308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan dlog_t dlog; 4318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Opaque value passed to the logger */ 4328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan void* dlogArg; 4338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 4348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* General instruction information */ 435a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The mode to disassemble for (64-bit, protected, real) */ 4378ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan DisassemblerMode mode; 4388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The start of the instruction, usable with the reader */ 4398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t startLocation; 4408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The length of the instruction, in bytes */ 4418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan size_t length; 442a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4438ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Prefix state */ 444a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* 1 if the prefix byte corresponding to the entry is present; 0 if not */ 4468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t prefixPresent[0x100]; 4478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* contains the location (for use with the reader) of the prefix byte */ 4488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t prefixLocations[0x100]; 449a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan /* The value of the VEX prefix, if present */ 450a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan uint8_t vexPrefix[3]; 451a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan /* The length of the VEX prefix (0 if not present) */ 452a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan uint8_t vexSize; 4538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The value of the REX prefix, if present */ 4548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t rexPrefix; 4558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The location where a mandatory prefix would have to be (i.e., right before 4568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan the opcode, or right before the REX prefix if one is present) */ 4578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t necessaryPrefixLocation; 4588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The segment override type */ 4598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SegmentOverride segmentOverride; 460a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 46189e59e6343303696e14d4c134582dda083cf7408Sean Callanan /* Sizes of various critical pieces of data, in bytes */ 4628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t registerSize; 4638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t addressSize; 4648ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t displacementSize; 4658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t immediateSize; 466b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby 467b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby /* Offsets from the start of the instruction to the pieces of data, which is 468b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby needed to find relocation entries for adding symbolic operands */ 469b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby uint8_t displacementOffset; 470b80d571ea85db5d52fafed0523cf59e693502198Kevin Enderby uint8_t immediateOffset; 471a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4728ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* opcode state */ 473a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4748ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The value of the two-byte escape prefix (usually 0x0f) */ 4758ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t twoByteEscape; 4768ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The value of the three-byte escape prefix (usually 0x38 or 0x3a) */ 4778ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t threeByteEscape; 4788ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The last byte of the opcode, not counting any ModR/M extension */ 4798ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t opcode; 4808ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The ModR/M byte of the instruction, if it is an opcode extension */ 4818ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t modRMExtension; 482a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4838ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* decode state */ 484a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The type of opcode, used for indexing into the array of decode tables */ 4868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan OpcodeType opcodeType; 4878ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The instruction ID, extracted from the decode table */ 4888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint16_t instructionID; 4898ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The specifier for the instruction, from the instruction info table */ 4904d1dca92bd6d4aad7121e28c7ffc93c0a6a187d7Benjamin Kramer const struct InstructionSpecifier *spec; 491a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 4928ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* state for additional bytes, consumed during operand decode. Pattern: 4938ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan consumed___ indicates that the byte was already consumed and does not 4948ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan need to be consumed again */ 495a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan 4967a2bdde0a0eebcd2125055e0eacaca040f0b766cChris Lattner /* The VEX.vvvv field, which contains a third register operand for some AVX 497a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan instructions */ 498a21e2eae3def2fe39caed861dcb73c76c715569bSean Callanan Reg vvvv; 499a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5008ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The ModR/M byte, which contains most register operands and some portion of 5018ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan all memory operands */ 5028ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan BOOL consumedModRM; 5038ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t modRM; 504a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5058ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The SIB byte, used for more complex 32- or 64-bit memory operands */ 5068ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan BOOL consumedSIB; 5078ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t sib; 5088ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 5098ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The displacement, used for memory operands */ 5108ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan BOOL consumedDisplacement; 5118ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan int32_t displacement; 512a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5138ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Immediates. There can be two in some cases */ 5148ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t numImmediatesConsumed; 5158ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t numImmediatesTranslated; 5168ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t immediates[2]; 517a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5188ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* A register or immediate operand encoded into the opcode */ 5198ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan BOOL consumedOpcodeModifier; 5208ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t opcodeModifier; 5218ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan Reg opcodeRegister; 522a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5238ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* Portions of the ModR/M byte */ 524a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5258ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* These fields determine the allowable values for the ModR/M fields, which 5268ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan depend on operand and address widths */ 5278ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EABase eaBaseBase; 5288ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EABase eaRegBase; 5298ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan Reg regBase; 5308ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 5318ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The Mod and R/M fields can encode a base for an effective address, or a 5328ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan register. These are separated into two fields here */ 5338ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EABase eaBase; 5348ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan EADisplacement eaDisplacement; 5358ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* The reg field always encodes a register */ 5368ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan Reg reg; 537a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5388ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan /* SIB state */ 5398ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIBIndex sibIndex; 5408ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint8_t sibScale; 5418ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan SIBBase sibBase; 5425a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper 5435a2c607153993fb7f7e04f9482520b64dffe5757Craig Topper const struct OperandSpecifier *operands; 5448ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan}; 5458ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 5468ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan/* decodeInstruction - Decode one instruction and store the decoding results in 5478ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * a buffer provided by the consumer. 5488ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param insn - The buffer to store the instruction in. Allocated by the 5498ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * consumer. 5508ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param reader - The byteReader_t for the bytes to be read. 5518ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param readerArg - An argument to pass to the reader for storing context 5528ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * specific to the consumer. May be NULL. 5538ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param logger - The dlog_t to be used in printing status messages from the 5548ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * disassembler. May be NULL. 5558ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param loggerArg - An argument to pass to the logger for storing context 5568ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * specific to the logger. May be NULL. 5578ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param startLoc - The address (in the reader's address space) of the first 5588ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * byte in the instruction. 5598ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @param mode - The mode (16-bit, 32-bit, 64-bit) to decode in. 5608ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan * @return - Nonzero if there was an error during decode, 0 otherwise. 5618ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan */ 5628ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callananint decodeInstruction(struct InternalInstruction* insn, 5638ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan byteReader_t reader, 564b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky const void* readerArg, 5658ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan dlog_t logger, 5668ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan void* loggerArg, 567b438615abdc826a2fef33895b50dc60e3f39f988Roman Divacky const void* miiArg, 5688ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan uint64_t startLoc, 5698ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan DisassemblerMode mode); 5708ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan 571a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan/* x86DisassemblerDebug - C-accessible function for printing a message to 572a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * debugs() 573a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param file - The name of the file printing the debug message. 574a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param line - The line number that printed the debug message. 575a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan * @param s - The message to print. 576a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan */ 577a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 578a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callananvoid x86DisassemblerDebug(const char *file, 579a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan unsigned line, 580a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan const char *s); 581a144c3f34dd8adc093d9be6cbc3e6f39d47c75ddSean Callanan 582b438615abdc826a2fef33895b50dc60e3f39f988Roman Divackyconst char *x86DisassemblerGetInstrName(unsigned Opcode, const void *mii); 583953362cdfbf1088153f65376c86d22ee0176bcdfBenjamin Kramer 584a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper#ifdef __cplusplus 5858ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan} 5868ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif 587a40476f9cc87681fd30af66085797dc3e60f8a94Craig Topper 5888ed9f51663bc5533f36ca62e5668ae08e9a1313fSean Callanan#endif 589