1 /* radare - LGPL - Copyright 2014 - pancake */
2 
3 #include <r_anal.h>
4 
hook_flag_read(RAnalEsil * esil,const char * flag,ut64 * num)5 static int hook_flag_read(RAnalEsil *esil, const char *flag, ut64 *num) {
6 	sdb_array_add (esil->stats, "flg.read", flag, 0);
7 	return 0;
8 }
9 
hook_command(RAnalEsil * esil,const char * op)10 static int hook_command(RAnalEsil *esil, const char *op) {
11 	sdb_array_add (esil->stats, "ops.list", op, 0);
12 	return 0;
13 }
14 
hook_mem_read(RAnalEsil * esil,ut64 addr,ut8 * buf,int len)15 static int hook_mem_read(RAnalEsil *esil, ut64 addr, ut8 *buf, int len) {
16 	sdb_array_add_num (esil->stats, "mem.read", addr, 0);
17 	return 0;
18 }
19 
hook_mem_write(RAnalEsil * esil,ut64 addr,const ut8 * buf,int len)20 static int hook_mem_write(RAnalEsil *esil, ut64 addr, const ut8 *buf, int len) {
21 	sdb_array_add_num (esil->stats, "mem.write", addr, 0);
22 	return 0;
23 }
24 
hook_reg_read(RAnalEsil * esil,const char * name,ut64 * res,int * size)25 static int hook_reg_read(RAnalEsil *esil, const char *name, ut64 *res, int *size) {
26 	const char *key = (*name>='0' && *name<='9')? "num.load": "reg.read";
27 	sdb_array_add (esil->stats, key, name, 0);
28 	return 0;
29 }
30 
hook_reg_write(RAnalEsil * esil,const char * name,ut64 * val)31 static int hook_reg_write(RAnalEsil *esil, const char *name, ut64 *val) {
32 	sdb_array_add (esil->stats, "reg.write", name, 0);
33 	return 0;
34 }
35 
hook_NOP_mem_write(RAnalEsil * esil,ut64 addr,const ut8 * buf,int len)36 static int hook_NOP_mem_write(RAnalEsil *esil, ut64 addr, const ut8 *buf, int len) {
37 	eprintf ("NOP WRITE AT 0x%08"PFMT64x"\n", addr);
38 	return 1; // override
39 }
40 
r_anal_esil_mem_ro(RAnalEsil * esil,int mem_readonly)41 R_API void r_anal_esil_mem_ro(RAnalEsil *esil, int mem_readonly) {
42 	if (mem_readonly) {
43 		esil->cb.hook_mem_write = hook_NOP_mem_write;
44 	} else {
45 		esil->cb.hook_mem_write = NULL;
46 	}
47 }
48 
r_anal_esil_stats(RAnalEsil * esil,int enable)49 R_API void r_anal_esil_stats(RAnalEsil *esil, int enable) {
50 	if (enable) {
51 		if (esil->stats) {
52 			sdb_reset (esil->stats);
53 		} else {
54 			esil->stats = sdb_new0 ();
55 		}
56 		// reset sdb->stats
57 		esil->cb.hook_reg_read = hook_reg_read;
58 		esil->cb.hook_mem_read = hook_mem_read;
59 		esil->cb.hook_mem_write = hook_mem_write;
60 		esil->cb.hook_reg_write = hook_reg_write;
61 		esil->cb.hook_flag_read = hook_flag_read;
62 		esil->cb.hook_command = hook_command;
63 	} else {
64 		esil->cb.hook_mem_write = NULL;
65 		esil->cb.hook_flag_read = NULL;
66 		esil->cb.hook_command = NULL;
67 		sdb_free (esil->stats);
68 		esil->stats = NULL;
69 	}
70 }
71