/src/capstonev5/arch/RISCV/RISCVMapping.c
Line  | Count  | Source  | 
1  |  |  | 
2  |  | #ifdef CAPSTONE_HAS_RISCV  | 
3  |  |  | 
4  |  | #include <stdio.h>    // debug  | 
5  |  | #include <string.h>  | 
6  |  |  | 
7  |  | #include "../../utils.h"  | 
8  |  |  | 
9  |  | #include "RISCVMapping.h"  | 
10  |  | #include "RISCVInstPrinter.h"  | 
11  |  |  | 
12  |  | #define GET_INSTRINFO_ENUM  | 
13  |  | #include "RISCVGenInstrInfo.inc"  | 
14  |  |  | 
15  |  | #ifndef CAPSTONE_DIET  | 
16  |  | static const name_map reg_name_maps[] = { | 
17  |  |   { RISCV_REG_INVALID, NULL }, | 
18  |  |  | 
19  |  |   { RISCV_REG_X0, "zero" }, | 
20  |  |   { RISCV_REG_X1, "ra" }, | 
21  |  |   { RISCV_REG_X2, "sp" }, | 
22  |  |   { RISCV_REG_X3, "gp" }, | 
23  |  |   { RISCV_REG_X4, "tp" }, | 
24  |  |   { RISCV_REG_X5, "t0" }, | 
25  |  |   { RISCV_REG_X6, "t1" }, | 
26  |  |   { RISCV_REG_X7, "t2" }, | 
27  |  |   { RISCV_REG_X8, "s0" }, | 
28  |  |   { RISCV_REG_X9, "s1" }, | 
29  |  |   { RISCV_REG_X10, "a0" }, | 
30  |  |   { RISCV_REG_X11, "a1" }, | 
31  |  |   { RISCV_REG_X12, "a2" }, | 
32  |  |   { RISCV_REG_X13, "a3" }, | 
33  |  |   { RISCV_REG_X14, "a4" }, | 
34  |  |   { RISCV_REG_X15, "a5" }, | 
35  |  |   { RISCV_REG_X16, "a6" }, | 
36  |  |   { RISCV_REG_X17, "a7" }, | 
37  |  |   { RISCV_REG_X18, "s2" }, | 
38  |  |   { RISCV_REG_X19, "s3" }, | 
39  |  |   { RISCV_REG_X20, "s4" }, | 
40  |  |   { RISCV_REG_X21, "s5" }, | 
41  |  |   { RISCV_REG_X22, "s6" }, | 
42  |  |   { RISCV_REG_X23, "s7" }, | 
43  |  |   { RISCV_REG_X24, "s8" }, | 
44  |  |   { RISCV_REG_X25, "s9" }, | 
45  |  |   { RISCV_REG_X26, "s10" }, | 
46  |  |   { RISCV_REG_X27, "s11" }, | 
47  |  |   { RISCV_REG_X28, "t3" }, | 
48  |  |   { RISCV_REG_X29, "t4" }, | 
49  |  |   { RISCV_REG_X30, "t5" }, | 
50  |  |   { RISCV_REG_X31, "t6" }, | 
51  |  |  | 
52  |  |   { RISCV_REG_F0_32, "ft0" }, | 
53  |  |   { RISCV_REG_F0_64, "ft0" }, | 
54  |  |   { RISCV_REG_F1_32, "ft1" }, | 
55  |  |   { RISCV_REG_F1_64, "ft1" }, | 
56  |  |   { RISCV_REG_F2_32, "ft2" }, | 
57  |  |   { RISCV_REG_F2_64, "ft2" }, | 
58  |  |   { RISCV_REG_F3_32, "ft3" }, | 
59  |  |   { RISCV_REG_F3_64, "ft3" }, | 
60  |  |   { RISCV_REG_F4_32, "ft4" }, | 
61  |  |   { RISCV_REG_F4_64, "ft4" }, | 
62  |  |   { RISCV_REG_F5_32, "ft5" }, | 
63  |  |   { RISCV_REG_F5_64, "ft5" }, | 
64  |  |   { RISCV_REG_F6_32, "ft6" }, | 
65  |  |   { RISCV_REG_F6_64, "ft6" }, | 
66  |  |   { RISCV_REG_F7_32, "ft7" }, | 
67  |  |   { RISCV_REG_F7_64, "ft7" }, | 
68  |  |   { RISCV_REG_F8_32, "fs0" }, | 
69  |  |   { RISCV_REG_F8_64, "fs0" }, | 
70  |  |   { RISCV_REG_F9_32, "fs1" }, | 
71  |  |   { RISCV_REG_F9_64, "fs1" }, | 
72  |  |   { RISCV_REG_F10_32, "fa0" }, | 
73  |  |   { RISCV_REG_F10_64, "fa0" }, | 
74  |  |   { RISCV_REG_F11_32, "fa1" }, | 
75  |  |   { RISCV_REG_F11_64, "fa1" }, | 
76  |  |   { RISCV_REG_F12_32, "fa2" }, | 
77  |  |   { RISCV_REG_F12_64, "fa2" }, | 
78  |  |   { RISCV_REG_F13_32, "fa3" }, | 
79  |  |   { RISCV_REG_F13_64, "fa3" }, | 
80  |  |   { RISCV_REG_F14_32, "fa4" }, | 
81  |  |   { RISCV_REG_F14_64, "fa4" }, | 
82  |  |   { RISCV_REG_F15_32, "fa5" }, | 
83  |  |   { RISCV_REG_F15_64, "fa5" }, | 
84  |  |   { RISCV_REG_F16_32, "fa6" }, | 
85  |  |   { RISCV_REG_F16_64, "fa6" }, | 
86  |  |   { RISCV_REG_F17_32, "fa7" }, | 
87  |  |   { RISCV_REG_F17_64, "fa7" }, | 
88  |  |   { RISCV_REG_F18_32, "fs2" }, | 
89  |  |   { RISCV_REG_F18_64, "fs2" }, | 
90  |  |   { RISCV_REG_F19_32, "fs3" }, | 
91  |  |   { RISCV_REG_F19_64, "fs3" }, | 
92  |  |   { RISCV_REG_F20_32, "fs4" }, | 
93  |  |   { RISCV_REG_F20_64, "fs4" }, | 
94  |  |   { RISCV_REG_F21_32, "fs5" }, | 
95  |  |   { RISCV_REG_F21_64, "fs5" }, | 
96  |  |   { RISCV_REG_F22_32, "fs6" }, | 
97  |  |   { RISCV_REG_F22_64, "fs6" }, | 
98  |  |   { RISCV_REG_F23_32, "fs7" }, | 
99  |  |   { RISCV_REG_F23_64, "fs7" }, | 
100  |  |   { RISCV_REG_F24_32, "fs8" }, | 
101  |  |   { RISCV_REG_F24_64, "fs8" }, | 
102  |  |   { RISCV_REG_F25_32, "fs9" }, | 
103  |  |   { RISCV_REG_F25_64, "fs9" }, | 
104  |  |   { RISCV_REG_F26_32, "fs10" }, | 
105  |  |   { RISCV_REG_F26_64, "fs10" }, | 
106  |  |   { RISCV_REG_F27_32, "fs11" }, | 
107  |  |   { RISCV_REG_F27_64, "fs11" }, | 
108  |  |   { RISCV_REG_F28_32, "ft8" }, | 
109  |  |   { RISCV_REG_F28_64, "ft8" }, | 
110  |  |   { RISCV_REG_F29_32, "ft9" }, | 
111  |  |   { RISCV_REG_F29_64, "ft9" }, | 
112  |  |   { RISCV_REG_F30_32, "ft10" }, | 
113  |  |   { RISCV_REG_F30_64, "ft10" }, | 
114  |  |   { RISCV_REG_F31_32, "ft11" }, | 
115  |  |   { RISCV_REG_F31_64, "ft11" }, | 
116  |  | };  | 
117  |  | #endif  | 
118  |  |  | 
119  |  | const char *RISCV_reg_name(csh handle, unsigned int reg)  | 
120  | 0  | { | 
121  | 0  | #ifndef CAPSTONE_DIET  | 
122  | 0  |   if (reg >= RISCV_REG_ENDING)  | 
123  | 0  |     return NULL;  | 
124  | 0  |   return reg_name_maps[reg].name;  | 
125  |  | #else  | 
126  |  |   return NULL;  | 
127  |  | #endif  | 
128  | 0  | }  | 
129  |  |  | 
130  |  | static const insn_map insns[] = { | 
131  |  |   // dummy item  | 
132  |  |   { | 
133  |  |    0, 0,  | 
134  |  | #ifndef CAPSTONE_DIET  | 
135  |  |    {0}, {0}, {0}, 0, 0 | 
136  |  | #endif  | 
137  |  |    },  | 
138  |  |  | 
139  |  | #include "RISCVMappingInsn.inc"  | 
140  |  | };  | 
141  |  |  | 
142  |  | // given internal insn id, return public instruction info  | 
143  |  | void RISCV_get_insn_id(cs_struct * h, cs_insn * insn, unsigned int id)   | 
144  | 146k  | { | 
145  | 146k  |     unsigned int i;  | 
146  |  |  | 
147  | 146k  |     i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);  | 
148  | 146k  |     if (i != 0) { | 
149  | 146k  |         insn->id = insns[i].mapid;  | 
150  |  |  | 
151  | 146k  |         if (h->detail) { | 
152  | 146k  | #ifndef CAPSTONE_DIET  | 
153  | 146k  |             memcpy(insn->detail->regs_read,  | 
154  | 146k  |             insns[i].regs_use, sizeof(insns[i].regs_use));  | 
155  | 146k  |             insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);  | 
156  |  |  | 
157  | 146k  |             memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));  | 
158  | 146k  |             insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);  | 
159  |  |  | 
160  | 146k  |           memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));  | 
161  | 146k  |             insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);  | 
162  |  |  | 
163  | 146k  |             if (insns[i].branch || insns[i].indirect_branch) { | 
164  |  |               // this insn also belongs to JUMP group. add JUMP group  | 
165  | 2.17k  |               insn->detail->groups[insn->detail->groups_count] = RISCV_GRP_JUMP;  | 
166  | 2.17k  |               insn->detail->groups_count++;  | 
167  | 2.17k  |             }  | 
168  | 146k  | #endif  | 
169  | 146k  |         }  | 
170  | 146k  |     }  | 
171  | 146k  | }  | 
172  |  |  | 
173  |  | static const name_map insn_name_maps[] = { | 
174  |  |     {RISCV_INS_INVALID, NULL}, | 
175  |  |  | 
176  |  | #include "RISCVGenInsnNameMaps.inc"  | 
177  |  | };  | 
178  |  |  | 
179  |  | const char *RISCV_insn_name(csh handle, unsigned int id)   | 
180  | 146k  | { | 
181  | 146k  | #ifndef CAPSTONE_DIET  | 
182  | 146k  |     if (id >= RISCV_INS_ENDING)  | 
183  | 0  |         return NULL;  | 
184  |  |  | 
185  | 146k  |     return insn_name_maps[id].name;  | 
186  |  | #else  | 
187  |  |     return NULL;  | 
188  |  | #endif  | 
189  | 146k  | }  | 
190  |  |  | 
191  |  | #ifndef CAPSTONE_DIET  | 
192  |  | static const name_map group_name_maps[] = { | 
193  |  |     // generic groups  | 
194  |  |     { RISCV_GRP_INVALID,    NULL }, | 
195  |  |     { RISCV_GRP_JUMP,       "jump" }, | 
196  |  |     { RISCV_GRP_CALL,       "call" }, | 
197  |  |     { RISCV_GRP_RET,        "ret" }, | 
198  |  |     { RISCV_GRP_INT,        "int" }, | 
199  |  |     { RISCV_GRP_IRET,       "iret" }, | 
200  |  |     { RISCV_GRP_PRIVILEGE,  "privileged" }, | 
201  |  |     { RISCV_GRP_BRANCH_RELATIVE, "branch_relative" }, | 
202  |  |     | 
203  |  |     // architecture specific  | 
204  |  |     { RISCV_GRP_ISRV32,     "isrv32" }, | 
205  |  |     { RISCV_GRP_ISRV64,     "isrv64" }, | 
206  |  |     { RISCV_GRP_HASSTDEXTA, "hasStdExtA" }, | 
207  |  |     { RISCV_GRP_HASSTDEXTC, "hasStdExtC" }, | 
208  |  |     { RISCV_GRP_HASSTDEXTD, "hasStdExtD" }, | 
209  |  |     { RISCV_GRP_HASSTDEXTF, "hasStdExtF" }, | 
210  |  |     { RISCV_GRP_HASSTDEXTM, "hasStdExtM" }, | 
211  |  |     | 
212  |  |     /*  | 
213  |  |     { RISCV_GRP_ISRVA,      "isrva" }, | 
214  |  |     { RISCV_GRP_ISRVC,      "isrvc" }, | 
215  |  |     { RISCV_GRP_ISRVD,      "isrvd" }, | 
216  |  |     { RISCV_GRP_ISRVCD,     "isrvcd" }, | 
217  |  |     { RISCV_GRP_ISRVF,      "isrvf" }, | 
218  |  |     { RISCV_GRP_ISRV32C,    "isrv32c" }, | 
219  |  |     { RISCV_GRP_ISRV32CF,   "isrv32cf" }, | 
220  |  |     { RISCV_GRP_ISRVM,      "isrvm" }, | 
221  |  |     { RISCV_GRP_ISRV64A,    "isrv64a" }, | 
222  |  |     { RISCV_GRP_ISRV64C,    "isrv64c" }, | 
223  |  |     { RISCV_GRP_ISRV64D,    "isrv64d" }, | 
224  |  |     { RISCV_GRP_ISRV64F,    "isrv64f" }, | 
225  |  |     { RISCV_GRP_ISRV64M,    "isrv64m" } | 
226  |  |     */  | 
227  |  |     { RISCV_GRP_ENDING,     NULL } | 
228  |  | };  | 
229  |  | #endif  | 
230  |  |  | 
231  |  | const char *RISCV_group_name(csh handle, unsigned int id)  | 
232  | 49.0k  | { | 
233  | 49.0k  | #ifndef CAPSTONE_DIET  | 
234  |  |   // verify group id  | 
235  | 49.0k  |   if (id >= RISCV_GRP_ENDING ||   | 
236  | 49.0k  |             (id > RISCV_GRP_BRANCH_RELATIVE && id < RISCV_GRP_ISRV32))  | 
237  | 0  |     return NULL;  | 
238  | 49.0k  |   return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);  | 
239  |  | #else  | 
240  |  |   return NULL;  | 
241  |  | #endif  | 
242  | 49.0k  | }  | 
243  |  |  | 
244  |  | // map instruction name to public instruction ID  | 
245  |  | riscv_reg RISCV_map_insn(const char *name)  | 
246  | 0  | { | 
247  |  |   // handle special alias first  | 
248  | 0  |   unsigned int i;  | 
249  |  |  | 
250  |  |   // NOTE: skip first NULL name in insn_name_maps  | 
251  | 0  |   i = name2id(&insn_name_maps[1], ARR_SIZE(insn_name_maps) - 1, name);  | 
252  |  | 
  | 
253  | 0  |   return (i != -1) ? i : RISCV_REG_INVALID;  | 
254  | 0  | }  | 
255  |  |  | 
256  |  | // map internal raw register to 'public' register  | 
257  |  | riscv_reg RISCV_map_register(unsigned int r)  | 
258  | 0  | { | 
259  | 0  |   static const unsigned int map[] = { 0, | 
260  | 0  |     RISCV_REG_X0,  | 
261  | 0  |     RISCV_REG_X1,  | 
262  | 0  |     RISCV_REG_X2,  | 
263  | 0  |     RISCV_REG_X3,  | 
264  | 0  |     RISCV_REG_X4,  | 
265  | 0  |     RISCV_REG_X5,  | 
266  | 0  |     RISCV_REG_X6,  | 
267  | 0  |     RISCV_REG_X7,  | 
268  | 0  |     RISCV_REG_X8,  | 
269  | 0  |     RISCV_REG_X9,  | 
270  | 0  |     RISCV_REG_X10,  | 
271  | 0  |     RISCV_REG_X11,  | 
272  | 0  |     RISCV_REG_X12,  | 
273  | 0  |     RISCV_REG_X13,  | 
274  | 0  |     RISCV_REG_X14,  | 
275  | 0  |     RISCV_REG_X15,  | 
276  | 0  |     RISCV_REG_X16,  | 
277  | 0  |     RISCV_REG_X17,  | 
278  | 0  |     RISCV_REG_X18,  | 
279  | 0  |     RISCV_REG_X19,  | 
280  | 0  |     RISCV_REG_X20,  | 
281  | 0  |     RISCV_REG_X21,  | 
282  | 0  |     RISCV_REG_X22,  | 
283  | 0  |     RISCV_REG_X23,  | 
284  | 0  |     RISCV_REG_X24,  | 
285  | 0  |     RISCV_REG_X25,  | 
286  | 0  |     RISCV_REG_X26,  | 
287  | 0  |     RISCV_REG_X27,  | 
288  | 0  |     RISCV_REG_X28,  | 
289  | 0  |     RISCV_REG_X29,  | 
290  | 0  |     RISCV_REG_X30,  | 
291  | 0  |     RISCV_REG_X31,  | 
292  |  | 
  | 
293  | 0  |     RISCV_REG_F0_32,  | 
294  | 0  |     RISCV_REG_F0_64,  | 
295  | 0  |     RISCV_REG_F1_32,  | 
296  | 0  |     RISCV_REG_F1_64,  | 
297  | 0  |     RISCV_REG_F2_32,  | 
298  | 0  |     RISCV_REG_F2_64,  | 
299  | 0  |     RISCV_REG_F3_32,  | 
300  | 0  |     RISCV_REG_F3_64,  | 
301  | 0  |     RISCV_REG_F4_32,  | 
302  | 0  |     RISCV_REG_F4_64,  | 
303  | 0  |     RISCV_REG_F5_32,  | 
304  | 0  |     RISCV_REG_F5_64,  | 
305  | 0  |     RISCV_REG_F6_32,  | 
306  | 0  |     RISCV_REG_F6_64,  | 
307  | 0  |     RISCV_REG_F7_32,  | 
308  | 0  |     RISCV_REG_F7_64,  | 
309  | 0  |     RISCV_REG_F8_32,  | 
310  | 0  |     RISCV_REG_F8_64,  | 
311  | 0  |     RISCV_REG_F9_32,  | 
312  | 0  |     RISCV_REG_F9_64,  | 
313  | 0  |     RISCV_REG_F10_32,  | 
314  | 0  |     RISCV_REG_F10_64,  | 
315  | 0  |     RISCV_REG_F11_32,  | 
316  | 0  |     RISCV_REG_F11_64,  | 
317  | 0  |     RISCV_REG_F12_32,  | 
318  | 0  |     RISCV_REG_F12_64,  | 
319  | 0  |     RISCV_REG_F13_32,  | 
320  | 0  |     RISCV_REG_F13_64,  | 
321  | 0  |     RISCV_REG_F14_32,  | 
322  | 0  |     RISCV_REG_F14_64,  | 
323  | 0  |     RISCV_REG_F15_32,  | 
324  | 0  |     RISCV_REG_F15_64,  | 
325  | 0  |     RISCV_REG_F16_32,  | 
326  | 0  |     RISCV_REG_F16_64,  | 
327  | 0  |     RISCV_REG_F17_32,  | 
328  | 0  |     RISCV_REG_F17_64,  | 
329  | 0  |     RISCV_REG_F18_32,  | 
330  | 0  |     RISCV_REG_F18_64,  | 
331  | 0  |     RISCV_REG_F19_32,  | 
332  | 0  |     RISCV_REG_F19_64,  | 
333  | 0  |     RISCV_REG_F20_32,  | 
334  | 0  |     RISCV_REG_F20_64,  | 
335  | 0  |     RISCV_REG_F21_32,  | 
336  | 0  |     RISCV_REG_F21_64,  | 
337  | 0  |     RISCV_REG_F22_32,  | 
338  | 0  |     RISCV_REG_F22_64,  | 
339  | 0  |     RISCV_REG_F23_32,  | 
340  | 0  |     RISCV_REG_F23_64,  | 
341  | 0  |     RISCV_REG_F24_32,  | 
342  | 0  |     RISCV_REG_F24_64,  | 
343  | 0  |     RISCV_REG_F25_32,  | 
344  | 0  |     RISCV_REG_F25_64,  | 
345  | 0  |     RISCV_REG_F26_32,  | 
346  | 0  |     RISCV_REG_F26_64,  | 
347  | 0  |     RISCV_REG_F27_32,  | 
348  | 0  |     RISCV_REG_F27_64,  | 
349  | 0  |     RISCV_REG_F28_32,  | 
350  | 0  |     RISCV_REG_F28_64,  | 
351  | 0  |     RISCV_REG_F29_32,  | 
352  | 0  |     RISCV_REG_F29_64,  | 
353  | 0  |     RISCV_REG_F30_32,  | 
354  | 0  |     RISCV_REG_F30_64,  | 
355  | 0  |     RISCV_REG_F31_32,  | 
356  | 0  |     RISCV_REG_F31_64,  | 
357  | 0  |   };  | 
358  |  | 
  | 
359  | 0  |   if (r < ARR_SIZE(map))  | 
360  | 0  |     return map[r];  | 
361  |  |  | 
362  |  |   // cannot find this register  | 
363  | 0  |   return 0;  | 
364  | 0  | }  | 
365  |  |  | 
366  |  | #endif  |