xref: /aosp_15_r20/external/capstone/arch/X86/X86Module.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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 Ebrahimi cs_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 Ebrahimi cs_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