1 /* radare - LGPL3 - Copyright 2018 - deroad */
2 
3 #include <r_anal.h>
4 #include <r_types.h>
5 #include <r_lib.h>
6 #include "../../asm/arch/mcore/mcore.h"
7 
mcore_anal(RAnal * anal,RAnalOp * op,ut64 addr,const ut8 * buf,int len,RAnalOpMask mask)8 static int mcore_anal(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *buf, int len, RAnalOpMask mask) {
9 	mcore_handle handle = {0};
10 	mcore_t* instr = NULL;
11 
12 	if (mcore_init (&handle, buf, len)) {
13 		eprintf ("[!] mcore: bad or invalid data.\n");
14 		return -1;
15 	}
16 
17 	op->size = 2;
18 	if ((instr = mcore_next (&handle))) {
19 		op->type = instr->type;
20 		switch (instr->type) {
21 		case R_ANAL_OP_TYPE_CALL:
22 		case R_ANAL_OP_TYPE_CJMP:
23 			op->fail = addr + 2;
24 			op->jump = addr + instr->args[0].value + 1;
25 			break;
26 		case R_ANAL_OP_TYPE_JMP:
27 			op->jump = addr + instr->args[0].value + 1;
28 			break;
29 		case R_ANAL_OP_TYPE_ICALL:
30 			// the loading address depends on the word
31 			// that this pointer points to.
32 			// op->jump = addr + ((instr->args[i].value << 2) & 0xfffffffc);
33 			break;
34 		case R_ANAL_OP_TYPE_RET:
35 		case R_ANAL_OP_TYPE_ILL:
36 			op->eob = true;
37 			break;
38 		default:
39 			break;
40 		}
41 		mcore_free (instr);
42 	}
43 	return op->size;
44 }
45 
set_reg_profile(RAnal * anal)46 static bool set_reg_profile(RAnal *anal) {
47 	const char *p = \
48 		"=PC	pc\n"
49 		"=SP	r1\n"
50 		"=SR	sr\n"
51 		"=A0	r3\n"
52 		"=A1	r4\n"
53 		"=A2	r5\n"
54 		"=A3	r6\n"
55 		"=A4	r7\n"
56 		"=A5	r8\n"
57 		"=A6	r6\n"
58 		"gpr	r0	.32 0   0\n"
59 		"gpr	r1	.32 4   0\n"
60 		"gpr	r2	.32 8   0\n"
61 		"gpr	r3	.32 12  0\n"
62 		"gpr	r4	.32 16  0\n"
63 		"gpr	r5	.32 20  0\n"
64 		"gpr	r6	.32 24  0\n"
65 		"gpr	r7	.32 28  0\n"
66 		"gpr	r8	.32 32  0\n"
67 		"gpr	r9	.32 36  0\n"
68 		"gpr	r10   .32 40  0\n"
69 		"gpr	r11   .32 44  0\n"
70 		"gpr	r12   .32 48  0\n"
71 		"gpr	r13   .32 52  0\n"
72 		"gpr	r14   .32 56  0\n"
73 		"gpr	r15   .32 60  0\n"
74 
75 		"gpr	psr   .32 64  0\n"
76 		"gpr	vbr   .32 68  0\n"
77 		"gpr	epsr  .32 72  0\n"
78 		"gpr	fpsr  .32 76  0\n"
79 		"gpr	epc   .32 80  0\n"
80 		"gpr	fpc   .32 84  0\n"
81 		"gpr	ss0   .32 88  0\n"
82 		"gpr	ss1   .32 92  0\n"
83 		"gpr	ss2   .32 96  0\n"
84 		"gpr	ss3   .32 100 0\n"
85 		"gpr	ss4   .32 104 0\n"
86 		"gpr	gcr   .32 108 0\n"
87 		"gpr	gsr   .32 112 0\n"
88 		"gpr	cpidr .32 116 0\n"
89 		"gpr	dcsr  .32 120 0\n"
90 		"gpr	cwr   .32 124 0\n"
91 		"gpr	cr16  .32 128 0\n"
92 		"gpr	cfr   .32 132 0\n"
93 		"gpr	ccr   .32 136 0\n"
94 		"gpr	capr  .32 140 0\n"
95 		"gpr	pacr  .32 144 0\n"
96 		"gpr	prsr  .32 148 0\n"
97 
98 		"gpr	cr22  .32 152 0\n"
99 		"gpr	cr23  .32 156 0\n"
100 		"gpr	cr24  .32 160 0\n"
101 		"gpr	cr25  .32 164 0\n"
102 		"gpr	cr26  .32 168 0\n"
103 		"gpr	cr27  .32 172 0\n"
104 		"gpr	cr28  .32 176 0\n"
105 		"gpr	cr29  .32 180 0\n"
106 		"gpr	cr30  .32 184 0\n"
107 		"gpr	cr31  .32 188 0\n"
108 		"gpr	pc	.32 192 0\n";
109 	return r_reg_set_profile_string (anal->reg, p);
110 }
111 
archinfo(RAnal * anal,int q)112 static int archinfo(RAnal *anal, int q) {
113 	return 2;
114 }
115 
116 RAnalPlugin r_anal_plugin_mcore = {
117 	.name = "mcore",
118 	.desc = "MCore analysis plugin",
119 	.arch = "mcore",
120 	.license = "LGPL3",
121 	.bits = 32,
122 	.op = &mcore_anal,
123 	.archinfo = archinfo,
124 	.set_reg_profile = &set_reg_profile,
125 };
126 
127 #ifndef R2_PLUGIN_INCORE
128 R_API RLibStruct radare_plugin = {
129 	.type = R_LIB_TYPE_ANAL,
130 	.data = &r_anal_plugin_mcore,
131 	.version = R2_VERSION
132 };
133 #endif
134