mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-09 07:42:25 +00:00
Add support for RAnalop.dst/src in few more arch
This commit is contained in:
parent
7befed4463
commit
450b285443
@ -9,6 +9,7 @@
|
||||
|
||||
/* arm64 */
|
||||
#define IMM64(x) (ut64)(insn->detail->arm64.operands[x].imm)
|
||||
#define INSOP64(x) insn->detail->arm64.operands[x]
|
||||
|
||||
/* arm32 */
|
||||
#define REG(x) r_str_get (cs_reg_name (*handle, insn->detail->arm.operands[x].reg))
|
||||
@ -16,6 +17,7 @@
|
||||
#define REGID64(x) insn->detail->arm64.operands[x].reg
|
||||
#define REGID(x) insn->detail->arm.operands[x].reg
|
||||
#define IMM(x) (ut32)(insn->detail->arm.operands[x].imm)
|
||||
#define INSOP(x) insn->detail->arm.operands[x]
|
||||
#define MEMBASE(x) r_str_get (cs_reg_name(*handle, insn->detail->arm.operands[x].mem.base))
|
||||
#define MEMBASE64(x) r_str_get (cs_reg_name(*handle, insn->detail->arm64.operands[x].mem.base))
|
||||
#define REGBASE(x) insn->detail->arm.operands[x].mem.base
|
||||
@ -2670,16 +2672,72 @@ jmp $$ + 4 + ( [delta] * 2 )
|
||||
}
|
||||
}
|
||||
|
||||
static void op_fillval (RAnalOp *op , cs_insn *insn, int bits) {
|
||||
ut64 disp = (bits == 32)? MEMDISP(1): MEMDISP64(1);
|
||||
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
|
||||
|
||||
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (INSOP (reg_num).type) {
|
||||
case ARM_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
|
||||
break;
|
||||
case ARM_OP_MEM:
|
||||
if (INSOP (reg_num).mem.base != ARM_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_reg64_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (INSOP64 (reg_num).type) {
|
||||
case ARM64_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP64 (reg_num).reg);
|
||||
break;
|
||||
case ARM64_OP_MEM:
|
||||
if (INSOP64 (reg_num).mem.base != ARM64_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP64 (reg_num).mem.base);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void op_fillval(RAnalOp *op , csh handle, cs_insn *insn, int bits) {
|
||||
static RRegItem reg;
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_LOAD:
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->delta = disp;
|
||||
ZERO_FILL (reg);
|
||||
op->src[0]->reg = ®
|
||||
if (bits == 32) {
|
||||
parse_reg_name (op->src[0]->reg, handle, insn, 1);
|
||||
op->src[0]->delta = MEMDISP(1);
|
||||
} else {
|
||||
parse_reg64_name (op->src[0]->reg, handle, insn, 1);
|
||||
op->src[0]->delta = MEMDISP64(1);
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_STORE:
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->delta = disp;
|
||||
ZERO_FILL (reg);
|
||||
op->dst->reg = ®
|
||||
if (bits == 32) {
|
||||
parse_reg_name (op->dst->reg, handle, insn, 1);
|
||||
op->dst->delta = MEMDISP(1);
|
||||
} else {
|
||||
parse_reg64_name (op->dst->reg, handle, insn, 1);
|
||||
op->dst->delta = MEMDISP64(1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -2743,7 +2801,7 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
}
|
||||
}
|
||||
if (a->fillval) {
|
||||
op_fillval (op, insn, a->bits);
|
||||
op_fillval (op, handle, insn, a->bits);
|
||||
}
|
||||
cs_free (insn, n);
|
||||
}
|
||||
|
@ -76,6 +76,56 @@ static void opex(RStrBuf *buf, csh handle, cs_insn *insn) {
|
||||
r_strbuf_append (buf, "]}");
|
||||
}
|
||||
|
||||
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
|
||||
|
||||
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (OPERAND (reg_num).type) {
|
||||
case M68K_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).reg);
|
||||
break;
|
||||
case M68K_OP_MEM:
|
||||
if (OPERAND (reg_num).mem.base_reg != M68K_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).mem.base_reg);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
|
||||
static RRegItem reg;
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_MOV:
|
||||
ZERO_FILL (reg);
|
||||
if (OPERAND(1).type == M68K_OP_MEM) {
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->reg = ®
|
||||
parse_reg_name (op->src[0]->reg, handle, insn, 1);
|
||||
op->src[0]->delta = OPERAND(0).mem.disp;
|
||||
} else if (OPERAND(0).type == M68K_OP_MEM) {
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->reg = ®
|
||||
parse_reg_name (op->dst->reg, handle, insn, 0);
|
||||
op->dst->delta = OPERAND(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_LEA:
|
||||
ZERO_FILL (reg);
|
||||
if (OPERAND(1).type == M68K_OP_MEM) {
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->reg = ®
|
||||
parse_reg_name (op->dst->reg, handle, insn, 1);
|
||||
op->dst->delta = OPERAND(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
int n, ret, opsize = -1;
|
||||
static csh handle = 0;
|
||||
@ -592,10 +642,13 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
op->stackptr = 0;
|
||||
break;
|
||||
}
|
||||
beach:
|
||||
if (a->fillval) {
|
||||
op_fillval (op, handle, insn);
|
||||
}
|
||||
beach:
|
||||
cs_free (insn, n);
|
||||
//cs_close (&handle);
|
||||
fin:
|
||||
fin:
|
||||
return opsize;
|
||||
}
|
||||
|
||||
|
@ -584,17 +584,44 @@ static int analop_esil(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
|
||||
|
||||
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (OPERAND (reg_num).type) {
|
||||
case MIPS_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).reg);
|
||||
break;
|
||||
case MIPS_OP_MEM:
|
||||
if (OPERAND (reg_num).mem.base != MIPS_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, OPERAND (reg_num).mem.base);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void op_fillval(RAnal *anal, RAnalOp *op, csh *handle, cs_insn *insn) {
|
||||
static RRegItem reg;
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_LOAD:
|
||||
if (OPERAND(1).type == MIPS_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->reg = ®
|
||||
parse_reg_name (op->src[0]->reg, *handle, insn, 1);
|
||||
op->src[0]->delta = OPERAND(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_STORE:
|
||||
if (OPERAND(1).type == MIPS_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->reg = ®
|
||||
parse_reg_name (op->dst->reg, *handle, insn, 1);
|
||||
op->dst->delta = OPERAND(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
|
@ -541,6 +541,51 @@ static int analop_vle(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
|
||||
|
||||
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (INSOP (reg_num).type) {
|
||||
case PPC_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
|
||||
break;
|
||||
case PPC_OP_MEM:
|
||||
if (INSOP (reg_num).mem.base != PPC_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
|
||||
}
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
|
||||
static RRegItem reg;
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_LOAD:
|
||||
if (INSOP(1).type == PPC_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->reg = ®
|
||||
parse_reg_name (op->src[0]->reg, handle, insn, 1);
|
||||
op->src[0]->delta = INSOP(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_STORE:
|
||||
if (INSOP(1).type == PPC_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->reg = ®
|
||||
parse_reg_name (op->dst->reg, handle, insn, 1);
|
||||
op->dst->delta = INSOP(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
static csh handle = 0;
|
||||
static int omode = -1, obits = -1;
|
||||
@ -1134,6 +1179,9 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
esilprintf (op, "%s,%s,<<<,%s,&,%s,=", ARG (2), ARG (1), cmask64 (0, ARG (3)), ARG (0));
|
||||
break;
|
||||
}
|
||||
if (a->fillval) {
|
||||
op_fillval (op, handle, insn);
|
||||
}
|
||||
r_strbuf_fini (&op->esil);
|
||||
cs_free (insn, n);
|
||||
//cs_close (&handle);
|
||||
|
@ -51,6 +51,51 @@ static void opex(RStrBuf *buf, csh handle, cs_insn *insn) {
|
||||
r_strbuf_append (buf, "}");
|
||||
}
|
||||
|
||||
#define ZERO_FILL(x) memset (&x, 0, sizeof (x))
|
||||
|
||||
static int parse_reg_name(RRegItem *reg, csh handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
switch (INSOP (reg_num).type) {
|
||||
case SPARC_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).reg);
|
||||
break;
|
||||
case SPARC_OP_MEM:
|
||||
if (INSOP (reg_num).mem.base != SPARC_REG_INVALID) {
|
||||
reg->name = (char *)cs_reg_name (handle, INSOP (reg_num).mem.base);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void op_fillval(RAnalOp *op, csh handle, cs_insn *insn) {
|
||||
static RRegItem reg;
|
||||
switch (op->type) {
|
||||
case R_ANAL_OP_TYPE_LOAD:
|
||||
if (INSOP(0).type == SPARC_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->reg = ®
|
||||
parse_reg_name (op->src[0]->reg, handle, insn, 0);
|
||||
op->src[0]->delta = INSOP(0).mem.disp;
|
||||
}
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_STORE:
|
||||
if (INSOP(1).type == SPARC_OP_MEM) {
|
||||
ZERO_FILL (reg);
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->reg = ®
|
||||
parse_reg_name (op->dst->reg, handle, insn, 1);
|
||||
op->dst->delta = INSOP(1).mem.disp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
static csh handle = 0;
|
||||
static int omode;
|
||||
@ -260,6 +305,9 @@ static int analop(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len) {
|
||||
op->type = R_ANAL_OP_TYPE_DIV;
|
||||
break;
|
||||
}
|
||||
if (a->fillval) {
|
||||
op_fillval (op, handle, insn);
|
||||
}
|
||||
cs_free (insn, n);
|
||||
}
|
||||
return op->size;
|
||||
|
@ -1631,22 +1631,7 @@ static void anop_esil(RAnal *a, RAnalOp *op, ut64 addr, const ut8 *buf, int len,
|
||||
}
|
||||
}
|
||||
|
||||
static int parse_reg_name_mov(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (INSOP (reg_num).type) {
|
||||
case X86_OP_REG:
|
||||
reg->name = (char *)cs_reg_name (*handle, INSOP (reg_num).reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_reg_name_lea(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
|
||||
static int parse_reg_name(RRegItem *reg, csh *handle, cs_insn *insn, int reg_num) {
|
||||
if (!reg) {
|
||||
return -1;
|
||||
}
|
||||
@ -1674,7 +1659,9 @@ static int parse_reg_name_lea(RRegItem *reg, csh *handle, cs_insn *insn, int reg
|
||||
ZERO_FILL (regs[0]);\
|
||||
ZERO_FILL (regs[1]);\
|
||||
(op)->src[0]->reg = ®s[1];\
|
||||
(op)->dst->reg = ®s[0];
|
||||
(op)->dst->reg = ®s[0];\
|
||||
parse_reg_name (op->src[0]->reg, &gop.handle, insn, 1);\
|
||||
parse_reg_name (op->dst->reg, &gop.handle, insn, 0);
|
||||
|
||||
static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
|
||||
char *dst;
|
||||
@ -1691,7 +1678,6 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
|
||||
switch (INSOP(0).type) {
|
||||
case X86_OP_MEM:
|
||||
op->dst->delta = INSOP(0).mem.disp;
|
||||
parse_reg_name_mov (op->src[0]->reg, &gop.handle, insn, 1);
|
||||
break;
|
||||
case X86_OP_REG:
|
||||
dst = getarg (&gop, 0, 0, NULL, DST_AR);
|
||||
@ -1708,13 +1694,12 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
|
||||
op->src[0]->imm = INSOP(1).imm;
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_CMP:
|
||||
CREATE_SRC_DST (op);
|
||||
switch (INSOP(0).type) {
|
||||
case X86_OP_MEM:
|
||||
op->dst = r_anal_value_new ();
|
||||
op->dst->delta = INSOP(0).mem.disp;
|
||||
break;
|
||||
case X86_OP_REG:
|
||||
op->src[0] = r_anal_value_new ();
|
||||
op->src[0]->delta = INSOP(1).mem.disp;
|
||||
default:
|
||||
break;
|
||||
@ -1722,8 +1707,6 @@ static void op_fillval (RAnal *a, RAnalOp *op, csh *handle, cs_insn *insn){
|
||||
break;
|
||||
case R_ANAL_OP_TYPE_LEA:
|
||||
CREATE_SRC_DST (op);
|
||||
parse_reg_name_lea (op->src[0]->reg, &gop.handle, insn, 1);
|
||||
parse_reg_name_mov (op->dst->reg, &gop.handle, insn, 0);
|
||||
if (INSOP(1).type == X86_OP_MEM) {
|
||||
op->src[0]->delta = INSOP(1).mem.disp;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user