Add dh in anal.x86-64.reg and fix some arm/x86 esil bugs

This commit is contained in:
pancake 2016-02-22 01:14:06 +01:00
parent 07ff9bb5fb
commit f7fbbc419e
5 changed files with 40 additions and 17 deletions

View File

@ -141,7 +141,7 @@ R_API int r_anal_esil_fire_interrupt(RAnalEsil *esil, int interrupt) {
return false;
i = sdb_itoa ((ut64)interrupt, t, 16);
if (!sdb_num_exists (esil->interrupts, i)) {
eprintf ("0x%08"PFMT64x" Cannot find interrupt-handler for interrupt %d\n",
eprintf ("0x%08"PFMT64x" Invalid interrupt/syscall 0x%08x\n",
esil->address, interrupt);
return false;
}
@ -1103,7 +1103,7 @@ static int esil_div(RAnalEsil *esil) {
if (src && r_anal_esil_get_parm (esil, src, &s)) {
if (dst && r_anal_esil_get_parm (esil, dst, &d)) {
if (s == 0) {
eprintf ("esil_div: Division by zero!\n");
eprintf ("0x%08"PFMT64x" esil_div: Division by zero!\n", esil->address);
esil->trap = R_ANAL_TRAP_DIVBYZERO;
esil->trap_code = 0;
} else {
@ -1112,7 +1112,7 @@ static int esil_div(RAnalEsil *esil) {
ret = 1;
}
} else {
eprintf ("esil_div: invalid parameters");
eprintf ("0x%08"PFMT64x" esil_div: invalid parameters\n", esil->address);
}
free (src);
free (dst);
@ -1134,7 +1134,7 @@ static int esil_diveq(RAnalEsil *esil) {
}
r_anal_esil_reg_write (esil, dst, d / s);
} else {
eprintf ("esil_diveq: Division by zero!\n");
// eprintf ("0x%08"PFMT64x" esil_diveq: Division by zero!\n", esil->address);
esil->trap = R_ANAL_TRAP_DIVBYZERO;
esil->trap_code = 0;
}
@ -1206,7 +1206,7 @@ static int esil_add(RAnalEsil *esil) {
ret = true;
}
} else {
eprintf ("esil_add: invalid parameters\n");
eprintf ("0x%08"PFMT64x" esil_add: invalid parameters\n", esil->address);
}
free (src);
free (dst);
@ -1256,14 +1256,14 @@ static int esil_inceq(RAnalEsil *esil) {
ut64 sd;
char *src_dst = r_anal_esil_pop (esil);
if (src_dst && (r_anal_esil_get_parm_type (esil, src_dst) == R_ANAL_ESIL_PARM_REG) && r_anal_esil_get_parm (esil, src_dst, &sd)) {
esil->old = sd;
sd++;
// inc rax
esil->old = sd++;
esil->cur = sd;
r_anal_esil_reg_write (esil, src_dst, sd);
esil->lastsz = esil_internal_sizeof_reg (esil, src_dst);
ret = true;
} else {
eprintf ("esil_inceq: invalid parameters\n");
eprintf ("0x%08"PFMT64x" esil_inceq: invalid parameters\n", esil->address);
}
free (src_dst);
return ret;
@ -1352,7 +1352,7 @@ static int esil_deceq(RAnalEsil *esil) {
esil->lastsz = esil_internal_sizeof_reg (esil, src_dst);
ret = true;
} else {
eprintf ("esil_deceq: invalid parameters\n");
eprintf ("0x%08"PFMT64x" esil_deceq: invalid parameters\n", esil->address);
}
free (src_dst);
return ret;

View File

@ -586,9 +586,13 @@ r4,r5,r6,3,sp,[*],12,sp,+=
4 * insn->detail->arm.op_count);
break;
case ARM_INS_LDM:
{
const char *comma = "";
for (i=1; i<insn->detail->arm.op_count; i++) {
r_strbuf_appendf (&op->esil, "%s,%d,+,[4],%s,=",
ARG (0), i*4, REG (i));
r_strbuf_appendf (&op->esil, "%s%s,%d,+,[4],%s,=",
comma, ARG (0), i*4, REG (i));
comma = ",";
}
}
break;
case ARM_INS_CMP:

View File

@ -1092,7 +1092,13 @@ SETL/SETNGE
op->val = 1;
if (a->decode) {
char *src = getarg (&gop, 0, 0, NULL);
esilprintf (op, "%s,++=,$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src);
if (strchr (src, '[')) {
char *dst = r_str_replace (strdup (src), "[", "=[", 1);
esilprintf (op, "1,%s,++,%s,$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src, dst);
free (dst);
} else {
esilprintf (op, "%s,++=,$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src);
}
free (src);
}
break;
@ -1103,7 +1109,8 @@ SETL/SETNGE
op->val = 1;
if (a->decode) {
char *src = getarg (&gop, 0, 0, NULL);
esilprintf (op, "%s,--=,$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src);
//esilprintf (op, "%s,--=,$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src);
esilprintf (op, "1,%s,[4],-,%s,=[4],$o,of,=,$s,sf,=,$z,zf,=,$p,pf,=", src, src);
free (src);
}
break;
@ -1209,7 +1216,15 @@ SETL/SETNGE
char *a1 = getarg (&gop, 1, 0, NULL);
char *a2 = getarg (&gop, 2, 0, NULL);
// TODO update flags & handle signedness
esilprintf (op, "%s,%s,/,%s,=", a2, a1, a0);
if (!a2 && !a1) {
// TODO: IDIV rbx not implemented. this is just a workaround
// http://www.tptp.cc/mirrors/siyobik.info/instruction/IDIV.html
// Divides (signed) the value in the AX, DX:AX, or EDX:EAX registers (dividend) by the source operand (divisor) and stores the result in the AX (AH:AL), DX:AX, or EDX:EAX registers. The source operand can be a general-purpose register or a memory location. The action of this instruction depends on the operand size (dividend/divisor), as shown in the following table:
// IDIV RBX == RDX:RAX /= RBX
esilprintf (op, "%s,%s,/=", a0, "rax");
} else {
esilprintf (op, "%s,%s,/,%s,=", a2, a1, a0);
}
free (a0);
free (a1);
free (a2);
@ -1634,18 +1649,22 @@ static int set_reg_profile(RAnal *anal) {
"gpr eax .32 80 0\n"
"gpr ax .16 80 0\n"
"gpr al .8 80 0\n"
"gpr ah .8 81 0\n"
"gpr rbx .64 40 0\n"
"gpr ebx .32 40 0\n"
"gpr bx .16 40 0\n"
"gpr bl .8 40 0\n"
"gpr bh .8 41 0\n"
"gpr rcx .64 88 0\n"
"gpr ecx .32 88 0\n"
"gpr cx .16 88 0\n"
"gpr cl .8 88 0\n"
"gpr ch .8 89 0\n"
"gpr rdx .64 96 0\n"
"gpr edx .32 96 0\n"
"gpr dx .16 96 0\n"
"gpr dl .8 96 0\n"
"gpr dh .8 97 0\n"
"gpr rsi .64 104 0\n"
"gpr esi .32 104 0\n"
"gpr si .16 104 0\n"

View File

@ -2280,7 +2280,7 @@ static int esilbreak_mem_read(RAnalEsil *esil, ut64 addr, ut8 *buf, int len) {
if (refptr) {
snprintf (cmd2, sizeof (cmd2), "axd 0x%"PFMT64x" 0x%"PFMT64x,
esil->address, addr);
eprintf ("%s\n", cmd2);
//eprintf ("%s\n", cmd2);
r_core_cmd0 (mycore, cmd2);
}
}
@ -2406,7 +2406,7 @@ R_API void r_core_anal_esil (RCore *core, const char *str) {
ut64 dst = r_reg_getv (core->anal->reg, pcname);
if (myvalid (dst) && r_io_is_valid_offset (mycore->io, dst, 0)) {
// get pc
eprintf ("0x%08"PFMT64x" UCALL 0x%08"PFMT64x"\n", cur, dst);
//eprintf ("0x%08"PFMT64x" UCALL 0x%08"PFMT64x"\n", cur, dst);
//r_core_cmdf (core, "axc 0x%08"PFMT64x" 0x%"PFMT64x, cur, dst);
r_anal_ref_add (core->anal, dst, cur, 'c');
} else {

View File

@ -1,4 +1,4 @@
/* radare - LGPL - Copyright 2009-2015 - pancake */
/* radare - LGPL - Copyright 2009-2016 - pancake */
#include <r_userconf.h>
#include <r_debug.h>