Coverage Report

Created: 2023-12-08 06:05

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