Coverage Report

Created: 2024-08-21 06:24

/src/capstonev5/arch/EVM/EVMMapping.c
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh, 2018 */
3
4
#ifdef CAPSTONE_HAS_EVM
5
6
#include <string.h>
7
8
#include "../../cs_priv.h"
9
#include "../../utils.h"
10
11
#include "EVMMapping.h"
12
13
#ifndef CAPSTONE_DIET
14
static const cs_evm insns[256] = {
15
#include "EVMMappingInsn.inc"
16
};
17
#endif
18
19
// look for @id in @insns, given its size in @max.
20
// return -1 if not found
21
static int evm_insn_find(const cs_evm *insns, unsigned int max, unsigned int id)
22
42.2k
{
23
42.2k
  if (id >= max)
24
0
    return -1;
25
26
42.2k
  if (insns[id].fee == 0xffffffff)
27
    // unused opcode
28
0
    return -1;
29
30
42.2k
  return (int)id;
31
42.2k
}
32
33
// fill in details
34
void EVM_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
35
42.2k
{
36
42.2k
  insn->id = id;
37
42.2k
#ifndef CAPSTONE_DIET
38
42.2k
  if (evm_insn_find(insns, ARR_SIZE(insns), id) > 0) {
39
38.1k
    if (h->detail) {
40
38.1k
      memcpy(&insn->detail->evm, &insns[id], sizeof(insns[id]));
41
38.1k
    }
42
38.1k
  }
43
42.2k
#endif
44
42.2k
}
45
46
#ifndef CAPSTONE_DIET
47
static const name_map insn_name_maps[256] = {
48
  { EVM_INS_STOP, "stop" },
49
  { EVM_INS_ADD, "add" },
50
  { EVM_INS_MUL, "mul" },
51
  { EVM_INS_SUB, "sub" },
52
  { EVM_INS_DIV, "div" },
53
  { EVM_INS_SDIV, "sdiv" },
54
  { EVM_INS_MOD, "mod" },
55
  { EVM_INS_SMOD, "smod" },
56
  { EVM_INS_ADDMOD, "addmod" },
57
  { EVM_INS_MULMOD, "mulmod" },
58
  { EVM_INS_EXP, "exp" },
59
  { EVM_INS_SIGNEXTEND, "signextend" },
60
  { EVM_INS_INVALID, NULL },
61
  { EVM_INS_INVALID, NULL },
62
  { EVM_INS_INVALID, NULL },
63
  { EVM_INS_INVALID, NULL },
64
  { EVM_INS_LT, "lt" },
65
  { EVM_INS_GT, "gt" },
66
  { EVM_INS_SLT, "slt" },
67
  { EVM_INS_SGT, "sgt" },
68
  { EVM_INS_EQ, "eq" },
69
  { EVM_INS_ISZERO, "iszero" },
70
  { EVM_INS_AND, "and" },
71
  { EVM_INS_OR, "or" },
72
  { EVM_INS_XOR, "xor" },
73
  { EVM_INS_NOT, "not" },
74
  { EVM_INS_BYTE, "byte" },
75
  { EVM_INS_INVALID, NULL },
76
  { EVM_INS_INVALID, NULL },
77
  { EVM_INS_INVALID, NULL },
78
  { EVM_INS_INVALID, NULL },
79
  { EVM_INS_INVALID, NULL },
80
  { EVM_INS_SHA3, "sha3" },
81
  { EVM_INS_INVALID, NULL },
82
  { EVM_INS_INVALID, NULL },
83
  { EVM_INS_INVALID, NULL },
84
  { EVM_INS_INVALID, NULL },
85
  { EVM_INS_INVALID, NULL },
86
  { EVM_INS_INVALID, NULL },
87
  { EVM_INS_INVALID, NULL },
88
  { EVM_INS_INVALID, NULL },
89
  { EVM_INS_INVALID, NULL },
90
  { EVM_INS_INVALID, NULL },
91
  { EVM_INS_INVALID, NULL },
92
  { EVM_INS_INVALID, NULL },
93
  { EVM_INS_INVALID, NULL },
94
  { EVM_INS_INVALID, NULL },
95
  { EVM_INS_INVALID, NULL },
96
  { EVM_INS_ADDRESS, "address" },
97
  { EVM_INS_BALANCE, "balance" },
98
  { EVM_INS_ORIGIN, "origin" },
99
  { EVM_INS_CALLER, "caller" },
100
  { EVM_INS_CALLVALUE, "callvalue" },
101
  { EVM_INS_CALLDATALOAD, "calldataload" },
102
  { EVM_INS_CALLDATASIZE, "calldatasize" },
103
  { EVM_INS_CALLDATACOPY, "calldatacopy" },
104
  { EVM_INS_CODESIZE, "codesize" },
105
  { EVM_INS_CODECOPY, "codecopy" },
106
  { EVM_INS_GASPRICE, "gasprice" },
107
  { EVM_INS_EXTCODESIZE, "extcodesize" },
108
  { EVM_INS_EXTCODECOPY, "extcodecopy" },
109
  { EVM_INS_RETURNDATASIZE, "returndatasize" },
110
  { EVM_INS_RETURNDATACOPY, "returndatacopy" },
111
  { EVM_INS_INVALID, NULL },
112
  { EVM_INS_BLOCKHASH, "blockhash" },
113
  { EVM_INS_COINBASE, "coinbase" },
114
  { EVM_INS_TIMESTAMP, "timestamp" },
115
  { EVM_INS_NUMBER, "number" },
116
  { EVM_INS_DIFFICULTY, "difficulty" },
117
  { EVM_INS_GASLIMIT, "gaslimit" },
118
  { EVM_INS_INVALID, NULL },
119
  { EVM_INS_INVALID, NULL },
120
  { EVM_INS_INVALID, NULL },
121
  { EVM_INS_INVALID, NULL },
122
  { EVM_INS_INVALID, NULL },
123
  { EVM_INS_INVALID, NULL },
124
  { EVM_INS_INVALID, NULL },
125
  { EVM_INS_INVALID, NULL },
126
  { EVM_INS_INVALID, NULL },
127
  { EVM_INS_INVALID, NULL },
128
  { EVM_INS_POP, "pop" },
129
  { EVM_INS_MLOAD, "mload" },
130
  { EVM_INS_MSTORE, "mstore" },
131
  { EVM_INS_MSTORE8, "mstore8" },
132
  { EVM_INS_SLOAD, "sload" },
133
  { EVM_INS_SSTORE, "sstore" },
134
  { EVM_INS_JUMP, "jump" },
135
  { EVM_INS_JUMPI, "jumpi" },
136
  { EVM_INS_PC, "pc" },
137
  { EVM_INS_MSIZE, "msize" },
138
  { EVM_INS_GAS, "gas" },
139
  { EVM_INS_JUMPDEST, "jumpdest" },
140
  { EVM_INS_INVALID, NULL },
141
  { EVM_INS_INVALID, NULL },
142
  { EVM_INS_INVALID, NULL },
143
  { EVM_INS_INVALID, NULL },
144
  { EVM_INS_PUSH1, "push1" },
145
  { EVM_INS_PUSH2, "push2" },
146
  { EVM_INS_PUSH3, "push3" },
147
  { EVM_INS_PUSH4, "push4" },
148
  { EVM_INS_PUSH5, "push5" },
149
  { EVM_INS_PUSH6, "push6" },
150
  { EVM_INS_PUSH7, "push7" },
151
  { EVM_INS_PUSH8, "push8" },
152
  { EVM_INS_PUSH9, "push9" },
153
  { EVM_INS_PUSH10, "push10" },
154
  { EVM_INS_PUSH11, "push11" },
155
  { EVM_INS_PUSH12, "push12" },
156
  { EVM_INS_PUSH13, "push13" },
157
  { EVM_INS_PUSH14, "push14" },
158
  { EVM_INS_PUSH15, "push15" },
159
  { EVM_INS_PUSH16, "push16" },
160
  { EVM_INS_PUSH17, "push17" },
161
  { EVM_INS_PUSH18, "push18" },
162
  { EVM_INS_PUSH19, "push19" },
163
  { EVM_INS_PUSH20, "push20" },
164
  { EVM_INS_PUSH21, "push21" },
165
  { EVM_INS_PUSH22, "push22" },
166
  { EVM_INS_PUSH23, "push23" },
167
  { EVM_INS_PUSH24, "push24" },
168
  { EVM_INS_PUSH25, "push25" },
169
  { EVM_INS_PUSH26, "push26" },
170
  { EVM_INS_PUSH27, "push27" },
171
  { EVM_INS_PUSH28, "push28" },
172
  { EVM_INS_PUSH29, "push29" },
173
  { EVM_INS_PUSH30, "push30" },
174
  { EVM_INS_PUSH31, "push31" },
175
  { EVM_INS_PUSH32, "push32" },
176
  { EVM_INS_DUP1, "dup1" },
177
  { EVM_INS_DUP2, "dup2" },
178
  { EVM_INS_DUP3, "dup3" },
179
  { EVM_INS_DUP4, "dup4" },
180
  { EVM_INS_DUP5, "dup5" },
181
  { EVM_INS_DUP6, "dup6" },
182
  { EVM_INS_DUP7, "dup7" },
183
  { EVM_INS_DUP8, "dup8" },
184
  { EVM_INS_DUP9, "dup9" },
185
  { EVM_INS_DUP10, "dup10" },
186
  { EVM_INS_DUP11, "dup11" },
187
  { EVM_INS_DUP12, "dup12" },
188
  { EVM_INS_DUP13, "dup13" },
189
  { EVM_INS_DUP14, "dup14" },
190
  { EVM_INS_DUP15, "dup15" },
191
  { EVM_INS_DUP16, "dup16" },
192
  { EVM_INS_SWAP1, "swap1" },
193
  { EVM_INS_SWAP2, "swap2" },
194
  { EVM_INS_SWAP3, "swap3" },
195
  { EVM_INS_SWAP4, "swap4" },
196
  { EVM_INS_SWAP5, "swap5" },
197
  { EVM_INS_SWAP6, "swap6" },
198
  { EVM_INS_SWAP7, "swap7" },
199
  { EVM_INS_SWAP8, "swap8" },
200
  { EVM_INS_SWAP9, "swap9" },
201
  { EVM_INS_SWAP10, "swap10" },
202
  { EVM_INS_SWAP11, "swap11" },
203
  { EVM_INS_SWAP12, "swap12" },
204
  { EVM_INS_SWAP13, "swap13" },
205
  { EVM_INS_SWAP14, "swap14" },
206
  { EVM_INS_SWAP15, "swap15" },
207
  { EVM_INS_SWAP16, "swap16" },
208
  { EVM_INS_LOG0, "log0" },
209
  { EVM_INS_LOG1, "log1" },
210
  { EVM_INS_LOG2, "log2" },
211
  { EVM_INS_LOG3, "log3" },
212
  { EVM_INS_LOG4, "log4" },
213
  { EVM_INS_INVALID, NULL },
214
  { EVM_INS_INVALID, NULL },
215
  { EVM_INS_INVALID, NULL },
216
  { EVM_INS_INVALID, NULL },
217
  { EVM_INS_INVALID, NULL },
218
  { EVM_INS_INVALID, NULL },
219
  { EVM_INS_INVALID, NULL },
220
  { EVM_INS_INVALID, NULL },
221
  { EVM_INS_INVALID, NULL },
222
  { EVM_INS_INVALID, NULL },
223
  { EVM_INS_INVALID, NULL },
224
  { EVM_INS_INVALID, NULL },
225
  { EVM_INS_INVALID, NULL },
226
  { EVM_INS_INVALID, NULL },
227
  { EVM_INS_INVALID, NULL },
228
  { EVM_INS_INVALID, NULL },
229
  { EVM_INS_INVALID, NULL },
230
  { EVM_INS_INVALID, NULL },
231
  { EVM_INS_INVALID, NULL },
232
  { EVM_INS_INVALID, NULL },
233
  { EVM_INS_INVALID, NULL },
234
  { EVM_INS_INVALID, NULL },
235
  { EVM_INS_INVALID, NULL },
236
  { EVM_INS_INVALID, NULL },
237
  { EVM_INS_INVALID, NULL },
238
  { EVM_INS_INVALID, NULL },
239
  { EVM_INS_INVALID, NULL },
240
  { EVM_INS_INVALID, NULL },
241
  { EVM_INS_INVALID, NULL },
242
  { EVM_INS_INVALID, NULL },
243
  { EVM_INS_INVALID, NULL },
244
  { EVM_INS_INVALID, NULL },
245
  { EVM_INS_INVALID, NULL },
246
  { EVM_INS_INVALID, NULL },
247
  { EVM_INS_INVALID, NULL },
248
  { EVM_INS_INVALID, NULL },
249
  { EVM_INS_INVALID, NULL },
250
  { EVM_INS_INVALID, NULL },
251
  { EVM_INS_INVALID, NULL },
252
  { EVM_INS_INVALID, NULL },
253
  { EVM_INS_INVALID, NULL },
254
  { EVM_INS_INVALID, NULL },
255
  { EVM_INS_INVALID, NULL },
256
  { EVM_INS_INVALID, NULL },
257
  { EVM_INS_INVALID, NULL },
258
  { EVM_INS_INVALID, NULL },
259
  { EVM_INS_INVALID, NULL },
260
  { EVM_INS_INVALID, NULL },
261
  { EVM_INS_INVALID, NULL },
262
  { EVM_INS_INVALID, NULL },
263
  { EVM_INS_INVALID, NULL },
264
  { EVM_INS_INVALID, NULL },
265
  { EVM_INS_INVALID, NULL },
266
  { EVM_INS_INVALID, NULL },
267
  { EVM_INS_INVALID, NULL },
268
  { EVM_INS_INVALID, NULL },
269
  { EVM_INS_INVALID, NULL },
270
  { EVM_INS_INVALID, NULL },
271
  { EVM_INS_INVALID, NULL },
272
  { EVM_INS_INVALID, NULL },
273
  { EVM_INS_INVALID, NULL },
274
  { EVM_INS_INVALID, NULL },
275
  { EVM_INS_INVALID, NULL },
276
  { EVM_INS_INVALID, NULL },
277
  { EVM_INS_INVALID, NULL },
278
  { EVM_INS_INVALID, NULL },
279
  { EVM_INS_INVALID, NULL },
280
  { EVM_INS_INVALID, NULL },
281
  { EVM_INS_INVALID, NULL },
282
  { EVM_INS_INVALID, NULL },
283
  { EVM_INS_INVALID, NULL },
284
  { EVM_INS_INVALID, NULL },
285
  { EVM_INS_INVALID, NULL },
286
  { EVM_INS_INVALID, NULL },
287
  { EVM_INS_INVALID, NULL },
288
  { EVM_INS_CREATE, "create" },
289
  { EVM_INS_CALL, "call" },
290
  { EVM_INS_CALLCODE, "callcode" },
291
  { EVM_INS_RETURN, "return" },
292
  { EVM_INS_DELEGATECALL, "delegatecall" },
293
  { EVM_INS_CALLBLACKBOX, "callblackbox" },
294
  { EVM_INS_INVALID, NULL },
295
  { EVM_INS_INVALID, NULL },
296
  { EVM_INS_INVALID, NULL },
297
  { EVM_INS_INVALID, NULL },
298
  { EVM_INS_STATICCALL, "staticcall" },
299
  { EVM_INS_INVALID, NULL },
300
  { EVM_INS_INVALID, NULL },
301
  { EVM_INS_REVERT, "revert" },
302
  { EVM_INS_INVALID, NULL },
303
  { EVM_INS_SUICIDE, "suicide" },
304
};
305
#endif
306
307
const char *EVM_insn_name(csh handle, unsigned int id)
308
42.2k
{
309
42.2k
#ifndef CAPSTONE_DIET
310
42.2k
  if (id >= ARR_SIZE(insn_name_maps))
311
0
    return NULL;
312
42.2k
  else
313
42.2k
    return insn_name_maps[id].name;
314
#else
315
  return NULL;
316
#endif
317
42.2k
}
318
319
#ifndef CAPSTONE_DIET
320
static const name_map group_name_maps[] = {
321
  // generic groups
322
  { EVM_GRP_INVALID, NULL },
323
  { EVM_GRP_JUMP, "jump" },
324
  // special groups
325
  { EVM_GRP_MATH, "math" },
326
  { EVM_GRP_STACK_WRITE, "stack_write" },
327
  { EVM_GRP_STACK_READ, "stack_read" },
328
  { EVM_GRP_MEM_WRITE, "mem_write" },
329
  { EVM_GRP_MEM_READ, "mem_read" },
330
  { EVM_GRP_STORE_WRITE, "store_write" },
331
  { EVM_GRP_STORE_READ, "store_read" },
332
  { EVM_GRP_HALT, "halt" },
333
};
334
#endif
335
336
const char *EVM_group_name(csh handle, unsigned int id)
337
46.9k
{
338
46.9k
#ifndef CAPSTONE_DIET
339
46.9k
  return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
340
#else
341
  return NULL;
342
#endif
343
46.9k
}
344
#endif