Skip to content

Commit b1f3b1a

Browse files
committed
Add REsilVoyeurOp type ##esil
1 parent f5dbc2f commit b1f3b1a

File tree

2 files changed

+32
-13
lines changed

2 files changed

+32
-13
lines changed

libr/esil/esil.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <float.h>
1515
#include <fenv.h>
1616

17-
#define ESIL_MACRO 0
1817
// TODO: replace esil->verbose with R_LOG_DEBUG
1918
#define IFDBG if (esil->verbose > 1)
2019

@@ -209,46 +208,48 @@ R_API REsil *r_esil_new_simple(ut32 addrsize, void *reg, void *iob) {
209208
return r_esil_new_ex (4096, false, addrsize, &simple_reg_if, &simple_mem_if);
210209
}
211210

212-
R_API st32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt) {
213-
R_RETURN_VAL_IF_FAIL (esil && vfn, -1);
211+
R_API ut32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt) {
212+
R_RETURN_VAL_IF_FAIL (esil && vfn, R_ESIL_VOYEUR_ERR);
214213
switch (vt) {
215214
case R_ESIL_VOYEUR_REG_READ:
216215
case R_ESIL_VOYEUR_REG_WRITE:
217216
case R_ESIL_VOYEUR_MEM_READ:
218217
case R_ESIL_VOYEUR_MEM_WRITE:
218+
case R_ESIL_VOYEUR_OP:
219219
break;
220220
default:
221221
r_warn_if_reached ();
222-
return -1;
222+
return R_ESIL_VOYEUR_ERR;
223223
}
224224
REsilVoyeur *voyeur = R_NEW (REsilVoyeur);
225225
if (!voyeur) {
226-
return -1;
226+
return R_ESIL_VOYEUR_ERR;
227227
}
228228
ut32 id;
229229
if (!r_id_storage_add (&esil->voyeur[vt], voyeur, &id)) {
230230
free (voyeur);
231-
return -1;
231+
return R_ESIL_VOYEUR_ERR;
232232
}
233233
voyeur->user = user;
234234
voyeur->vfn = vfn;
235-
return (st32)(id | (vt << 29));
235+
return id | (vt << VOYEUR_SHIFT_LEFT);
236236
}
237237

238-
R_API void r_esil_del_voyeur(REsil *esil, st32 vid) {
238+
R_API void r_esil_del_voyeur(REsil *esil, ut32 vid) {
239239
R_RETURN_IF_FAIL (esil);
240-
const ut32 vt = (vid & (0x7 << 29)) >> 29;
240+
const ut32 vt = (vid & VOYEUR_TYPE_MASK) >> VOYEUR_SHIFT_LEFT;
241241
switch (vt) {
242242
case R_ESIL_VOYEUR_REG_READ:
243243
case R_ESIL_VOYEUR_REG_WRITE:
244244
case R_ESIL_VOYEUR_MEM_READ:
245245
case R_ESIL_VOYEUR_MEM_WRITE:
246+
case R_ESIL_VOYEUR_OP:
246247
break;
247248
default:
248249
r_warn_if_reached ();
249250
return;
250251
}
251-
const ut32 id = vid & ~(0x7 << 29);
252+
const ut32 id = vid & ~VOYEUR_TYPE_MASK;
252253
free (r_id_storage_take (&esil->voyeur[vt], id));
253254
}
254255

@@ -3758,11 +3759,21 @@ static bool runword(REsil *esil, const char *word) {
37583759
op = r_esil_get_op (esil, word);
37593760
if (op) {
37603761
// run action
3762+
#if USE_NEW_ESIL
3763+
ut32 i;
3764+
if (r_id_storage_get_lowest (&esil->voyeur[R_ESIL_VOYEUR_OP], &i)) {
3765+
do {
3766+
REsilVoyeur *voy = r_id_storage_get (&esil->voyeur[R_ESIL_VOYEUR_OP], i);
3767+
voy->op (voy->user, word);
3768+
} while (r_id_storage_get_next (&esil->voyeur[R_ESIL_VOYEUR_OP], &i));
3769+
}
3770+
#else
37613771
if (esil->cb.hook_command) {
37623772
if (esil->cb.hook_command (esil, word)) {
37633773
return 1; // XXX cannot return != 1
37643774
}
37653775
}
3776+
#endif
37663777
esil->current_opstr = strdup (word);
37673778
// so this is basically just sharing what's the
37683779
// operation with the operation useful for wrappers

libr/include/r_esil.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ typedef void (*REsilVoyeurRegRead)(void *user, const char *name, ut64 val);
165165
typedef void (*REsilVoyeurRegWrite)(void *user, const char *name, ut64 old, ut64 val);
166166
typedef void (*REsilVoyeurMemRead)(void *user, ut64 addr, const ut8 *buf, int len);
167167
typedef void (*REsilVoyeurMemWrite)(void *user, ut64 addr, const ut8 *old, const ut8 *buf, int len);
168+
typedef void (*REsilVoyeurOp)(void *user, const char *op);
168169

169170
typedef struct r_esil_voyeur_t {
170171
void *user;
@@ -173,6 +174,7 @@ typedef struct r_esil_voyeur_t {
173174
REsilVoyeurRegWrite reg_write;
174175
REsilVoyeurMemRead mem_read;
175176
REsilVoyeurMemWrite mem_write;
177+
REsilVoyeurOp op;
176178
void *vfn;
177179
};
178180
} REsilVoyeur;
@@ -182,10 +184,16 @@ typedef enum {
182184
R_ESIL_VOYEUR_REG_WRITE,
183185
R_ESIL_VOYEUR_MEM_READ,
184186
R_ESIL_VOYEUR_MEM_WRITE,
187+
R_ESIL_VOYEUR_OP,
185188
R_ESIL_VOYEUR_LAST,
189+
R_ESIL_VOYEUR_HIGH_MASK = 0x7,
190+
R_ESIL_VOYEUR_ERR = UT32_MAX,
186191
} REsilVoyeurType;
187192

188-
#define MAX_VOYEURS (UT32_MAX ^ (0x7 << 29))
193+
#define VOYEUR_TYPE_BITS 3
194+
#define VOYEUR_SHIFT_LEFT ((sizeof (ut32) << 3) - VOYEUR_TYPE_BITS)
195+
#define VOYEUR_TYPE_MASK (R_ESIL_VOYEUR_HIGH_MASK << VOYEUR_SHIFT_LEFT)
196+
#define MAX_VOYEURS (UT32_MAX ^ VOYEUR_TYPE_MASK)
189197

190198
typedef struct r_esil_options_t {
191199
int nowrite;
@@ -292,8 +300,8 @@ R_API REsil *r_esil_new_ex(int stacksize, bool iotrap, ut32 addrsize,
292300
//this should replace existing r_esil_new
293301
R_API REsil *r_esil_new_simple(ut32 addrsize, void *reg, void *iob);
294302
//R_API REsil *r_esil_new_simple(ut32 addrsize, struct r_reg_t *reg, struct r_io_bind_t *iob);
295-
R_API st32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt);
296-
R_API void r_esil_del_voyeur(REsil *esil, st32 vid);
303+
R_API ut32 r_esil_add_voyeur(REsil *esil, void *user, void *vfn, REsilVoyeurType vt);
304+
R_API void r_esil_del_voyeur(REsil *esil, ut32 vid);
297305
R_API void r_esil_reset(REsil *esil);
298306
R_API void r_esil_set_pc(REsil *esil, ut64 addr);
299307
R_API bool r_esil_setup(REsil *esil, struct r_anal_t *anal, bool romem, bool stats, bool nonull);

0 commit comments

Comments
 (0)