ts-capstone
Version:
This module provides bindings for the Capstone disassembly framework.
508 lines (496 loc) • 11.1 kB
text/typescript
export interface cs_riscv_op {
type?: RISCV; // operand type
reg?: RISCV; // register value for REG operand
imm?: number; // immediate value for IMM operand
mem?: {
// base/disp value for MEM operand
base: number; // base register
disp: number; // displacement/offset value
};
}
export enum RISCV {
// Operand type for instruction's operands
OP_INVALID = 0,
OP_REG = 1,
OP_IMM = 2,
OP_MEM = 3,
// RISCV registers
REG_INVALID = 0,
// General purpose registers
REG_X0 = 1,
// REG_ZERO = RISCV_REG_X0
REG_X1 = 2,
// REG_RA = RISCV_REG_X1
REG_X2 = 3,
// REG_SP = RISCV_REG_X2
REG_X3 = 4,
// REG_GP = RISCV_REG_X3
REG_X4 = 5,
// REG_TP = RISCV_REG_X4
REG_X5 = 6,
// REG_T0 = RISCV_REG_X5
REG_X6 = 7,
// REG_T1 = RISCV_REG_X6
REG_X7 = 8,
// REG_T2 = RISCV_REG_X7
REG_X8 = 9,
// REG_S0 = RISCV_REG_X8
// REG_FP = RISCV_REG_X8
REG_X9 = 10,
// REG_S1 = RISCV_REG_X9
REG_X10 = 11,
// REG_A0 = RISCV_REG_X10
REG_X11 = 12,
// REG_A1 = RISCV_REG_X11
REG_X12 = 13,
// REG_A2 = RISCV_REG_X12
REG_X13 = 14,
// REG_A3 = RISCV_REG_X13
REG_X14 = 15,
// REG_A4 = RISCV_REG_X14
REG_X15 = 16,
// REG_A5 = RISCV_REG_X15
REG_X16 = 17,
// REG_A6 = RISCV_REG_X16
REG_X17 = 18,
// REG_A7 = RISCV_REG_X17
REG_X18 = 19,
// REG_S2 = RISCV_REG_X18
REG_X19 = 20,
// REG_S3 = RISCV_REG_X19
REG_X20 = 21,
// REG_S4 = RISCV_REG_X20
REG_X21 = 22,
// REG_S5 = RISCV_REG_X21
REG_X22 = 23,
// REG_S6 = RISCV_REG_X22
REG_X23 = 24,
// REG_S7 = RISCV_REG_X23
REG_X24 = 25,
// REG_S8 = RISCV_REG_X24
REG_X25 = 26,
// REG_S9 = RISCV_REG_X25
REG_X26 = 27,
// REG_S10 = RISCV_REG_X26
REG_X27 = 28,
// REG_S11 = RISCV_REG_X27
REG_X28 = 29,
// REG_T3 = RISCV_REG_X28
REG_X29 = 30,
// REG_T4 = RISCV_REG_X29
REG_X30 = 31,
// REG_T5 = RISCV_REG_X30
REG_X31 = 32,
// REG_T6 = RISCV_REG_X31
// Floating-point registers
REG_F0_32 = 33,
REG_F0_64 = 34,
REG_F1_32 = 35,
REG_F1_64 = 36,
REG_F2_32 = 37,
REG_F2_64 = 38,
REG_F3_32 = 39,
REG_F3_64 = 40,
REG_F4_32 = 41,
REG_F4_64 = 42,
REG_F5_32 = 43,
REG_F5_64 = 44,
REG_F6_32 = 45,
REG_F6_64 = 46,
REG_F7_32 = 47,
REG_F7_64 = 48,
REG_F8_32 = 49,
REG_F8_64 = 50,
REG_F9_32 = 51,
REG_F9_64 = 52,
REG_F10_32 = 53,
REG_F10_64 = 54,
REG_F11_32 = 55,
REG_F11_64 = 56,
REG_F12_32 = 57,
REG_F12_64 = 58,
REG_F13_32 = 59,
REG_F13_64 = 60,
REG_F14_32 = 61,
REG_F14_64 = 62,
REG_F15_32 = 63,
REG_F15_64 = 64,
REG_F16_32 = 65,
REG_F16_64 = 66,
REG_F17_32 = 67,
REG_F17_64 = 68,
REG_F18_32 = 69,
REG_F18_64 = 70,
REG_F19_32 = 71,
REG_F19_64 = 72,
REG_F20_32 = 73,
REG_F20_64 = 74,
REG_F21_32 = 75,
REG_F21_64 = 76,
REG_F22_32 = 77,
REG_F22_64 = 78,
REG_F23_32 = 79,
REG_F23_64 = 80,
REG_F24_32 = 81,
REG_F24_64 = 82,
REG_F25_32 = 83,
REG_F25_64 = 84,
REG_F26_32 = 85,
REG_F26_64 = 86,
REG_F27_32 = 87,
REG_F27_64 = 88,
REG_F28_32 = 89,
REG_F28_64 = 90,
REG_F29_32 = 91,
REG_F29_64 = 92,
REG_F30_32 = 93,
REG_F30_64 = 94,
REG_F31_32 = 95,
REG_F31_64 = 96,
REG_ENDING = 97,
// RISCV instruction
INS_INVALID = 0,
INS_ADD = 1,
INS_ADDI = 2,
INS_ADDIW = 3,
INS_ADDW = 4,
INS_AMOADD_D = 5,
INS_AMOADD_D_AQ = 6,
INS_AMOADD_D_AQ_RL = 7,
INS_AMOADD_D_RL = 8,
INS_AMOADD_W = 9,
INS_AMOADD_W_AQ = 10,
INS_AMOADD_W_AQ_RL = 11,
INS_AMOADD_W_RL = 12,
INS_AMOAND_D = 13,
INS_AMOAND_D_AQ = 14,
INS_AMOAND_D_AQ_RL = 15,
INS_AMOAND_D_RL = 16,
INS_AMOAND_W = 17,
INS_AMOAND_W_AQ = 18,
INS_AMOAND_W_AQ_RL = 19,
INS_AMOAND_W_RL = 20,
INS_AMOMAXU_D = 21,
INS_AMOMAXU_D_AQ = 22,
INS_AMOMAXU_D_AQ_RL = 23,
INS_AMOMAXU_D_RL = 24,
INS_AMOMAXU_W = 25,
INS_AMOMAXU_W_AQ = 26,
INS_AMOMAXU_W_AQ_RL = 27,
INS_AMOMAXU_W_RL = 28,
INS_AMOMAX_D = 29,
INS_AMOMAX_D_AQ = 30,
INS_AMOMAX_D_AQ_RL = 31,
INS_AMOMAX_D_RL = 32,
INS_AMOMAX_W = 33,
INS_AMOMAX_W_AQ = 34,
INS_AMOMAX_W_AQ_RL = 35,
INS_AMOMAX_W_RL = 36,
INS_AMOMINU_D = 37,
INS_AMOMINU_D_AQ = 38,
INS_AMOMINU_D_AQ_RL = 39,
INS_AMOMINU_D_RL = 40,
INS_AMOMINU_W = 41,
INS_AMOMINU_W_AQ = 42,
INS_AMOMINU_W_AQ_RL = 43,
INS_AMOMINU_W_RL = 44,
INS_AMOMIN_D = 45,
INS_AMOMIN_D_AQ = 46,
INS_AMOMIN_D_AQ_RL = 47,
INS_AMOMIN_D_RL = 48,
INS_AMOMIN_W = 49,
INS_AMOMIN_W_AQ = 50,
INS_AMOMIN_W_AQ_RL = 51,
INS_AMOMIN_W_RL = 52,
INS_AMOOR_D = 53,
INS_AMOOR_D_AQ = 54,
INS_AMOOR_D_AQ_RL = 55,
INS_AMOOR_D_RL = 56,
INS_AMOOR_W = 57,
INS_AMOOR_W_AQ = 58,
INS_AMOOR_W_AQ_RL = 59,
INS_AMOOR_W_RL = 60,
INS_AMOSWAP_D = 61,
INS_AMOSWAP_D_AQ = 62,
INS_AMOSWAP_D_AQ_RL = 63,
INS_AMOSWAP_D_RL = 64,
INS_AMOSWAP_W = 65,
INS_AMOSWAP_W_AQ = 66,
INS_AMOSWAP_W_AQ_RL = 67,
INS_AMOSWAP_W_RL = 68,
INS_AMOXOR_D = 69,
INS_AMOXOR_D_AQ = 70,
INS_AMOXOR_D_AQ_RL = 71,
INS_AMOXOR_D_RL = 72,
INS_AMOXOR_W = 73,
INS_AMOXOR_W_AQ = 74,
INS_AMOXOR_W_AQ_RL = 75,
INS_AMOXOR_W_RL = 76,
INS_AND = 77,
INS_ANDI = 78,
INS_AUIPC = 79,
INS_BEQ = 80,
INS_BGE = 81,
INS_BGEU = 82,
INS_BLT = 83,
INS_BLTU = 84,
INS_BNE = 85,
INS_CSRRC = 86,
INS_CSRRCI = 87,
INS_CSRRS = 88,
INS_CSRRSI = 89,
INS_CSRRW = 90,
INS_CSRRWI = 91,
INS_C_ADD = 92,
INS_C_ADDI = 93,
INS_C_ADDI16SP = 94,
INS_C_ADDI4SPN = 95,
INS_C_ADDIW = 96,
INS_C_ADDW = 97,
INS_C_AND = 98,
INS_C_ANDI = 99,
INS_C_BEQZ = 100,
INS_C_BNEZ = 101,
INS_C_EBREAK = 102,
INS_C_FLD = 103,
INS_C_FLDSP = 104,
INS_C_FLW = 105,
INS_C_FLWSP = 106,
INS_C_FSD = 107,
INS_C_FSDSP = 108,
INS_C_FSW = 109,
INS_C_FSWSP = 110,
INS_C_J = 111,
INS_C_JAL = 112,
INS_C_JALR = 113,
INS_C_JR = 114,
INS_C_LD = 115,
INS_C_LDSP = 116,
INS_C_LI = 117,
INS_C_LUI = 118,
INS_C_LW = 119,
INS_C_LWSP = 120,
INS_C_MV = 121,
INS_C_NOP = 122,
INS_C_OR = 123,
INS_C_SD = 124,
INS_C_SDSP = 125,
INS_C_SLLI = 126,
INS_C_SRAI = 127,
INS_C_SRLI = 128,
INS_C_SUB = 129,
INS_C_SUBW = 130,
INS_C_SW = 131,
INS_C_SWSP = 132,
INS_C_UNIMP = 133,
INS_C_XOR = 134,
INS_DIV = 135,
INS_DIVU = 136,
INS_DIVUW = 137,
INS_DIVW = 138,
INS_EBREAK = 139,
INS_ECALL = 140,
INS_FADD_D = 141,
INS_FADD_S = 142,
INS_FCLASS_D = 143,
INS_FCLASS_S = 144,
INS_FCVT_D_L = 145,
INS_FCVT_D_LU = 146,
INS_FCVT_D_S = 147,
INS_FCVT_D_W = 148,
INS_FCVT_D_WU = 149,
INS_FCVT_LU_D = 150,
INS_FCVT_LU_S = 151,
INS_FCVT_L_D = 152,
INS_FCVT_L_S = 153,
INS_FCVT_S_D = 154,
INS_FCVT_S_L = 155,
INS_FCVT_S_LU = 156,
INS_FCVT_S_W = 157,
INS_FCVT_S_WU = 158,
INS_FCVT_WU_D = 159,
INS_FCVT_WU_S = 160,
INS_FCVT_W_D = 161,
INS_FCVT_W_S = 162,
INS_FDIV_D = 163,
INS_FDIV_S = 164,
INS_FENCE = 165,
INS_FENCE_I = 166,
INS_FENCE_TSO = 167,
INS_FEQ_D = 168,
INS_FEQ_S = 169,
INS_FLD = 170,
INS_FLE_D = 171,
INS_FLE_S = 172,
INS_FLT_D = 173,
INS_FLT_S = 174,
INS_FLW = 175,
INS_FMADD_D = 176,
INS_FMADD_S = 177,
INS_FMAX_D = 178,
INS_FMAX_S = 179,
INS_FMIN_D = 180,
INS_FMIN_S = 181,
INS_FMSUB_D = 182,
INS_FMSUB_S = 183,
INS_FMUL_D = 184,
INS_FMUL_S = 185,
INS_FMV_D_X = 186,
INS_FMV_W_X = 187,
INS_FMV_X_D = 188,
INS_FMV_X_W = 189,
INS_FNMADD_D = 190,
INS_FNMADD_S = 191,
INS_FNMSUB_D = 192,
INS_FNMSUB_S = 193,
INS_FSD = 194,
INS_FSGNJN_D = 195,
INS_FSGNJN_S = 196,
INS_FSGNJX_D = 197,
INS_FSGNJX_S = 198,
INS_FSGNJ_D = 199,
INS_FSGNJ_S = 200,
INS_FSQRT_D = 201,
INS_FSQRT_S = 202,
INS_FSUB_D = 203,
INS_FSUB_S = 204,
INS_FSW = 205,
INS_JAL = 206,
INS_JALR = 207,
INS_LB = 208,
INS_LBU = 209,
INS_LD = 210,
INS_LH = 211,
INS_LHU = 212,
INS_LR_D = 213,
INS_LR_D_AQ = 214,
INS_LR_D_AQ_RL = 215,
INS_LR_D_RL = 216,
INS_LR_W = 217,
INS_LR_W_AQ = 218,
INS_LR_W_AQ_RL = 219,
INS_LR_W_RL = 220,
INS_LUI = 221,
INS_LW = 222,
INS_LWU = 223,
INS_MRET = 224,
INS_MUL = 225,
INS_MULH = 226,
INS_MULHSU = 227,
INS_MULHU = 228,
INS_MULW = 229,
INS_OR = 230,
INS_ORI = 231,
INS_REM = 232,
INS_REMU = 233,
INS_REMUW = 234,
INS_REMW = 235,
INS_SB = 236,
INS_SC_D = 237,
INS_SC_D_AQ = 238,
INS_SC_D_AQ_RL = 239,
INS_SC_D_RL = 240,
INS_SC_W = 241,
INS_SC_W_AQ = 242,
INS_SC_W_AQ_RL = 243,
INS_SC_W_RL = 244,
INS_SD = 245,
INS_SFENCE_VMA = 246,
INS_SH = 247,
INS_SLL = 248,
INS_SLLI = 249,
INS_SLLIW = 250,
INS_SLLW = 251,
INS_SLT = 252,
INS_SLTI = 253,
INS_SLTIU = 254,
INS_SLTU = 255,
INS_SRA = 256,
INS_SRAI = 257,
INS_SRAIW = 258,
INS_SRAW = 259,
INS_SRET = 260,
INS_SRL = 261,
INS_SRLI = 262,
INS_SRLIW = 263,
INS_SRLW = 264,
INS_SUB = 265,
INS_SUBW = 266,
INS_SW = 267,
INS_UNIMP = 268,
INS_URET = 269,
INS_WFI = 270,
INS_XOR = 271,
INS_XORI = 272,
INS_ENDING = 273,
// Group of RISCV instructions
GRP_INVALID = 0, // cs.GRP_INVALID
// Generic groups
// all jump instructions (conditional+direct+indirect jumps)
GRP_JUMP = 1, // cs.GRP_JUMP
// all call instructions
GRP_CALL = 2, // cs.GRP_CALL
// all return instructions
GRP_RET = 3, // cs.GRP_RET
// all interrupt instructions (int+syscall)
GRP_INT = 4, // cs.GRP_INT
// all interrupt return instructions
GRP_IRET = 5, // cs.GRP_IRET
// all privileged instructions
GRP_PRIVILEGE = 6, // cs.GRP_PRIVILEGE
// all relative branching instructions
GRP_BRANCH_RELATIVE = 7, // cs.GRP_BRANCH_RELATIVE
// Architecture-specific groups
GRP_ISRV32 = 128,
GRP_ISRV64 = 129,
GRP_HASSTDEXTA = 130,
GRP_HASSTDEXTC = 131,
GRP_HASSTDEXTD = 132,
GRP_HASSTDEXTF = 133,
GRP_HASSTDEXTM = 134,
GRP_ISRVA = 135,
GRP_ISRVC = 136,
GRP_ISRVD = 137,
GRP_ISRVCD = 138,
GRP_ISRVF = 139,
GRP_ISRV32C = 140,
GRP_ISRV32CF = 141,
GRP_ISRVM = 142,
GRP_ISRV64A = 143,
GRP_ISRV64C = 144,
GRP_ISRV64D = 145,
GRP_ISRV64F = 146,
GRP_ISRV64M = 147,
GRP_ENDING = 148,
}
export class cs_riscv {
public need_effective_addr: boolean; // Does this instruction need effective address or not.
public op_count: number; // Number of operands of this instruction, or 0 when instruction has no operand.
public operands: cs_riscv_op[]; // operands for this instruction.
constructor(arch_info_ptr: number, Memory: any) {
this.operands = [];
this.need_effective_addr = Memory.read(arch_info_ptr + 0, 'bool');
this.op_count = Memory.read(arch_info_ptr + 1, 'ubyte');
for (let i = 0; i < this.op_count; i++) {
const op: cs_riscv_op = {} as cs_riscv_op;
const op_ptr: number = arch_info_ptr + 8 + i * 24;
op.type = Memory.read(op_ptr + 0, 'i32');
switch (op.type) {
case RISCV.OP_REG:
op.reg = Memory.read(op_ptr + 8, 'u32');
break;
case RISCV.OP_IMM:
op.imm = Memory.read(op_ptr + 8, 'i32');
break;
case RISCV.OP_MEM:
op.mem = {
base: Memory.read(op_ptr + 8, 'u32'),
disp: Memory.read(op_ptr + 16, 'i64'),
};
break;
}
this.operands[i] = op;
}
return this;
}
}