Seregon/Hermes

Hermes/Dyforge is a program written in c++ allows you to inject a dll that can analyze all processes in a program, can be used for mod and reverse engeneering

C/3.8 KB/No license
DyMain/include/capstone/riscv.h
Hermes / DyMain / include / capstone / riscv.h
1#ifndef CAPSTONE_RISCV_H
2#define CAPSTONE_RISCV_H
3 
4/* Capstone Disassembly Engine */
5/* RISC-V Backend By Rodrigo Cortes Porto <porto703@gmail.com> &
6 Shawn Chang <citypw@gmail.com>, HardenedLinux@2018 */
7 
8#ifdef __cplusplus
9extern "C" {
10#endif
11 
12#if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
13#include <stdint.h>
14#endif
15 
16#include "platform.h"
17#include "cs_operand.h"
18 
19// GCC MIPS toolchain has a default macro called "mips" which breaks
20// compilation
21//#undef riscv
22 
23#ifdef _MSC_VER
24#pragma warning(disable:4201)
25#endif
26 
27//> Operand type for instruction's operands
28typedef enum riscv_op_type {
29 RISCV_OP_INVALID = CS_OP_INVALID, // = CS_OP_INVALID (Uninitialized).
30 RISCV_OP_REG = CS_OP_REG, // = CS_OP_REG (Register operand).
31 RISCV_OP_IMM = CS_OP_IMM, // = CS_OP_IMM (Immediate operand).
32 RISCV_OP_MEM = CS_OP_MEM, // = CS_OP_MEM (Memory operand).
33} riscv_op_type;
34 
35// Instruction's operand referring to memory
36// This is associated with RISCV_OP_MEM operand type above
37typedef struct riscv_op_mem {
38 unsigned int base; // base register
39 int64_t disp; // displacement/offset value
40} riscv_op_mem;
41 
42// Instruction operand
43typedef struct cs_riscv_op {
44 riscv_op_type type; // operand type
45 union {
46 unsigned int reg; // register value for REG operand
47 int64_t imm; // immediate value for IMM operand
48 riscv_op_mem mem; // base/disp value for MEM operand
49 };
50 uint8_t access; ///< How is this operand accessed? (READ, WRITE or READ|WRITE)
51} cs_riscv_op;
52 
53#define NUM_RISCV_OPS 8
54 
55// Instruction structure
56typedef struct cs_riscv {
57 // Does this instruction need effective address or not.
58 bool need_effective_addr;
59 // Number of operands of this instruction,
60 // or 0 when instruction has no operand.
61 uint8_t op_count;
62 cs_riscv_op operands[NUM_RISCV_OPS]; // operands for this instruction.
63} cs_riscv;
64 
65//> RISCV registers
66typedef enum riscv_reg {
67 RISCV_REG_INVALID = 0,
68 //> General purpose registers
69 RISCV_REG_X0, // "zero"
70 RISCV_REG_ZERO = RISCV_REG_X0, // "zero"
71 RISCV_REG_X1, // "ra"
72 RISCV_REG_RA = RISCV_REG_X1, // "ra"
73 RISCV_REG_X2, // "sp"
74 RISCV_REG_SP = RISCV_REG_X2, // "sp"
75 RISCV_REG_X3, // "gp"
76 RISCV_REG_GP = RISCV_REG_X3, // "gp"
77 RISCV_REG_X4, // "tp"
78 RISCV_REG_TP = RISCV_REG_X4, // "tp"
79 RISCV_REG_X5, // "t0"
80 RISCV_REG_T0 = RISCV_REG_X5, // "t0"
81 RISCV_REG_X6, // "t1"
82 RISCV_REG_T1 = RISCV_REG_X6, // "t1"
83 RISCV_REG_X7, // "t2"
84 RISCV_REG_T2 = RISCV_REG_X7, // "t2"
85 RISCV_REG_X8, // "s0/fp"
86 RISCV_REG_S0 = RISCV_REG_X8, // "s0"
87 RISCV_REG_FP = RISCV_REG_X8, // "fp"
88 RISCV_REG_X9, // "s1"
89 RISCV_REG_S1 = RISCV_REG_X9, // "s1"
90 RISCV_REG_X10, // "a0"
91 RISCV_REG_A0 = RISCV_REG_X10, // "a0"
92 RISCV_REG_X11, // "a1"
93 RISCV_REG_A1 = RISCV_REG_X11, // "a1"
94 RISCV_REG_X12, // "a2"
95 RISCV_REG_A2 = RISCV_REG_X12, // "a2"
96 RISCV_REG_X13, // "a3"
97 RISCV_REG_A3 = RISCV_REG_X13, // "a3"
98 RISCV_REG_X14, // "a4"
99 RISCV_REG_A4 = RISCV_REG_X14, // "a4"
100 RISCV_REG_X15, // "a5"
101 RISCV_REG_A5 = RISCV_REG_X15, // "a5"
102 RISCV_REG_X16, // "a6"
103 RISCV_REG_A6 = RISCV_REG_X16, // "a6"
104 RISCV_REG_X17, // "a7"
105 RISCV_REG_A7 = RISCV_REG_X17, // "a7"
106 RISCV_REG_X18, // "s2"
107 RISCV_REG_S2 = RISCV_REG_X18, // "s2"
108 RISCV_REG_X19, // "s3"
109 RISCV_REG_S3 = RISCV_REG_X19, // "s3"
110 RISCV_REG_X20, // "s4"
111 RISCV_REG_S4 = RISCV_REG_X20, // "s4"
112 RISCV_REG_X21, // "s5"
113 RISCV_REG_S5 = RISCV_REG_X21, // "s5"
114 RISCV_REG_X22, // "s6"
115 RISCV_REG_S6 = RISCV_REG_X22, // "s6"
116 RISCV_REG_X23, // "s7"
117 RISCV_REG_S7 = RISCV_REG_X23, // "s7"
118 RISCV_REG_X24, // "s8"
119 RISCV_REG_S8 = RISCV_REG_X24, // "s8"
120 RISCV_REG_X25, // "s9"
121 RISCV_REG_S9 = RISCV_REG_X25, // "s9"
122 RISCV_REG_X26, // "s10"
123 RISCV_REG_S10 = RISCV_REG_X26, // "s10"
124 RISCV_REG_X27, // "s11"
125 RISCV_REG_S11 = RISCV_REG_X27, // "s11"
126 RISCV_REG_X28, // "t3"
127 RISCV_REG_T3 = RISCV_REG_X28, // "t3"
128 RISCV_REG_X29, // "t4"
129 RISCV_REG_T4 = RISCV_REG_X29, // "t4"
130 RISCV_REG_X30, // "t5"
131 RISCV_REG_T5 = RISCV_REG_X30, // "t5"
132 RISCV_REG_X31, // "t6"
133 RISCV_REG_T6 = RISCV_REG_X31, // "t6"
134 
135 //> Floating-point registers
136 RISCV_REG_F0_32, // "ft0"
137 RISCV_REG_F0_64, // "ft0"
138 RISCV_REG_F1_32, // "ft1"
139 RISCV_REG_F1_64, // "ft1"
140 RISCV_REG_F2_32, // "ft2"
141 RISCV_REG_F2_64, // "ft2"
142 RISCV_REG_F3_32, // "ft3"
143 RISCV_REG_F3_64, // "ft3"
144 RISCV_REG_F4_32, // "ft4"
145 RISCV_REG_F4_64, // "ft4"
146 RISCV_REG_F5_32, // "ft5"
147 RISCV_REG_F5_64, // "ft5"
148 RISCV_REG_F6_32, // "ft6"
149 RISCV_REG_F6_64, // "ft6"
150 RISCV_REG_F7_32, // "ft7"
151 RISCV_REG_F7_64, // "ft7"
152 RISCV_REG_F8_32, // "fs0"
153 RISCV_REG_F8_64, // "fs0"
154 RISCV_REG_F9_32, // "fs1"
155 RISCV_REG_F9_64, // "fs1"
156 RISCV_REG_F10_32, // "fa0"
157 RISCV_REG_F10_64, // "fa0"
158 RISCV_REG_F11_32, // "fa1"
159 RISCV_REG_F11_64, // "fa1"
160 RISCV_REG_F12_32, // "fa2"
161 RISCV_REG_F12_64, // "fa2"
162 RISCV_REG_F13_32, // "fa3"
163 RISCV_REG_F13_64, // "fa3"
164 RISCV_REG_F14_32, // "fa4"
165 RISCV_REG_F14_64, // "fa4"
166 RISCV_REG_F15_32, // "fa5"
167 RISCV_REG_F15_64, // "fa5"
168 RISCV_REG_F16_32, // "fa6"
169 RISCV_REG_F16_64, // "fa6"
170 RISCV_REG_F17_32, // "fa7"
171 RISCV_REG_F17_64, // "fa7"
172 RISCV_REG_F18_32, // "fs2"
173 RISCV_REG_F18_64, // "fs2"
174 RISCV_REG_F19_32, // "fs3"
175 RISCV_REG_F19_64, // "fs3"
176 RISCV_REG_F20_32, // "fs4"
177 RISCV_REG_F20_64, // "fs4"
178 RISCV_REG_F21_32, // "fs5"
179 RISCV_REG_F21_64, // "fs5"
180 RISCV_REG_F22_32, // "fs6"
181 RISCV_REG_F22_64, // "fs6"
182 RISCV_REG_F23_32, // "fs7"
183 RISCV_REG_F23_64, // "fs7"
184 RISCV_REG_F24_32, // "fs8"
185 RISCV_REG_F24_64, // "fs8"
186 RISCV_REG_F25_32, // "fs9"
187 RISCV_REG_F25_64, // "fs9"
188 RISCV_REG_F26_32, // "fs10"
189 RISCV_REG_F26_64, // "fs10"
190 RISCV_REG_F27_32, // "fs11"
191 RISCV_REG_F27_64, // "fs11"
192 RISCV_REG_F28_32, // "ft8"
193 RISCV_REG_F28_64, // "ft8"
194 RISCV_REG_F29_32, // "ft9"
195 RISCV_REG_F29_64, // "ft9"
196 RISCV_REG_F30_32, // "ft10"
197 RISCV_REG_F30_64, // "ft10"
198 RISCV_REG_F31_32, // "ft11"
199 RISCV_REG_F31_64, // "ft11"
200 
201 RISCV_REG_ENDING, // <-- mark the end of the list or registers
202} riscv_reg;
203 
204//> RISCV instruction
205typedef enum riscv_insn {
206 RISCV_INS_INVALID = 0,
207 
208 RISCV_INS_ADD,
209 RISCV_INS_ADDI,
210 RISCV_INS_ADDIW,
211 RISCV_INS_ADDW,
212 RISCV_INS_AMOADD_D,
213 RISCV_INS_AMOADD_D_AQ,
214 RISCV_INS_AMOADD_D_AQ_RL,
215 RISCV_INS_AMOADD_D_RL,
216 RISCV_INS_AMOADD_W,
217 RISCV_INS_AMOADD_W_AQ,
218 RISCV_INS_AMOADD_W_AQ_RL,
219 RISCV_INS_AMOADD_W_RL,
220 RISCV_INS_AMOAND_D,
221 RISCV_INS_AMOAND_D_AQ,
222 RISCV_INS_AMOAND_D_AQ_RL,
223 RISCV_INS_AMOAND_D_RL,
224 RISCV_INS_AMOAND_W,
225 RISCV_INS_AMOAND_W_AQ,
226 RISCV_INS_AMOAND_W_AQ_RL,
227 RISCV_INS_AMOAND_W_RL,
228 RISCV_INS_AMOMAXU_D,
229 RISCV_INS_AMOMAXU_D_AQ,
230 RISCV_INS_AMOMAXU_D_AQ_RL,
231 RISCV_INS_AMOMAXU_D_RL,
232 RISCV_INS_AMOMAXU_W,
233 RISCV_INS_AMOMAXU_W_AQ,
234 RISCV_INS_AMOMAXU_W_AQ_RL,
235 RISCV_INS_AMOMAXU_W_RL,
236 RISCV_INS_AMOMAX_D,
237 RISCV_INS_AMOMAX_D_AQ,
238 RISCV_INS_AMOMAX_D_AQ_RL,
239 RISCV_INS_AMOMAX_D_RL,
240 RISCV_INS_AMOMAX_W,
241 RISCV_INS_AMOMAX_W_AQ,
242 RISCV_INS_AMOMAX_W_AQ_RL,
243 RISCV_INS_AMOMAX_W_RL,
244 RISCV_INS_AMOMINU_D,
245 RISCV_INS_AMOMINU_D_AQ,
246 RISCV_INS_AMOMINU_D_AQ_RL,
247 RISCV_INS_AMOMINU_D_RL,
248 RISCV_INS_AMOMINU_W,
249 RISCV_INS_AMOMINU_W_AQ,
250 RISCV_INS_AMOMINU_W_AQ_RL,
251 RISCV_INS_AMOMINU_W_RL,
252 RISCV_INS_AMOMIN_D,
253 RISCV_INS_AMOMIN_D_AQ,
254 RISCV_INS_AMOMIN_D_AQ_RL,
255 RISCV_INS_AMOMIN_D_RL,
256 RISCV_INS_AMOMIN_W,
257 RISCV_INS_AMOMIN_W_AQ,
258 RISCV_INS_AMOMIN_W_AQ_RL,
259 RISCV_INS_AMOMIN_W_RL,
260 RISCV_INS_AMOOR_D,
261 RISCV_INS_AMOOR_D_AQ,
262 RISCV_INS_AMOOR_D_AQ_RL,
263 RISCV_INS_AMOOR_D_RL,
264 RISCV_INS_AMOOR_W,
265 RISCV_INS_AMOOR_W_AQ,
266 RISCV_INS_AMOOR_W_AQ_RL,
267 RISCV_INS_AMOOR_W_RL,
268 RISCV_INS_AMOSWAP_D,
269 RISCV_INS_AMOSWAP_D_AQ,
270 RISCV_INS_AMOSWAP_D_AQ_RL,
271 RISCV_INS_AMOSWAP_D_RL,
272 RISCV_INS_AMOSWAP_W,
273 RISCV_INS_AMOSWAP_W_AQ,
274 RISCV_INS_AMOSWAP_W_AQ_RL,
275 RISCV_INS_AMOSWAP_W_RL,
276 RISCV_INS_AMOXOR_D,
277 RISCV_INS_AMOXOR_D_AQ,
278 RISCV_INS_AMOXOR_D_AQ_RL,
279 RISCV_INS_AMOXOR_D_RL,
280 RISCV_INS_AMOXOR_W,
281 RISCV_INS_AMOXOR_W_AQ,
282 RISCV_INS_AMOXOR_W_AQ_RL,
283 RISCV_INS_AMOXOR_W_RL,
284 RISCV_INS_AND,
285 RISCV_INS_ANDI,
286 RISCV_INS_AUIPC,
287 RISCV_INS_BEQ,
288 RISCV_INS_BGE,
289 RISCV_INS_BGEU,
290 RISCV_INS_BLT,
291 RISCV_INS_BLTU,
292 RISCV_INS_BNE,
293 RISCV_INS_CSRRC,
294 RISCV_INS_CSRRCI,
295 RISCV_INS_CSRRS,
296 RISCV_INS_CSRRSI,
297 RISCV_INS_CSRRW,
298 RISCV_INS_CSRRWI,
299 RISCV_INS_C_ADD,
300 RISCV_INS_C_ADDI,
301 RISCV_INS_C_ADDI16SP,
302 RISCV_INS_C_ADDI4SPN,
303 RISCV_INS_C_ADDIW,
304 RISCV_INS_C_ADDW,
305 RISCV_INS_C_AND,
306 RISCV_INS_C_ANDI,
307 RISCV_INS_C_BEQZ,
308 RISCV_INS_C_BNEZ,
309 RISCV_INS_C_EBREAK,
310 RISCV_INS_C_FLD,
311 RISCV_INS_C_FLDSP,
312 RISCV_INS_C_FLW,
313 RISCV_INS_C_FLWSP,
314 RISCV_INS_C_FSD,
315 RISCV_INS_C_FSDSP,
316 RISCV_INS_C_FSW,
317 RISCV_INS_C_FSWSP,
318 RISCV_INS_C_J,
319 RISCV_INS_C_JAL,
320 RISCV_INS_C_JALR,
321 RISCV_INS_C_JR,
322 RISCV_INS_C_LD,
323 RISCV_INS_C_LDSP,
324 RISCV_INS_C_LI,
325 RISCV_INS_C_LUI,
326 RISCV_INS_C_LW,
327 RISCV_INS_C_LWSP,
328 RISCV_INS_C_MV,
329 RISCV_INS_C_NOP,
330 RISCV_INS_C_OR,
331 RISCV_INS_C_SD,
332 RISCV_INS_C_SDSP,
333 RISCV_INS_C_SLLI,
334 RISCV_INS_C_SRAI,
335 RISCV_INS_C_SRLI,
336 RISCV_INS_C_SUB,
337 RISCV_INS_C_SUBW,
338 RISCV_INS_C_SW,
339 RISCV_INS_C_SWSP,
340 RISCV_INS_C_UNIMP,
341 RISCV_INS_C_XOR,
342 RISCV_INS_DIV,
343 RISCV_INS_DIVU,
344 RISCV_INS_DIVUW,
345 RISCV_INS_DIVW,
346 RISCV_INS_EBREAK,
347 RISCV_INS_ECALL,
348 RISCV_INS_FADD_D,
349 RISCV_INS_FADD_S,
350 RISCV_INS_FCLASS_D,
351 RISCV_INS_FCLASS_S,
352 RISCV_INS_FCVT_D_L,
353 RISCV_INS_FCVT_D_LU,
354 RISCV_INS_FCVT_D_S,
355 RISCV_INS_FCVT_D_W,
356 RISCV_INS_FCVT_D_WU,
357 RISCV_INS_FCVT_LU_D,
358 RISCV_INS_FCVT_LU_S,
359 RISCV_INS_FCVT_L_D,
360 RISCV_INS_FCVT_L_S,
361 RISCV_INS_FCVT_S_D,
362 RISCV_INS_FCVT_S_L,
363 RISCV_INS_FCVT_S_LU,
364 RISCV_INS_FCVT_S_W,
365 RISCV_INS_FCVT_S_WU,
366 RISCV_INS_FCVT_WU_D,
367 RISCV_INS_FCVT_WU_S,
368 RISCV_INS_FCVT_W_D,
369 RISCV_INS_FCVT_W_S,
370 RISCV_INS_FDIV_D,
371 RISCV_INS_FDIV_S,
372 RISCV_INS_FENCE,
373 RISCV_INS_FENCE_I,
374 RISCV_INS_FENCE_TSO,
375 RISCV_INS_FEQ_D,
376 RISCV_INS_FEQ_S,
377 RISCV_INS_FLD,
378 RISCV_INS_FLE_D,
379 RISCV_INS_FLE_S,
380 RISCV_INS_FLT_D,
381 RISCV_INS_FLT_S,
382 RISCV_INS_FLW,
383 RISCV_INS_FMADD_D,
384 RISCV_INS_FMADD_S,
385 RISCV_INS_FMAX_D,
386 RISCV_INS_FMAX_S,
387 RISCV_INS_FMIN_D,
388 RISCV_INS_FMIN_S,
389 RISCV_INS_FMSUB_D,
390 RISCV_INS_FMSUB_S,
391 RISCV_INS_FMUL_D,
392 RISCV_INS_FMUL_S,
393 RISCV_INS_FMV_D_X,
394 RISCV_INS_FMV_W_X,
395 RISCV_INS_FMV_X_D,
396 RISCV_INS_FMV_X_W,
397 RISCV_INS_FNMADD_D,
398 RISCV_INS_FNMADD_S,
399 RISCV_INS_FNMSUB_D,
400 RISCV_INS_FNMSUB_S,
401 RISCV_INS_FSD,
402 RISCV_INS_FSGNJN_D,
403 RISCV_INS_FSGNJN_S,
404 RISCV_INS_FSGNJX_D,
405 RISCV_INS_FSGNJX_S,
406 RISCV_INS_FSGNJ_D,
407 RISCV_INS_FSGNJ_S,
408 RISCV_INS_FSQRT_D,
409 RISCV_INS_FSQRT_S,
410 RISCV_INS_FSUB_D,
411 RISCV_INS_FSUB_S,
412 RISCV_INS_FSW,
413 RISCV_INS_JAL,
414 RISCV_INS_JALR,
415 RISCV_INS_LB,
416 RISCV_INS_LBU,
417 RISCV_INS_LD,
418 RISCV_INS_LH,
419 RISCV_INS_LHU,
420 RISCV_INS_LR_D,
421 RISCV_INS_LR_D_AQ,
422 RISCV_INS_LR_D_AQ_RL,
423 RISCV_INS_LR_D_RL,
424 RISCV_INS_LR_W,
425 RISCV_INS_LR_W_AQ,
426 RISCV_INS_LR_W_AQ_RL,
427 RISCV_INS_LR_W_RL,
428 RISCV_INS_LUI,
429 RISCV_INS_LW,
430 RISCV_INS_LWU,
431 RISCV_INS_MRET,
432 RISCV_INS_MUL,
433 RISCV_INS_MULH,
434 RISCV_INS_MULHSU,
435 RISCV_INS_MULHU,
436 RISCV_INS_MULW,
437 RISCV_INS_OR,
438 RISCV_INS_ORI,
439 RISCV_INS_REM,
440 RISCV_INS_REMU,
441 RISCV_INS_REMUW,
442 RISCV_INS_REMW,
443 RISCV_INS_SB,
444 RISCV_INS_SC_D,
445 RISCV_INS_SC_D_AQ,
446 RISCV_INS_SC_D_AQ_RL,
447 RISCV_INS_SC_D_RL,
448 RISCV_INS_SC_W,
449 RISCV_INS_SC_W_AQ,
450 RISCV_INS_SC_W_AQ_RL,
451 RISCV_INS_SC_W_RL,
452 RISCV_INS_SD,
453 RISCV_INS_SFENCE_VMA,
454 RISCV_INS_SH,
455 RISCV_INS_SLL,
456 RISCV_INS_SLLI,
457 RISCV_INS_SLLIW,
458 RISCV_INS_SLLW,
459 RISCV_INS_SLT,
460 RISCV_INS_SLTI,
461 RISCV_INS_SLTIU,
462 RISCV_INS_SLTU,
463 RISCV_INS_SRA,
464 RISCV_INS_SRAI,
465 RISCV_INS_SRAIW,
466 RISCV_INS_SRAW,
467 RISCV_INS_SRET,
468 RISCV_INS_SRL,
469 RISCV_INS_SRLI,
470 RISCV_INS_SRLIW,
471 RISCV_INS_SRLW,
472 RISCV_INS_SUB,
473 RISCV_INS_SUBW,
474 RISCV_INS_SW,
475 RISCV_INS_UNIMP,
476 RISCV_INS_URET,
477 RISCV_INS_WFI,
478 RISCV_INS_XOR,
479 RISCV_INS_XORI,
480 
481 RISCV_INS_ENDING,
482} riscv_insn;
483 
484//> Group of RISCV instructions
485typedef enum riscv_insn_group {
486 RISCV_GRP_INVALID = 0, ///< = CS_GRP_INVALID
487 
488 // Generic groups
489 // all jump instructions (conditional+direct+indirect jumps)
490 RISCV_GRP_JUMP, ///< = CS_GRP_JUMP
491 // all call instructions
492 RISCV_GRP_CALL, ///< = CS_GRP_CALL
493 // all return instructions
494 RISCV_GRP_RET, ///< = CS_GRP_RET
495 // all interrupt instructions (int+syscall)
496 RISCV_GRP_INT, ///< = CS_GRP_INT
497 // all interrupt return instructions
498 RISCV_GRP_IRET, ///< = CS_GRP_IRET
499 // all privileged instructions
500 RISCV_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE
501 // all relative branching instructions
502 RISCV_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE
503 
504 // Architecture-specific groups
505 RISCV_GRP_ISRV32 = 128,
506 RISCV_GRP_ISRV64,
507 RISCV_GRP_HASSTDEXTA,
508 RISCV_GRP_HASSTDEXTC,
509 RISCV_GRP_HASSTDEXTD,
510 RISCV_GRP_HASSTDEXTF,
511 RISCV_GRP_HASSTDEXTM,
512 RISCV_GRP_ENDING,
513} riscv_insn_group;
514 
515#ifdef __cplusplus
516}
517#endif
518 
519#endif
520 
521