xref: /aosp_15_r20/external/capstone/tests/test_systemz.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembler Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2014 */
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi #include <stdio.h>
5*9a0e4156SSadaf Ebrahimi 
6*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
7*9a0e4156SSadaf Ebrahimi #include <capstone/capstone.h>
8*9a0e4156SSadaf Ebrahimi 
9*9a0e4156SSadaf Ebrahimi struct platform {
10*9a0e4156SSadaf Ebrahimi 	cs_arch arch;
11*9a0e4156SSadaf Ebrahimi 	cs_mode mode;
12*9a0e4156SSadaf Ebrahimi 	unsigned char *code;
13*9a0e4156SSadaf Ebrahimi 	size_t size;
14*9a0e4156SSadaf Ebrahimi 	const char *comment;
15*9a0e4156SSadaf Ebrahimi };
16*9a0e4156SSadaf Ebrahimi 
17*9a0e4156SSadaf Ebrahimi static csh handle;
18*9a0e4156SSadaf Ebrahimi 
print_string_hex(const char * comment,unsigned char * str,size_t len)19*9a0e4156SSadaf Ebrahimi static void print_string_hex(const char *comment, unsigned char *str, size_t len)
20*9a0e4156SSadaf Ebrahimi {
21*9a0e4156SSadaf Ebrahimi 	unsigned char *c;
22*9a0e4156SSadaf Ebrahimi 
23*9a0e4156SSadaf Ebrahimi 	printf("%s", comment);
24*9a0e4156SSadaf Ebrahimi 	for (c = str; c < str + len; c++) {
25*9a0e4156SSadaf Ebrahimi 		printf("0x%02x ", *c & 0xff);
26*9a0e4156SSadaf Ebrahimi 	}
27*9a0e4156SSadaf Ebrahimi 
28*9a0e4156SSadaf Ebrahimi 	printf("\n");
29*9a0e4156SSadaf Ebrahimi }
30*9a0e4156SSadaf Ebrahimi 
print_insn_detail(cs_insn * ins)31*9a0e4156SSadaf Ebrahimi static void print_insn_detail(cs_insn *ins)
32*9a0e4156SSadaf Ebrahimi {
33*9a0e4156SSadaf Ebrahimi 	cs_sysz *sysz;
34*9a0e4156SSadaf Ebrahimi 	int i;
35*9a0e4156SSadaf Ebrahimi 
36*9a0e4156SSadaf Ebrahimi 	// detail can be NULL on "data" instruction if SKIPDATA option is turned ON
37*9a0e4156SSadaf Ebrahimi 	if (ins->detail == NULL)
38*9a0e4156SSadaf Ebrahimi 		return;
39*9a0e4156SSadaf Ebrahimi 
40*9a0e4156SSadaf Ebrahimi 	sysz = &(ins->detail->sysz);
41*9a0e4156SSadaf Ebrahimi 	if (sysz->op_count)
42*9a0e4156SSadaf Ebrahimi 		printf("\top_count: %u\n", sysz->op_count);
43*9a0e4156SSadaf Ebrahimi 
44*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < sysz->op_count; i++) {
45*9a0e4156SSadaf Ebrahimi 		cs_sysz_op *op = &(sysz->operands[i]);
46*9a0e4156SSadaf Ebrahimi 		switch((int)op->type) {
47*9a0e4156SSadaf Ebrahimi 			default:
48*9a0e4156SSadaf Ebrahimi 				break;
49*9a0e4156SSadaf Ebrahimi 			case SYSZ_OP_REG:
50*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: REG = %s\n", i, cs_reg_name(handle, op->reg));
51*9a0e4156SSadaf Ebrahimi 				break;
52*9a0e4156SSadaf Ebrahimi 			case SYSZ_OP_ACREG:
53*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: ACREG = %u\n", i, op->reg);
54*9a0e4156SSadaf Ebrahimi 				break;
55*9a0e4156SSadaf Ebrahimi 			case SYSZ_OP_IMM:
56*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: IMM = 0x%" PRIx64 "\n", i, op->imm);
57*9a0e4156SSadaf Ebrahimi 				break;
58*9a0e4156SSadaf Ebrahimi 			case SYSZ_OP_MEM:
59*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: MEM\n", i);
60*9a0e4156SSadaf Ebrahimi 				if (op->mem.base != SYSZ_REG_INVALID)
61*9a0e4156SSadaf Ebrahimi 					printf("\t\t\toperands[%u].mem.base: REG = %s\n",
62*9a0e4156SSadaf Ebrahimi 							i, cs_reg_name(handle, op->mem.base));
63*9a0e4156SSadaf Ebrahimi 				if (op->mem.index != SYSZ_REG_INVALID)
64*9a0e4156SSadaf Ebrahimi 					printf("\t\t\toperands[%u].mem.index: REG = %s\n",
65*9a0e4156SSadaf Ebrahimi 							i, cs_reg_name(handle, op->mem.index));
66*9a0e4156SSadaf Ebrahimi 				if (op->mem.length != 0)
67*9a0e4156SSadaf Ebrahimi 					printf("\t\t\toperands[%u].mem.length: 0x%" PRIx64 "\n", i, op->mem.length);
68*9a0e4156SSadaf Ebrahimi 				if (op->mem.disp != 0)
69*9a0e4156SSadaf Ebrahimi 					printf("\t\t\toperands[%u].mem.disp: 0x%" PRIx64 "\n", i, op->mem.disp);
70*9a0e4156SSadaf Ebrahimi 
71*9a0e4156SSadaf Ebrahimi 				break;
72*9a0e4156SSadaf Ebrahimi 		}
73*9a0e4156SSadaf Ebrahimi 	}
74*9a0e4156SSadaf Ebrahimi 
75*9a0e4156SSadaf Ebrahimi 	if (sysz->cc != 0)
76*9a0e4156SSadaf Ebrahimi 		printf("\tCode condition: %u\n", sysz->cc);
77*9a0e4156SSadaf Ebrahimi 
78*9a0e4156SSadaf Ebrahimi 	printf("\n");
79*9a0e4156SSadaf Ebrahimi }
80*9a0e4156SSadaf Ebrahimi 
test()81*9a0e4156SSadaf Ebrahimi static void test()
82*9a0e4156SSadaf Ebrahimi {
83*9a0e4156SSadaf Ebrahimi #define SYSZ_CODE "\xed\x00\x00\x00\x00\x1a\x5a\x0f\x1f\xff\xc2\x09\x80\x00\x00\x00\x07\xf7\xeb\x2a\xff\xff\x7f\x57\xe3\x01\xff\xff\x7f\x57\xeb\x00\xf0\x00\x00\x24\xb2\x4f\x00\x78\xec\x18\x00\x00\xc1\x7f"
84*9a0e4156SSadaf Ebrahimi 
85*9a0e4156SSadaf Ebrahimi 	struct platform platforms[] = {
86*9a0e4156SSadaf Ebrahimi 		{
87*9a0e4156SSadaf Ebrahimi 			CS_ARCH_SYSZ,
88*9a0e4156SSadaf Ebrahimi 			CS_MODE_BIG_ENDIAN,
89*9a0e4156SSadaf Ebrahimi 			(unsigned char*)SYSZ_CODE,
90*9a0e4156SSadaf Ebrahimi 			sizeof(SYSZ_CODE) - 1,
91*9a0e4156SSadaf Ebrahimi 			"SystemZ",
92*9a0e4156SSadaf Ebrahimi 		},
93*9a0e4156SSadaf Ebrahimi 	};
94*9a0e4156SSadaf Ebrahimi 
95*9a0e4156SSadaf Ebrahimi 	uint64_t address = 0x1000;
96*9a0e4156SSadaf Ebrahimi 	cs_insn *insn;
97*9a0e4156SSadaf Ebrahimi 	int i;
98*9a0e4156SSadaf Ebrahimi 	size_t count;
99*9a0e4156SSadaf Ebrahimi 
100*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
101*9a0e4156SSadaf Ebrahimi 		cs_err err = cs_open(platforms[i].arch, platforms[i].mode, &handle);
102*9a0e4156SSadaf Ebrahimi 		if (err) {
103*9a0e4156SSadaf Ebrahimi 			printf("Failed on cs_open() with error returned: %u\n", err);
104*9a0e4156SSadaf Ebrahimi 			abort();
105*9a0e4156SSadaf Ebrahimi 		}
106*9a0e4156SSadaf Ebrahimi 
107*9a0e4156SSadaf Ebrahimi 		cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
108*9a0e4156SSadaf Ebrahimi 
109*9a0e4156SSadaf Ebrahimi 		count = cs_disasm(handle, platforms[i].code, platforms[i].size, address, 0, &insn);
110*9a0e4156SSadaf Ebrahimi 		if (count) {
111*9a0e4156SSadaf Ebrahimi 			size_t j;
112*9a0e4156SSadaf Ebrahimi 
113*9a0e4156SSadaf Ebrahimi 			printf("****************\n");
114*9a0e4156SSadaf Ebrahimi 			printf("Platform: %s\n", platforms[i].comment);
115*9a0e4156SSadaf Ebrahimi 			print_string_hex("Code:", platforms[i].code, platforms[i].size);
116*9a0e4156SSadaf Ebrahimi 			printf("Disasm:\n");
117*9a0e4156SSadaf Ebrahimi 
118*9a0e4156SSadaf Ebrahimi 			for (j = 0; j < count; j++) {
119*9a0e4156SSadaf Ebrahimi 				printf("0x%" PRIx64 ":\t%s\t%s\n", insn[j].address, insn[j].mnemonic, insn[j].op_str);
120*9a0e4156SSadaf Ebrahimi 				print_insn_detail(&insn[j]);
121*9a0e4156SSadaf Ebrahimi 			}
122*9a0e4156SSadaf Ebrahimi 			printf("0x%" PRIx64 ":\n", insn[j-1].address + insn[j-1].size);
123*9a0e4156SSadaf Ebrahimi 
124*9a0e4156SSadaf Ebrahimi 			// free memory allocated by cs_disasm()
125*9a0e4156SSadaf Ebrahimi 			cs_free(insn, count);
126*9a0e4156SSadaf Ebrahimi 		} else {
127*9a0e4156SSadaf Ebrahimi 			printf("****************\n");
128*9a0e4156SSadaf Ebrahimi 			printf("Platform: %s\n", platforms[i].comment);
129*9a0e4156SSadaf Ebrahimi 			print_string_hex("Code:", platforms[i].code, platforms[i].size);
130*9a0e4156SSadaf Ebrahimi 			printf("ERROR: Failed to disasm given code!\n");
131*9a0e4156SSadaf Ebrahimi 			abort();
132*9a0e4156SSadaf Ebrahimi 		}
133*9a0e4156SSadaf Ebrahimi 
134*9a0e4156SSadaf Ebrahimi 		printf("\n");
135*9a0e4156SSadaf Ebrahimi 
136*9a0e4156SSadaf Ebrahimi 		cs_close(&handle);
137*9a0e4156SSadaf Ebrahimi 	}
138*9a0e4156SSadaf Ebrahimi }
139*9a0e4156SSadaf Ebrahimi 
main()140*9a0e4156SSadaf Ebrahimi int main()
141*9a0e4156SSadaf Ebrahimi {
142*9a0e4156SSadaf Ebrahimi 	test();
143*9a0e4156SSadaf Ebrahimi 
144*9a0e4156SSadaf Ebrahimi 	return 0;
145*9a0e4156SSadaf Ebrahimi }
146