1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */ 2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */ 3*9a0e4156SSadaf Ebrahimi 4*9a0e4156SSadaf Ebrahimi #ifndef CS_X86_MAP_H 5*9a0e4156SSadaf Ebrahimi #define CS_X86_MAP_H 6*9a0e4156SSadaf Ebrahimi 7*9a0e4156SSadaf Ebrahimi #include "capstone/capstone.h" 8*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h" 9*9a0e4156SSadaf Ebrahimi 10*9a0e4156SSadaf Ebrahimi // map sib_base to x86_reg 11*9a0e4156SSadaf Ebrahimi x86_reg x86_map_sib_base(int r); 12*9a0e4156SSadaf Ebrahimi 13*9a0e4156SSadaf Ebrahimi // map sib_index to x86_reg 14*9a0e4156SSadaf Ebrahimi x86_reg x86_map_sib_index(int r); 15*9a0e4156SSadaf Ebrahimi 16*9a0e4156SSadaf Ebrahimi // map seg_override to x86_reg 17*9a0e4156SSadaf Ebrahimi x86_reg x86_map_segment(int r); 18*9a0e4156SSadaf Ebrahimi 19*9a0e4156SSadaf Ebrahimi // return name of regiser in friendly string 20*9a0e4156SSadaf Ebrahimi const char *X86_reg_name(csh handle, unsigned int reg); 21*9a0e4156SSadaf Ebrahimi 22*9a0e4156SSadaf Ebrahimi // given internal insn id, return public instruction info 23*9a0e4156SSadaf Ebrahimi void X86_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id); 24*9a0e4156SSadaf Ebrahimi 25*9a0e4156SSadaf Ebrahimi // return insn name, given insn id 26*9a0e4156SSadaf Ebrahimi const char *X86_insn_name(csh handle, unsigned int id); 27*9a0e4156SSadaf Ebrahimi 28*9a0e4156SSadaf Ebrahimi // return group name, given group id 29*9a0e4156SSadaf Ebrahimi const char *X86_group_name(csh handle, unsigned int id); 30*9a0e4156SSadaf Ebrahimi 31*9a0e4156SSadaf Ebrahimi // return register of given instruction id 32*9a0e4156SSadaf Ebrahimi // return 0 if not found 33*9a0e4156SSadaf Ebrahimi // this is to handle instructions embedding accumulate registers into AsmStrs[] 34*9a0e4156SSadaf Ebrahimi x86_reg X86_insn_reg_intel(unsigned int id, enum cs_ac_type *access); 35*9a0e4156SSadaf Ebrahimi x86_reg X86_insn_reg_att(unsigned int id, enum cs_ac_type *access); 36*9a0e4156SSadaf Ebrahimi bool X86_insn_reg_intel2(unsigned int id, x86_reg *reg1, enum cs_ac_type *access1, x86_reg *reg2, enum cs_ac_type *access2); 37*9a0e4156SSadaf Ebrahimi bool X86_insn_reg_att2(unsigned int id, x86_reg *reg1, enum cs_ac_type *access1, x86_reg *reg2, enum cs_ac_type *access2); 38*9a0e4156SSadaf Ebrahimi 39*9a0e4156SSadaf Ebrahimi extern const uint64_t arch_masks[9]; 40*9a0e4156SSadaf Ebrahimi 41*9a0e4156SSadaf Ebrahimi // handle LOCK/REP/REPNE prefixes 42*9a0e4156SSadaf Ebrahimi // return True if we patch mnemonic, like in MULPD case 43*9a0e4156SSadaf Ebrahimi bool X86_lockrep(MCInst *MI, SStream *O); 44*9a0e4156SSadaf Ebrahimi 45*9a0e4156SSadaf Ebrahimi // map registers to sizes 46*9a0e4156SSadaf Ebrahimi extern const uint8_t regsize_map_32[]; 47*9a0e4156SSadaf Ebrahimi extern const uint8_t regsize_map_64[]; 48*9a0e4156SSadaf Ebrahimi 49*9a0e4156SSadaf Ebrahimi void op_addReg(MCInst *MI, int reg); 50*9a0e4156SSadaf Ebrahimi void op_addImm(MCInst *MI, int v); 51*9a0e4156SSadaf Ebrahimi 52*9a0e4156SSadaf Ebrahimi void op_addAvxBroadcast(MCInst *MI, x86_avx_bcast v); 53*9a0e4156SSadaf Ebrahimi 54*9a0e4156SSadaf Ebrahimi void op_addXopCC(MCInst *MI, int v); 55*9a0e4156SSadaf Ebrahimi void op_addSseCC(MCInst *MI, int v); 56*9a0e4156SSadaf Ebrahimi void op_addAvxCC(MCInst *MI, int v); 57*9a0e4156SSadaf Ebrahimi 58*9a0e4156SSadaf Ebrahimi void op_addAvxZeroOpmask(MCInst *MI); 59*9a0e4156SSadaf Ebrahimi 60*9a0e4156SSadaf Ebrahimi void op_addAvxSae(MCInst *MI); 61*9a0e4156SSadaf Ebrahimi 62*9a0e4156SSadaf Ebrahimi void op_addAvxRoundingMode(MCInst *MI, int v); 63*9a0e4156SSadaf Ebrahimi 64*9a0e4156SSadaf Ebrahimi // given internal insn id, return operand access info 65*9a0e4156SSadaf Ebrahimi uint8_t *X86_get_op_access(cs_struct *h, unsigned int id, uint64_t *eflags); 66*9a0e4156SSadaf Ebrahimi 67*9a0e4156SSadaf Ebrahimi void X86_reg_access(const cs_insn *insn, 68*9a0e4156SSadaf Ebrahimi cs_regs regs_read, uint8_t *regs_read_count, 69*9a0e4156SSadaf Ebrahimi cs_regs regs_write, uint8_t *regs_write_count); 70*9a0e4156SSadaf Ebrahimi 71*9a0e4156SSadaf Ebrahimi // given the instruction id, return the size of its immediate operand (or 0) 72*9a0e4156SSadaf Ebrahimi uint8_t X86_immediate_size(unsigned int id, uint8_t *enc_size); 73*9a0e4156SSadaf Ebrahimi 74*9a0e4156SSadaf Ebrahimi #endif 75