1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */ 2*9a0e4156SSadaf Ebrahimi /* By Dang Hoang Vu <[email protected]> 2013 */ 3*9a0e4156SSadaf Ebrahimi 4*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_X86 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h" 7*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h" 8*9a0e4156SSadaf Ebrahimi #include "X86Disassembler.h" 9*9a0e4156SSadaf Ebrahimi #include "X86InstPrinter.h" 10*9a0e4156SSadaf Ebrahimi #include "X86Mapping.h" 11*9a0e4156SSadaf Ebrahimi #include "X86Module.h" 12*9a0e4156SSadaf Ebrahimi X86_global_init(cs_struct * ud)13*9a0e4156SSadaf Ebrahimics_err X86_global_init(cs_struct *ud) 14*9a0e4156SSadaf Ebrahimi { 15*9a0e4156SSadaf Ebrahimi MCRegisterInfo *mri; 16*9a0e4156SSadaf Ebrahimi mri = cs_mem_malloc(sizeof(*mri)); 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimi X86_init(mri); 19*9a0e4156SSadaf Ebrahimi 20*9a0e4156SSadaf Ebrahimi // by default, we use Intel syntax 21*9a0e4156SSadaf Ebrahimi ud->printer = X86_Intel_printInst; 22*9a0e4156SSadaf Ebrahimi ud->syntax = CS_OPT_SYNTAX_INTEL; 23*9a0e4156SSadaf Ebrahimi ud->printer_info = mri; 24*9a0e4156SSadaf Ebrahimi ud->disasm = X86_getInstruction; 25*9a0e4156SSadaf Ebrahimi ud->reg_name = X86_reg_name; 26*9a0e4156SSadaf Ebrahimi ud->insn_id = X86_get_insn_id; 27*9a0e4156SSadaf Ebrahimi ud->insn_name = X86_insn_name; 28*9a0e4156SSadaf Ebrahimi ud->group_name = X86_group_name; 29*9a0e4156SSadaf Ebrahimi ud->post_printer = NULL;; 30*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET 31*9a0e4156SSadaf Ebrahimi ud->reg_access = X86_reg_access; 32*9a0e4156SSadaf Ebrahimi #endif 33*9a0e4156SSadaf Ebrahimi 34*9a0e4156SSadaf Ebrahimi if (ud->mode == CS_MODE_64) 35*9a0e4156SSadaf Ebrahimi ud->regsize_map = regsize_map_64; 36*9a0e4156SSadaf Ebrahimi else 37*9a0e4156SSadaf Ebrahimi ud->regsize_map = regsize_map_32; 38*9a0e4156SSadaf Ebrahimi 39*9a0e4156SSadaf Ebrahimi return CS_ERR_OK; 40*9a0e4156SSadaf Ebrahimi } 41*9a0e4156SSadaf Ebrahimi X86_option(cs_struct * handle,cs_opt_type type,size_t value)42*9a0e4156SSadaf Ebrahimics_err X86_option(cs_struct *handle, cs_opt_type type, size_t value) 43*9a0e4156SSadaf Ebrahimi { 44*9a0e4156SSadaf Ebrahimi switch(type) { 45*9a0e4156SSadaf Ebrahimi default: 46*9a0e4156SSadaf Ebrahimi break; 47*9a0e4156SSadaf Ebrahimi case CS_OPT_MODE: 48*9a0e4156SSadaf Ebrahimi if (value == CS_MODE_64) 49*9a0e4156SSadaf Ebrahimi handle->regsize_map = regsize_map_64; 50*9a0e4156SSadaf Ebrahimi else 51*9a0e4156SSadaf Ebrahimi handle->regsize_map = regsize_map_32; 52*9a0e4156SSadaf Ebrahimi 53*9a0e4156SSadaf Ebrahimi handle->mode = (cs_mode)value; 54*9a0e4156SSadaf Ebrahimi break; 55*9a0e4156SSadaf Ebrahimi case CS_OPT_SYNTAX: 56*9a0e4156SSadaf Ebrahimi switch(value) { 57*9a0e4156SSadaf Ebrahimi default: 58*9a0e4156SSadaf Ebrahimi // wrong syntax value 59*9a0e4156SSadaf Ebrahimi handle->errnum = CS_ERR_OPTION; 60*9a0e4156SSadaf Ebrahimi return CS_ERR_OPTION; 61*9a0e4156SSadaf Ebrahimi 62*9a0e4156SSadaf Ebrahimi case CS_OPT_SYNTAX_DEFAULT: 63*9a0e4156SSadaf Ebrahimi case CS_OPT_SYNTAX_INTEL: 64*9a0e4156SSadaf Ebrahimi handle->syntax = CS_OPT_SYNTAX_INTEL; 65*9a0e4156SSadaf Ebrahimi handle->printer = X86_Intel_printInst; 66*9a0e4156SSadaf Ebrahimi break; 67*9a0e4156SSadaf Ebrahimi 68*9a0e4156SSadaf Ebrahimi case CS_OPT_SYNTAX_MASM: 69*9a0e4156SSadaf Ebrahimi handle->printer = X86_Intel_printInst; 70*9a0e4156SSadaf Ebrahimi handle->syntax = (int)value; 71*9a0e4156SSadaf Ebrahimi break; 72*9a0e4156SSadaf Ebrahimi 73*9a0e4156SSadaf Ebrahimi case CS_OPT_SYNTAX_ATT: 74*9a0e4156SSadaf Ebrahimi #if !defined(CAPSTONE_DIET) && !defined(CAPSTONE_X86_ATT_DISABLE) 75*9a0e4156SSadaf Ebrahimi handle->printer = X86_ATT_printInst; 76*9a0e4156SSadaf Ebrahimi handle->syntax = CS_OPT_SYNTAX_ATT; 77*9a0e4156SSadaf Ebrahimi break; 78*9a0e4156SSadaf Ebrahimi #elif !defined(CAPSTONE_DIET) && defined(CAPSTONE_X86_ATT_DISABLE) 79*9a0e4156SSadaf Ebrahimi // ATT syntax is unsupported 80*9a0e4156SSadaf Ebrahimi handle->errnum = CS_ERR_X86_ATT; 81*9a0e4156SSadaf Ebrahimi return CS_ERR_X86_ATT; 82*9a0e4156SSadaf Ebrahimi #else // CAPSTONE_DIET 83*9a0e4156SSadaf Ebrahimi // this is irrelevant in CAPSTONE_DIET mode 84*9a0e4156SSadaf Ebrahimi handle->errnum = CS_ERR_DIET; 85*9a0e4156SSadaf Ebrahimi return CS_ERR_DIET; 86*9a0e4156SSadaf Ebrahimi #endif 87*9a0e4156SSadaf Ebrahimi } 88*9a0e4156SSadaf Ebrahimi break; 89*9a0e4156SSadaf Ebrahimi } 90*9a0e4156SSadaf Ebrahimi 91*9a0e4156SSadaf Ebrahimi return CS_ERR_OK; 92*9a0e4156SSadaf Ebrahimi } 93*9a0e4156SSadaf Ebrahimi 94*9a0e4156SSadaf Ebrahimi #endif 95