Skip to content

Commit

Permalink
Add reg_access
Browse files Browse the repository at this point in the history
  • Loading branch information
wargio committed Aug 28, 2024
1 parent 2c61e2e commit 6235f7f
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 1 deletion.
56 changes: 56 additions & 0 deletions arch/Mips/MipsMapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,62 @@ const insn_map mips_insns[] = {
#include "MipsGenCSMappingInsn.inc"
};

void Mips_reg_access(const cs_insn *insn, cs_regs regs_read,
uint8_t *regs_read_count, cs_regs regs_write,
uint8_t *regs_write_count)
{
uint8_t i;
uint8_t read_count, write_count;
cs_mips *mips = &(insn->detail->mips);

read_count = insn->detail->regs_read_count;
write_count = insn->detail->regs_write_count;

// implicit registers
memcpy(regs_read, insn->detail->regs_read,
read_count * sizeof(insn->detail->regs_read[0]));
memcpy(regs_write, insn->detail->regs_write,
write_count * sizeof(insn->detail->regs_write[0]));

// explicit registers
for (i = 0; i < mips->op_count; i++) {
cs_mips_op *op = &(mips->operands[i]);
switch ((int)op->type) {
case MIPS_OP_REG:
if ((op->access & CS_AC_READ) &&
!arr_exist(regs_read, read_count, op->reg)) {
regs_read[read_count] = (uint16_t)op->reg;
read_count++;
}
if ((op->access & CS_AC_WRITE) &&
!arr_exist(regs_write, write_count, op->reg)) {
regs_write[write_count] = (uint16_t)op->reg;
write_count++;
}
break;
case MIPS_OP_MEM:
// registers appeared in memory references always being read
if ((op->mem.base != MIPS_REG_INVALID) &&
!arr_exist(regs_read, read_count, op->mem.base)) {
regs_read[read_count] = (uint16_t)op->mem.base;
read_count++;
}
if ((insn->detail->writeback) &&
(op->mem.base != MIPS_REG_INVALID) &&
!arr_exist(regs_write, write_count, op->mem.base)) {
regs_write[write_count] =
(uint16_t)op->mem.base;
write_count++;
}
default:
break;
}
}

*regs_read_count = read_count;
*regs_write_count = write_count;
}

void Mips_set_instr_map_data(MCInst *MI)
{
map_cs_id(MI, mips_insns, ARR_SIZE(mips_insns));
Expand Down
4 changes: 4 additions & 0 deletions arch/Mips/MipsMapping.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ bool Mips_getInstruction(csh handle, const uint8_t *code, size_t code_len,
MCInst *instr, uint16_t *size, uint64_t address,
void *info);

void Mips_reg_access(const cs_insn *insn, cs_regs regs_read,
uint8_t *regs_read_count, cs_regs regs_write,
uint8_t *regs_write_count);

// cs_detail related functions
void Mips_init_cs_detail(MCInst *MI);
void Mips_set_detail_op_imm(MCInst *MI, unsigned OpNum,
Expand Down
2 changes: 1 addition & 1 deletion arch/Mips/MipsModule.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ cs_err Mips_global_init(cs_struct *ud)
ud->disasm = Mips_getInstruction;
ud->post_printer = NULL;
#ifndef CAPSTONE_DIET
//ud->reg_access = Mips_reg_access;
ud->reg_access = Mips_reg_access;
#endif

return CS_ERR_OK;
Expand Down

0 comments on commit 6235f7f

Please sign in to comment.