1*9a0e4156SSadaf Ebrahimi /* Capstone testing regression */
2*9a0e4156SSadaf Ebrahimi /* By Do Minh Tuan <[email protected]>, 02-2019 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi
5*9a0e4156SSadaf Ebrahimi #include "capstone_test.h"
6*9a0e4156SSadaf Ebrahimi
7*9a0e4156SSadaf Ebrahimi single_dict arches[] = {
8*9a0e4156SSadaf Ebrahimi {"CS_ARCH_ARM", CS_ARCH_ARM},
9*9a0e4156SSadaf Ebrahimi {"CS_ARCH_ARM64", CS_ARCH_ARM64},
10*9a0e4156SSadaf Ebrahimi {"CS_ARCH_MIPS", CS_ARCH_MIPS},
11*9a0e4156SSadaf Ebrahimi {"CS_ARCH_PPC", CS_ARCH_PPC},
12*9a0e4156SSadaf Ebrahimi {"CS_ARCH_SPARC", CS_ARCH_SPARC},
13*9a0e4156SSadaf Ebrahimi {"CS_ARCH_SYSZ", CS_ARCH_SYSZ},
14*9a0e4156SSadaf Ebrahimi {"CS_ARCH_X86", CS_ARCH_X86},
15*9a0e4156SSadaf Ebrahimi {"CS_ARCH_XCORE", CS_ARCH_XCORE},
16*9a0e4156SSadaf Ebrahimi {"CS_ARCH_M68K", CS_ARCH_M68K}
17*9a0e4156SSadaf Ebrahimi };
18*9a0e4156SSadaf Ebrahimi
19*9a0e4156SSadaf Ebrahimi single_dict modes[] = {
20*9a0e4156SSadaf Ebrahimi {"CS_MODE_LITTLE_ENDIAN", CS_MODE_LITTLE_ENDIAN},
21*9a0e4156SSadaf Ebrahimi {"CS_MODE_ARM", CS_MODE_ARM},
22*9a0e4156SSadaf Ebrahimi {"CS_MODE_16", CS_MODE_16},
23*9a0e4156SSadaf Ebrahimi {"CS_MODE_32", CS_MODE_32},
24*9a0e4156SSadaf Ebrahimi {"CS_MODE_64", CS_MODE_64},
25*9a0e4156SSadaf Ebrahimi {"CS_MODE_THUMB", CS_MODE_THUMB},
26*9a0e4156SSadaf Ebrahimi {"CS_MODE_MCLASS", CS_MODE_MCLASS},
27*9a0e4156SSadaf Ebrahimi {"CS_MODE_V8", CS_MODE_V8},
28*9a0e4156SSadaf Ebrahimi {"CS_MODE_MICRO", CS_MODE_MICRO},
29*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS3", CS_MODE_MIPS3},
30*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS32R6", CS_MODE_MIPS32R6},
31*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS2", CS_MODE_MIPS2},
32*9a0e4156SSadaf Ebrahimi {"CS_MODE_V9", CS_MODE_V9},
33*9a0e4156SSadaf Ebrahimi {"CS_MODE_QPX", CS_MODE_QPX},
34*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_000", CS_MODE_M68K_000},
35*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_010", CS_MODE_M68K_010},
36*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_020", CS_MODE_M68K_020},
37*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_030", CS_MODE_M68K_030},
38*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_040", CS_MODE_M68K_040},
39*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_060", CS_MODE_M68K_060},
40*9a0e4156SSadaf Ebrahimi {"CS_MODE_BIG_ENDIAN", CS_MODE_BIG_ENDIAN},
41*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS32", CS_MODE_MIPS32},
42*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS64", CS_MODE_MIPS64},
43*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6301", CS_MODE_M680X_6301},
44*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6309", CS_MODE_M680X_6309},
45*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6800", CS_MODE_M680X_6800},
46*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6801", CS_MODE_M680X_6801},
47*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6805", CS_MODE_M680X_6805},
48*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6808", CS_MODE_M680X_6808},
49*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6809", CS_MODE_M680X_6809},
50*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6811", CS_MODE_M680X_6811},
51*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_CPU12", CS_MODE_M680X_CPU12},
52*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_HCS08", CS_MODE_M680X_HCS08}
53*9a0e4156SSadaf Ebrahimi };
54*9a0e4156SSadaf Ebrahimi
55*9a0e4156SSadaf Ebrahimi double_dict options[] = {
56*9a0e4156SSadaf Ebrahimi {"CS_OPT_DETAIL", CS_OPT_DETAIL, CS_OPT_ON},
57*9a0e4156SSadaf Ebrahimi {"CS_OPT_SKIPDATA", CS_OPT_SKIPDATA, CS_OPT_ON},
58*9a0e4156SSadaf Ebrahimi {"CS_OPT_SYNTAX_DEFAULT", CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT},
59*9a0e4156SSadaf Ebrahimi {"CS_OPT_SYNTAX_INTEL", CS_OPT_SYNTAX, CS_OPT_SYNTAX_INTEL},
60*9a0e4156SSadaf Ebrahimi {"CS_OPT_SYNTAX_ATT", CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT},
61*9a0e4156SSadaf Ebrahimi {"CS_OPT_SYNTAX_NOREGNAME", CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME},
62*9a0e4156SSadaf Ebrahimi {"CS_OPT_SYNTAX_MASM", CS_OPT_SYNTAX, CS_OPT_SYNTAX_MASM},
63*9a0e4156SSadaf Ebrahimi {"CS_MODE_LITTLE_ENDIAN", CS_OPT_MODE, CS_MODE_LITTLE_ENDIAN},
64*9a0e4156SSadaf Ebrahimi {"CS_MODE_ARM", CS_OPT_MODE, CS_MODE_ARM},
65*9a0e4156SSadaf Ebrahimi {"CS_MODE_16", CS_OPT_MODE, CS_MODE_16},
66*9a0e4156SSadaf Ebrahimi {"CS_MODE_32", CS_OPT_MODE, CS_MODE_32},
67*9a0e4156SSadaf Ebrahimi {"CS_MODE_64", CS_OPT_MODE, CS_MODE_64},
68*9a0e4156SSadaf Ebrahimi {"CS_MODE_THUMB", CS_OPT_MODE, CS_MODE_THUMB},
69*9a0e4156SSadaf Ebrahimi {"CS_MODE_MCLASS", CS_OPT_MODE, CS_MODE_MCLASS},
70*9a0e4156SSadaf Ebrahimi {"CS_MODE_V8", CS_OPT_MODE, CS_MODE_V8},
71*9a0e4156SSadaf Ebrahimi {"CS_MODE_MICRO", CS_OPT_MODE, CS_MODE_MICRO},
72*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS3", CS_OPT_MODE, CS_MODE_MIPS3},
73*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS32R6", CS_OPT_MODE, CS_MODE_MIPS32R6},
74*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS2", CS_OPT_MODE, CS_MODE_MIPS2},
75*9a0e4156SSadaf Ebrahimi {"CS_MODE_V9", CS_OPT_MODE, CS_MODE_V9},
76*9a0e4156SSadaf Ebrahimi {"CS_MODE_QPX", CS_OPT_MODE, CS_MODE_QPX},
77*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_000", CS_OPT_MODE, CS_MODE_M68K_000},
78*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_010", CS_OPT_MODE, CS_MODE_M68K_010},
79*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_020", CS_OPT_MODE, CS_MODE_M68K_020},
80*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_030", CS_OPT_MODE, CS_MODE_M68K_030},
81*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_040", CS_OPT_MODE, CS_MODE_M68K_040},
82*9a0e4156SSadaf Ebrahimi {"CS_MODE_M68K_060", CS_OPT_MODE, CS_MODE_M68K_060},
83*9a0e4156SSadaf Ebrahimi {"CS_MODE_BIG_ENDIAN", CS_OPT_MODE, CS_MODE_BIG_ENDIAN},
84*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS32", CS_OPT_MODE, CS_MODE_MIPS32},
85*9a0e4156SSadaf Ebrahimi {"CS_MODE_MIPS64", CS_OPT_MODE, CS_MODE_MIPS64},
86*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6301", CS_OPT_MODE, CS_MODE_M680X_6301},
87*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6309", CS_OPT_MODE, CS_MODE_M680X_6309},
88*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6800", CS_OPT_MODE, CS_MODE_M680X_6800},
89*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6801", CS_OPT_MODE, CS_MODE_M680X_6801},
90*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6805", CS_OPT_MODE, CS_MODE_M680X_6805},
91*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6808", CS_OPT_MODE, CS_MODE_M680X_6808},
92*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6809", CS_OPT_MODE, CS_MODE_M680X_6809},
93*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_6811", CS_OPT_MODE, CS_MODE_M680X_6811},
94*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_CPU12", CS_OPT_MODE, CS_MODE_M680X_CPU12},
95*9a0e4156SSadaf Ebrahimi {"CS_MODE_M680X_HCS08", CS_OPT_MODE, CS_MODE_M680X_HCS08},
96*9a0e4156SSadaf Ebrahimi {"CS_OPT_UNSIGNED", CS_OPT_UNSIGNED, CS_OPT_ON}
97*9a0e4156SSadaf Ebrahimi };
98*9a0e4156SSadaf Ebrahimi
99*9a0e4156SSadaf Ebrahimi char *(*function)(csh *, cs_mode, cs_insn*) = NULL;
100*9a0e4156SSadaf Ebrahimi
test_single_MC(csh * handle,int mc_mode,char * line)101*9a0e4156SSadaf Ebrahimi void test_single_MC(csh *handle, int mc_mode, char *line)
102*9a0e4156SSadaf Ebrahimi {
103*9a0e4156SSadaf Ebrahimi char **list_part, **list_byte;
104*9a0e4156SSadaf Ebrahimi int size_part, size_byte, size_data, size_insn;
105*9a0e4156SSadaf Ebrahimi int i, count, count_noreg;
106*9a0e4156SSadaf Ebrahimi unsigned char *code;
107*9a0e4156SSadaf Ebrahimi cs_insn *insn;
108*9a0e4156SSadaf Ebrahimi char tmp[MAXMEM], tmp_mc[MAXMEM], origin[MAXMEM], tmp_noreg[MAXMEM];
109*9a0e4156SSadaf Ebrahimi char **offset_opcode;
110*9a0e4156SSadaf Ebrahimi int size_offset_opcode;
111*9a0e4156SSadaf Ebrahimi unsigned long offset;
112*9a0e4156SSadaf Ebrahimi char *p;
113*9a0e4156SSadaf Ebrahimi
114*9a0e4156SSadaf Ebrahimi list_part = split(line, " = ", &size_part);
115*9a0e4156SSadaf Ebrahimi offset_opcode = split(list_part[0], ": ", &size_offset_opcode);
116*9a0e4156SSadaf Ebrahimi if (size_offset_opcode > 1) {
117*9a0e4156SSadaf Ebrahimi offset = (unsigned int)strtol(offset_opcode[0], NULL, 16);
118*9a0e4156SSadaf Ebrahimi list_byte = split(offset_opcode[1], ",", &size_byte);
119*9a0e4156SSadaf Ebrahimi } else {
120*9a0e4156SSadaf Ebrahimi offset = 0;
121*9a0e4156SSadaf Ebrahimi list_byte = split(offset_opcode[0], ",", &size_byte);
122*9a0e4156SSadaf Ebrahimi }
123*9a0e4156SSadaf Ebrahimi
124*9a0e4156SSadaf Ebrahimi code = (unsigned char *)malloc(size_byte * sizeof(char));
125*9a0e4156SSadaf Ebrahimi for (i = 0; i < size_byte; ++i) {
126*9a0e4156SSadaf Ebrahimi code[i] = (unsigned char)strtol(list_byte[i], NULL, 16);
127*9a0e4156SSadaf Ebrahimi }
128*9a0e4156SSadaf Ebrahimi
129*9a0e4156SSadaf Ebrahimi count = cs_disasm(*handle, code, size_byte, offset, 0, &insn);
130*9a0e4156SSadaf Ebrahimi if (count == 0) {
131*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- %s --- Failed to disassemble given code!\n", list_part[0]);
132*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
133*9a0e4156SSadaf Ebrahimi free_strs(offset_opcode, size_offset_opcode);
134*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
135*9a0e4156SSadaf Ebrahimi free(code);
136*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
137*9a0e4156SSadaf Ebrahimi }
138*9a0e4156SSadaf Ebrahimi if (count > 1) {
139*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- %s --- Multiple instructions(%d) disassembling doesn't support!\n", list_part[0], count);
140*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
141*9a0e4156SSadaf Ebrahimi free_strs(offset_opcode, size_offset_opcode);
142*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
143*9a0e4156SSadaf Ebrahimi free(code);
144*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
145*9a0e4156SSadaf Ebrahimi }
146*9a0e4156SSadaf Ebrahimi
147*9a0e4156SSadaf Ebrahimi for (p = list_part[1]; *p; ++p) *p = tolower(*p);
148*9a0e4156SSadaf Ebrahimi for (p = list_part[1]; *p; ++p)
149*9a0e4156SSadaf Ebrahimi if (*p == '\t') *p = ' ';
150*9a0e4156SSadaf Ebrahimi trim_str(list_part[1]);
151*9a0e4156SSadaf Ebrahimi strcpy(tmp_mc, list_part[1]);
152*9a0e4156SSadaf Ebrahimi replace_hex(tmp_mc);
153*9a0e4156SSadaf Ebrahimi replace_negative(tmp_mc, mc_mode);
154*9a0e4156SSadaf Ebrahimi
155*9a0e4156SSadaf Ebrahimi strcpy(tmp, insn[0].mnemonic);
156*9a0e4156SSadaf Ebrahimi if (strlen(insn[0].op_str) > 0) {
157*9a0e4156SSadaf Ebrahimi tmp[strlen(insn[0].mnemonic)] = ' ';
158*9a0e4156SSadaf Ebrahimi strcpy(tmp + strlen(insn[0].mnemonic) + 1, insn[0].op_str);
159*9a0e4156SSadaf Ebrahimi }
160*9a0e4156SSadaf Ebrahimi
161*9a0e4156SSadaf Ebrahimi trim_str(tmp);
162*9a0e4156SSadaf Ebrahimi strcpy(origin, tmp);
163*9a0e4156SSadaf Ebrahimi replace_hex(tmp);
164*9a0e4156SSadaf Ebrahimi replace_negative(tmp, mc_mode);
165*9a0e4156SSadaf Ebrahimi
166*9a0e4156SSadaf Ebrahimi if (cs_option(*handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME) == CS_ERR_OK) {
167*9a0e4156SSadaf Ebrahimi count_noreg = cs_disasm(*handle, code, size_byte, offset, 0, &insn);
168*9a0e4156SSadaf Ebrahimi strcpy(tmp_noreg, insn[0].mnemonic);
169*9a0e4156SSadaf Ebrahimi if (strlen(insn[0].op_str) > 0) {
170*9a0e4156SSadaf Ebrahimi tmp_noreg[strlen(insn[0].mnemonic)] = ' ';
171*9a0e4156SSadaf Ebrahimi strcpy(tmp_noreg + strlen(insn[0].mnemonic) + 1, insn[0].op_str);
172*9a0e4156SSadaf Ebrahimi }
173*9a0e4156SSadaf Ebrahimi
174*9a0e4156SSadaf Ebrahimi trim_str(tmp_noreg);
175*9a0e4156SSadaf Ebrahimi replace_hex(tmp_noreg);
176*9a0e4156SSadaf Ebrahimi replace_negative(tmp_noreg, mc_mode);
177*9a0e4156SSadaf Ebrahimi
178*9a0e4156SSadaf Ebrahimi if (strcmp(tmp, tmp_mc) && strcmp(tmp_noreg, tmp_mc)) {
179*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- %s --- \"%s\" != \"%s\" ( \"%s\" != \"%s\" and \"%s\" != \"%s\" )\n", list_part[0], origin, list_part[1], tmp, tmp_mc, tmp_noreg, tmp_mc);
180*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
181*9a0e4156SSadaf Ebrahimi free_strs(offset_opcode, size_offset_opcode);
182*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
183*9a0e4156SSadaf Ebrahimi free(code);
184*9a0e4156SSadaf Ebrahimi cs_free(insn, count);
185*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
186*9a0e4156SSadaf Ebrahimi }
187*9a0e4156SSadaf Ebrahimi
188*9a0e4156SSadaf Ebrahimi cs_option(*handle, CS_OPT_SYNTAX, 0);
189*9a0e4156SSadaf Ebrahimi
190*9a0e4156SSadaf Ebrahimi } else if (strcmp(tmp, tmp_mc)) {
191*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- %s --- \"%s\" != \"%s\" ( \"%s\" != \"%s\" )\n", list_part[0], origin, list_part[1], tmp, tmp_mc);
192*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
193*9a0e4156SSadaf Ebrahimi free_strs(offset_opcode, size_offset_opcode);
194*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
195*9a0e4156SSadaf Ebrahimi free(code);
196*9a0e4156SSadaf Ebrahimi cs_free(insn, count);
197*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
198*9a0e4156SSadaf Ebrahimi }
199*9a0e4156SSadaf Ebrahimi
200*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
201*9a0e4156SSadaf Ebrahimi free_strs(offset_opcode, size_offset_opcode);
202*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
203*9a0e4156SSadaf Ebrahimi free(code);
204*9a0e4156SSadaf Ebrahimi cs_free(insn, count);
205*9a0e4156SSadaf Ebrahimi }
206*9a0e4156SSadaf Ebrahimi
get_value(single_dict d[],unsigned int size,const char * str)207*9a0e4156SSadaf Ebrahimi int get_value(single_dict d[], unsigned int size, const char *str)
208*9a0e4156SSadaf Ebrahimi {
209*9a0e4156SSadaf Ebrahimi int i;
210*9a0e4156SSadaf Ebrahimi
211*9a0e4156SSadaf Ebrahimi for (i = 0; i < size; ++i)
212*9a0e4156SSadaf Ebrahimi if (!strcmp(d[i].str, str))
213*9a0e4156SSadaf Ebrahimi return d[i].value;
214*9a0e4156SSadaf Ebrahimi return -1;
215*9a0e4156SSadaf Ebrahimi }
216*9a0e4156SSadaf Ebrahimi
get_index(double_dict d[],unsigned int size,const char * s)217*9a0e4156SSadaf Ebrahimi int get_index(double_dict d[], unsigned int size, const char *s)
218*9a0e4156SSadaf Ebrahimi {
219*9a0e4156SSadaf Ebrahimi int i;
220*9a0e4156SSadaf Ebrahimi
221*9a0e4156SSadaf Ebrahimi for (i = 0; i < size; ++i) {
222*9a0e4156SSadaf Ebrahimi if (!strcmp(s, d[i].str))
223*9a0e4156SSadaf Ebrahimi return i;
224*9a0e4156SSadaf Ebrahimi }
225*9a0e4156SSadaf Ebrahimi return -1;
226*9a0e4156SSadaf Ebrahimi }
227*9a0e4156SSadaf Ebrahimi
set_function(int arch)228*9a0e4156SSadaf Ebrahimi int set_function(int arch)
229*9a0e4156SSadaf Ebrahimi {
230*9a0e4156SSadaf Ebrahimi switch(arch) {
231*9a0e4156SSadaf Ebrahimi case CS_ARCH_ARM:
232*9a0e4156SSadaf Ebrahimi function = get_detail_arm;
233*9a0e4156SSadaf Ebrahimi break;
234*9a0e4156SSadaf Ebrahimi case CS_ARCH_ARM64:
235*9a0e4156SSadaf Ebrahimi function = get_detail_arm64;
236*9a0e4156SSadaf Ebrahimi break;
237*9a0e4156SSadaf Ebrahimi case CS_ARCH_MIPS:
238*9a0e4156SSadaf Ebrahimi function = get_detail_mips;
239*9a0e4156SSadaf Ebrahimi break;
240*9a0e4156SSadaf Ebrahimi case CS_ARCH_PPC:
241*9a0e4156SSadaf Ebrahimi function = get_detail_ppc;
242*9a0e4156SSadaf Ebrahimi break;
243*9a0e4156SSadaf Ebrahimi case CS_ARCH_SPARC:
244*9a0e4156SSadaf Ebrahimi function = get_detail_sparc;
245*9a0e4156SSadaf Ebrahimi break;
246*9a0e4156SSadaf Ebrahimi case CS_ARCH_SYSZ:
247*9a0e4156SSadaf Ebrahimi function = get_detail_sysz;
248*9a0e4156SSadaf Ebrahimi break;
249*9a0e4156SSadaf Ebrahimi case CS_ARCH_X86:
250*9a0e4156SSadaf Ebrahimi function = get_detail_x86;
251*9a0e4156SSadaf Ebrahimi break;
252*9a0e4156SSadaf Ebrahimi case CS_ARCH_XCORE:
253*9a0e4156SSadaf Ebrahimi function = get_detail_xcore;
254*9a0e4156SSadaf Ebrahimi break;
255*9a0e4156SSadaf Ebrahimi case CS_ARCH_M68K:
256*9a0e4156SSadaf Ebrahimi function = get_detail_m68k;
257*9a0e4156SSadaf Ebrahimi break;
258*9a0e4156SSadaf Ebrahimi case CS_ARCH_M680X:
259*9a0e4156SSadaf Ebrahimi function = get_detail_m680x;
260*9a0e4156SSadaf Ebrahimi break;
261*9a0e4156SSadaf Ebrahimi case CS_ARCH_EVM:
262*9a0e4156SSadaf Ebrahimi function = get_detail_evm;
263*9a0e4156SSadaf Ebrahimi break;
264*9a0e4156SSadaf Ebrahimi case CS_ARCH_MOS65XX:
265*9a0e4156SSadaf Ebrahimi function = get_detail_mos65xx;
266*9a0e4156SSadaf Ebrahimi break;
267*9a0e4156SSadaf Ebrahimi case CS_ARCH_TMS320C64X:
268*9a0e4156SSadaf Ebrahimi function = get_detail_tms320c64x;
269*9a0e4156SSadaf Ebrahimi break;
270*9a0e4156SSadaf Ebrahimi default:
271*9a0e4156SSadaf Ebrahimi return -1;
272*9a0e4156SSadaf Ebrahimi }
273*9a0e4156SSadaf Ebrahimi return 0;
274*9a0e4156SSadaf Ebrahimi }
275*9a0e4156SSadaf Ebrahimi
test_single_issue(csh * handle,cs_mode mode,char * line,int detail)276*9a0e4156SSadaf Ebrahimi void test_single_issue(csh *handle, cs_mode mode, char *line, int detail)
277*9a0e4156SSadaf Ebrahimi {
278*9a0e4156SSadaf Ebrahimi char **list_part, **list_byte, **list_part_cs_result, **list_part_issue_result;
279*9a0e4156SSadaf Ebrahimi int size_part, size_byte, size_part_cs_result, size_part_issue_result;
280*9a0e4156SSadaf Ebrahimi char *tmptmp;
281*9a0e4156SSadaf Ebrahimi int i, count, j;
282*9a0e4156SSadaf Ebrahimi unsigned char *code;
283*9a0e4156SSadaf Ebrahimi cs_insn *insn;
284*9a0e4156SSadaf Ebrahimi char *cs_result, *tmp, *p;
285*9a0e4156SSadaf Ebrahimi char **offset_opcode;
286*9a0e4156SSadaf Ebrahimi int size_offset_opcode;
287*9a0e4156SSadaf Ebrahimi unsigned long offset;
288*9a0e4156SSadaf Ebrahimi
289*9a0e4156SSadaf Ebrahimi cs_result = (char *)malloc(sizeof(char));
290*9a0e4156SSadaf Ebrahimi cs_result[0] = '\0';
291*9a0e4156SSadaf Ebrahimi
292*9a0e4156SSadaf Ebrahimi list_part = split(line, " == ", &size_part);
293*9a0e4156SSadaf Ebrahimi
294*9a0e4156SSadaf Ebrahimi offset_opcode = split(list_part[0], ": ", &size_offset_opcode);
295*9a0e4156SSadaf Ebrahimi if (size_offset_opcode > 1) {
296*9a0e4156SSadaf Ebrahimi offset = (unsigned int)strtol(offset_opcode[0], NULL, 16);
297*9a0e4156SSadaf Ebrahimi list_byte = split(offset_opcode[1], ",", &size_byte);
298*9a0e4156SSadaf Ebrahimi } else {
299*9a0e4156SSadaf Ebrahimi offset = 0;
300*9a0e4156SSadaf Ebrahimi list_byte = split(offset_opcode[0], ",", &size_byte);
301*9a0e4156SSadaf Ebrahimi }
302*9a0e4156SSadaf Ebrahimi
303*9a0e4156SSadaf Ebrahimi code = (unsigned char *)malloc(sizeof(char) * size_byte);
304*9a0e4156SSadaf Ebrahimi for (i = 0; i < size_byte; ++i) {
305*9a0e4156SSadaf Ebrahimi code[i] = (unsigned char)strtol(list_byte[i], NULL, 16);
306*9a0e4156SSadaf Ebrahimi }
307*9a0e4156SSadaf Ebrahimi
308*9a0e4156SSadaf Ebrahimi count = cs_disasm(*handle, code, size_byte, offset, 0, &insn);
309*9a0e4156SSadaf Ebrahimi for (i = 0; i < count; ++i) {
310*9a0e4156SSadaf Ebrahimi tmp = (char *)malloc(strlen(insn[i].mnemonic) + strlen(insn[i].op_str) + 100);
311*9a0e4156SSadaf Ebrahimi strcpy(tmp, insn[i].mnemonic);
312*9a0e4156SSadaf Ebrahimi if (strlen(insn[i].op_str) > 0) {
313*9a0e4156SSadaf Ebrahimi tmp[strlen(insn[i].mnemonic)] = ' ';
314*9a0e4156SSadaf Ebrahimi strcpy(tmp + strlen(insn[i].mnemonic) + 1, insn[i].op_str);
315*9a0e4156SSadaf Ebrahimi }
316*9a0e4156SSadaf Ebrahimi add_str(&cs_result, "%s", tmp);
317*9a0e4156SSadaf Ebrahimi free(tmp);
318*9a0e4156SSadaf Ebrahimi }
319*9a0e4156SSadaf Ebrahimi
320*9a0e4156SSadaf Ebrahimi if (detail == 1) {
321*9a0e4156SSadaf Ebrahimi tmp = (*function)(handle, mode, insn);
322*9a0e4156SSadaf Ebrahimi add_str(&cs_result, "%s", tmp);
323*9a0e4156SSadaf Ebrahimi free(tmp);
324*9a0e4156SSadaf Ebrahimi
325*9a0e4156SSadaf Ebrahimi if (insn->detail->groups_count) {
326*9a0e4156SSadaf Ebrahimi add_str(&cs_result, " ; Groups: ");
327*9a0e4156SSadaf Ebrahimi for (j = 0; j < insn->detail->groups_count; j++) {
328*9a0e4156SSadaf Ebrahimi add_str(&cs_result, "%s ", cs_group_name(*handle, insn->detail->groups[j]));
329*9a0e4156SSadaf Ebrahimi }
330*9a0e4156SSadaf Ebrahimi }
331*9a0e4156SSadaf Ebrahimi }
332*9a0e4156SSadaf Ebrahimi
333*9a0e4156SSadaf Ebrahimi trim_str(cs_result);
334*9a0e4156SSadaf Ebrahimi add_str(&cs_result, " ;");
335*9a0e4156SSadaf Ebrahimi // list_part_cs_result = split(cs_result, " ; ", &size_part_cs_result);
336*9a0e4156SSadaf Ebrahimi for (p = list_part[1]; *p; ++p) if (*p == '\t') *p = ' ';
337*9a0e4156SSadaf Ebrahimi list_part_issue_result = split(list_part[1], " ; ", &size_part_issue_result);
338*9a0e4156SSadaf Ebrahimi
339*9a0e4156SSadaf Ebrahimi for (i = 0; i < size_part_issue_result; ++i) {
340*9a0e4156SSadaf Ebrahimi trim_str(list_part_issue_result[i]);
341*9a0e4156SSadaf Ebrahimi memset(tmptmp, MAXMEM, 0);
342*9a0e4156SSadaf Ebrahimi
343*9a0e4156SSadaf Ebrahimi tmptmp = (char *)malloc(sizeof(char));
344*9a0e4156SSadaf Ebrahimi tmptmp[0] = '\0';
345*9a0e4156SSadaf Ebrahimi add_str(&tmptmp, "%s", list_part_issue_result[i]);
346*9a0e4156SSadaf Ebrahimi add_str(&tmptmp, " ;");
347*9a0e4156SSadaf Ebrahimi
348*9a0e4156SSadaf Ebrahimi if ((strstr(cs_result, tmptmp)) == NULL) {
349*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- %s --- \"%s\" not in \"%s\"\n", list_part[0], list_part_issue_result[i], cs_result);
350*9a0e4156SSadaf Ebrahimi cs_free(insn, count);
351*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
352*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
353*9a0e4156SSadaf Ebrahimi free(cs_result);
354*9a0e4156SSadaf Ebrahimi // free_strs(list_part_cs_result, size_part_cs_result);
355*9a0e4156SSadaf Ebrahimi free_strs(list_part_issue_result, size_part_issue_result);
356*9a0e4156SSadaf Ebrahimi free(tmptmp);
357*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
358*9a0e4156SSadaf Ebrahimi }
359*9a0e4156SSadaf Ebrahimi }
360*9a0e4156SSadaf Ebrahimi
361*9a0e4156SSadaf Ebrahimi cs_free(insn, count);
362*9a0e4156SSadaf Ebrahimi free_strs(list_part, size_part);
363*9a0e4156SSadaf Ebrahimi free_strs(list_byte, size_byte);
364*9a0e4156SSadaf Ebrahimi free(cs_result);
365*9a0e4156SSadaf Ebrahimi // free_strs(list_part_cs_result, size_part_cs_result);
366*9a0e4156SSadaf Ebrahimi free_strs(list_part_issue_result, size_part_issue_result);
367*9a0e4156SSadaf Ebrahimi }
368