Skip to content

Commit c86e803

Browse files
committed
more fixes
1 parent 8057a80 commit c86e803

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

libr/esil/esil_ops.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
#define OT_FLAG R_ESIL_OP_TYPE_FLAG
2424
#define OT_TRAP R_ESIL_OP_TYPE_TRAP
2525

26+
static ut64 reg_getv(REsil *esil, const char* name) {
27+
ut64 v = UT64_MAX;
28+
if (r_esil_reg_read (esil, name, &v, NULL)) {
29+
return v;
30+
}
31+
return UT64_MAX;
32+
}
33+
2634
R_IPI bool alignCheck(REsil *esil, ut64 addr);
2735

2836
/// XXX R2_600 - must be internal imho
@@ -125,13 +133,22 @@ static bool popRN(REsil *esil, ut64 *n) {
125133
}
126134

127135
static ut8 esil_internal_sizeof_reg(REsil *esil, const char *r) {
136+
#if 0
128137
R_RETURN_VAL_IF_FAIL (esil && esil->anal && esil->anal->reg && r, 0);
129138
RRegItem *ri = r_reg_get (esil->anal->reg, r, -1);
130139
if (ri) {
131140
ut8 reg_size = ri->size; // why a reg size cant be > 256 bits?
132141
r_unref (ri);
133142
return reg_size;
134143
}
144+
#else
145+
R_RETURN_VAL_IF_FAIL (esil && r, 0);
146+
ut32 size = 0;
147+
ut64 val = 0; // XXX esil_reg_read cant take val as null
148+
if (r_esil_reg_read (esil, r, &val, &size)) {
149+
return size;
150+
}
151+
#endif
135152
return 0;
136153
}
137154

@@ -334,7 +351,7 @@ static bool esil_js(REsil *esil) {
334351
}
335352

336353
static bool esil_weak_eq(REsil *esil) {
337-
R_RETURN_VAL_IF_FAIL (esil && esil->anal, false);
354+
R_RETURN_VAL_IF_FAIL (esil, false);
338355
char *dst = r_esil_pop (esil);
339356
char *src = r_esil_pop (esil);
340357

@@ -371,6 +388,7 @@ static bool esil_eq(REsil *esil) {
371388
}
372389
bool is128reg = false;
373390
bool ispacked = false;
391+
#if 0
374392
RRegItem *ri = r_reg_get (esil->anal->reg, dst, -1);
375393
if (ri) {
376394
is128reg = ri->size == 128;
@@ -379,6 +397,9 @@ static bool esil_eq(REsil *esil) {
379397
} else {
380398
R_LOG_DEBUG ("esil_eq: %s is not a register", dst);
381399
}
400+
#else
401+
// TODO: r_esil_reg can get regsize, but not the packed size
402+
#endif
382403
if (is128reg && esil->stackptr > 0) {
383404
char *src2 = r_esil_pop (esil); // pop the higher 64bit value
384405
ut64 n0 = r_num_get (NULL, src);
@@ -1543,6 +1564,8 @@ static bool esil_deceq(REsil *esil) {
15431564

15441565
/* POKE */
15451566
static bool esil_poke_n(REsil *esil, int bits) {
1567+
R_RETURN_VAL_IF_FAIL (esil, false);
1568+
const bool be = (esil->anal)? R_ARCH_CONFIG_IS_BIG_ENDIAN (esil->anal->config): false;
15461569
ut64 bitmask = r_num_genmask (bits - 1);
15471570
ut64 num, addr;
15481571
ut8 b[8] = {0};
@@ -1566,9 +1589,9 @@ static bool esil_poke_n(REsil *esil, int bits) {
15661589
size_t last = strlen (reg);
15671590
reg[last + 1] = 0;
15681591
reg[last] = 'l';
1569-
ut64 loow = r_reg_getv (esil->anal->reg, reg);
1592+
ut64 loow = reg_getv (esil, reg); // r_reg_getv (esil->anal->reg, reg);
15701593
reg[last] = 'h';
1571-
ut64 high = r_reg_getv (esil->anal->reg, reg);
1594+
ut64 high = reg_getv (esil, reg); // r_reg_getv (esil->anal->reg, reg);
15721595
ret = r_esil_mem_write (esil, addr, (const ut8*)&loow, 8);
15731596
ret = r_esil_mem_write (esil, addr + 8, (const ut8*)&high, 8);
15741597
#if 0
@@ -1592,12 +1615,12 @@ static bool esil_poke_n(REsil *esil, int bits) {
15921615
esil->cb.hook_mem_read = NULL;
15931616
r_esil_mem_read (esil, addr, b, bytes);
15941617
esil->cb.hook_mem_read = oldhook;
1595-
n = r_read_ble64 (b, R_ARCH_CONFIG_IS_BIG_ENDIAN (esil->anal->config));
1618+
n = r_read_ble64 (b, be);
15961619
esil->old = n;
15971620
esil->cur = num;
15981621
esil->lastsz = bits;
15991622
num = num & bitmask;
1600-
r_write_ble (b, num, R_ARCH_CONFIG_IS_BIG_ENDIAN (esil->anal->config), bits);
1623+
r_write_ble (b, num, be, bits);
16011624
ret = r_esil_mem_write (esil, addr, b, bytes);
16021625
}
16031626
}
@@ -1683,7 +1706,7 @@ static bool esil_peek_n(REsil *esil, int bits) {
16831706
if (bits & 7) {
16841707
return false;
16851708
}
1686-
bool be = R_ARCH_CONFIG_IS_BIG_ENDIAN (esil->anal->config);
1709+
bool be = (esil->anal)? R_ARCH_CONFIG_IS_BIG_ENDIAN (esil->anal->config): false; // XXX esil cant determine endian without anal
16871710
bool ret = false;
16881711
char res[SDB_NUM_BUFSZ];
16891712
ut64 addr;

0 commit comments

Comments
 (0)