Coverage Report

Created: 2024-08-21 06:24

/src/capstonev5/arch/RISCV/RISCVMapping.c
Line
Count
Source (jump to first uncovered line)
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
95.2k
{
145
95.2k
    unsigned int i;
146
147
95.2k
    i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
148
95.2k
    if (i != 0) {
149
95.2k
        insn->id = insns[i].mapid;
150
151
95.2k
        if (h->detail) {
152
95.2k
#ifndef CAPSTONE_DIET
153
95.2k
            memcpy(insn->detail->regs_read,
154
95.2k
            insns[i].regs_use, sizeof(insns[i].regs_use));
155
95.2k
            insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);
156
157
95.2k
            memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
158
95.2k
            insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);
159
160
95.2k
          memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));
161
95.2k
            insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);
162
163
95.2k
            if (insns[i].branch || insns[i].indirect_branch) {
164
              // this insn also belongs to JUMP group. add JUMP group
165
2.64k
              insn->detail->groups[insn->detail->groups_count] = RISCV_GRP_JUMP;
166
2.64k
              insn->detail->groups_count++;
167
2.64k
            }
168
95.2k
#endif
169
95.2k
        }
170
95.2k
    }
171
95.2k
}
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
95.2k
{
181
95.2k
#ifndef CAPSTONE_DIET
182
95.2k
    if (id >= RISCV_INS_ENDING)
183
0
        return NULL;
184
185
95.2k
    return insn_name_maps[id].name;
186
#else
187
    return NULL;
188
#endif
189
95.2k
}
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
42.2k
{
233
42.2k
#ifndef CAPSTONE_DIET
234
  // verify group id
235
42.2k
  if (id >= RISCV_GRP_ENDING || 
236
42.2k
            (id > RISCV_GRP_BRANCH_RELATIVE && id < RISCV_GRP_ISRV32))
237
0
    return NULL;
238
42.2k
  return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
239
#else
240
  return NULL;
241
#endif
242
42.2k
}
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