1 /* Capstone Disassembly Engine */ 2 /* By Dang Hoang Vu <danghvu (at) gmail.com> 2013 */ 3 4 #ifdef CAPSTONE_HAS_ARM64 5 6 #include "../../utils.h" 7 #include "../../MCRegisterInfo.h" 8 #include "AArch64Disassembler.h" 9 #include "AArch64InstPrinter.h" 10 #include "AArch64Mapping.h" 11 12 static cs_err init(cs_struct *ud) 13 { 14 MCRegisterInfo *mri; 15 16 // verify if requested mode is valid 17 if (ud->mode & ~(CS_MODE_LITTLE_ENDIAN | CS_MODE_ARM | CS_MODE_BIG_ENDIAN)) 18 return CS_ERR_MODE; 19 20 mri = cs_mem_malloc(sizeof(*mri)); 21 22 AArch64_init(mri); 23 ud->printer = AArch64_printInst; 24 ud->printer_info = mri; 25 ud->getinsn_info = mri; 26 ud->disasm = AArch64_getInstruction; 27 ud->reg_name = AArch64_reg_name; 28 ud->insn_id = AArch64_get_insn_id; 29 ud->insn_name = AArch64_insn_name; 30 ud->group_name = AArch64_group_name; 31 ud->post_printer = AArch64_post_printer; 32 33 return CS_ERR_OK; 34 } 35 36 static cs_err option(cs_struct *handle, cs_opt_type type, size_t value) 37 { 38 if (type == CS_OPT_MODE) { 39 handle->big_endian = (((cs_mode)value & CS_MODE_BIG_ENDIAN) != 0); 40 } 41 42 return CS_ERR_OK; 43 } 44 45 static void destroy(cs_struct *handle) 46 { 47 } 48 49 void AArch64_enable(void) 50 { 51 arch_init[CS_ARCH_ARM64] = init; 52 arch_option[CS_ARCH_ARM64] = option; 53 arch_destroy[CS_ARCH_ARM64] = destroy; 54 55 // support this arch 56 all_arch |= (1 << CS_ARCH_ARM64); 57 } 58 59 #endif 60