From 996f5ba9c4a1a02c8d2f1c1f7ae29a92bd34608f Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 17 Mar 2009 22:06:50 +0000 Subject: [PATCH] * Run callback when defining keys in config - Add asm_arch and asm_parser callbacks * Run config_init at the end of core init * Do not force disassembler to be x86-only - Add the disassembler initialization in config - Detect invalid disassembling - Only parse when asm.pseudo is enabled --- libr/config/config.c | 2 ++ libr/core/cmd.c | 15 +++++++++------ libr/core/config.c | 35 ++++++++++++++++++++++++++++++++--- libr/core/core.c | 3 ++- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/libr/config/config.c b/libr/config/config.c index a9b20240e4..07fda69067 100644 --- a/libr/config/config.c +++ b/libr/config/config.c @@ -90,6 +90,8 @@ struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name struct r_config_node_t *node; node = r_config_set(cfg, name, value); node->callback = callback; + if (node->callback) + node->callback(cfg->user, node); return node; } diff --git a/libr/core/cmd.c b/libr/core/cmd.c index 31dcb207ce..93c3ebbb60 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -340,20 +340,23 @@ static int cmd_print(void *data, const char *input) /* XXX hardcoded */ int ret, idx; u8 *buf = core->block; - u64 pseudo = r_config_get_i(&core->config, "asm.pseudo"); + int pseudo = (int)r_config_get_i(&core->config, "asm.pseudo"); char str[128]; struct r_asm_aop_t aop; - r_asm_set_pc(&core->assembler, core->seek); - r_asm_set(&core->assembler, "asm_x86"); - r_parse_set(&core->parser, "parse_x86_pseudo"); for(idx=ret=0; idx < len; idx+=ret) { r_asm_set_pc(&core->assembler, core->assembler.pc + ret); ret = r_asm_disassemble(&core->assembler, &aop, buf+idx, len-idx); - r_parse_parse(&core->parser, aop.buf_asm, str); + if (ret <1) { + ret = 1; + fprintf(stderr, "** invalid opcode at 0x%08llx **\n", core->assembler.pc + ret); + } if (show_offset) r_cons_printf("0x%08llx ", core->seek + idx); if (show_bytes) r_cons_printf("%14s ", aop.buf_hex); - r_cons_printf("%s\n", pseudo?str:aop.buf_asm); + if (pseudo) { + r_parse_parse(&core->parser, aop.buf_asm, str); + r_cons_printf("%s\n", str); + } else r_cons_printf("%s\n", aop.buf_asm); } } break; diff --git a/libr/core/config.c b/libr/core/config.c index 823217bbb7..691b641eca 100644 --- a/libr/core/config.c +++ b/libr/core/config.c @@ -2,6 +2,28 @@ #include +int config_asm_arch_callback(void *user, void *data) +{ + struct r_core_t *core = (struct r_core_t *) user; + struct r_config_node_t *node = (struct r_config_node_t *) data; + char buf[128]; + snprintf(buf, 127, "asm_%s", node->value), + r_asm_set(&core->assembler, buf); +// TODO: control error and restore old value (return false?) show errormsg? + return R_TRUE; +} + +int config_asm_parser_callback(void *user, void *data) +{ + struct r_core_t *core = (struct r_core_t *) user; + struct r_config_node_t *node = (struct r_config_node_t *) data; + char buf[128]; + snprintf(buf, 127, "parse_%s", node->value), + r_asm_set(&core->assembler, buf); +// TODO: control error and restore old value (return false?) show errormsg? + return R_TRUE; +} + int config_color_callback(void *user, void *data) { struct r_core_t *core = (struct r_core_t *) user; @@ -22,10 +44,17 @@ int r_core_config_init(struct r_core_t *core) { struct r_config_t *cfg = &core->config; r_config_init(cfg, (void *)core); - r_config_set(cfg, "asm.arch", "x86"); + + r_config_set_cb(cfg, "asm.arch", "x86", + &config_asm_arch_callback); + + r_parse_set(&core->parser, "parse_x86_pseudo"); + r_config_set_cb(cfg, "asm.parser", "x86_pseudo", + &config_asm_parser_callback); + + r_config_set(cfg, "asm.syntax", "intel"); r_config_set_i(cfg, "asm.bits", 32); - r_config_set(cfg, "asm.syntax", "x86"); - r_config_set(cfg, "asm.pseudo", "false"); + r_config_set(cfg, "asm.pseudo", "false"); // DEPRECATED ??? r_config_set(cfg, "asm.bytes", "true"); r_config_set(cfg, "asm.offset", "true"); r_config_set(cfg, "asm.os", "linux"); diff --git a/libr/core/core.c b/libr/core/core.c index f8ba4292e4..de963ac44a 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -132,6 +132,7 @@ int r_core_init(struct r_core_t *core) r_anal_init(&core->anal); r_anal_set_user_ptr(&core->anal, core); r_asm_init(&core->assembler); + r_asm_set(&core->assembler, "asm_x86"); // XXX should be done by r_asm on init? r_asm_set_user_ptr(&core->assembler, core); r_parse_init(&core->parser); r_parse_set_user_ptr(&core->parser, core); @@ -151,7 +152,6 @@ int r_core_init(struct r_core_t *core) core->blocksize = R_CORE_BLOCKSIZE; core->block = (u8*)malloc(R_CORE_BLOCKSIZE); r_core_cmd_init(core); - r_core_config_init(core); r_flag_init(&core->flags); r_debug_init(&core->dbg); r_lib_init(&core->lib, "radare_plugin"); @@ -175,6 +175,7 @@ int r_core_init(struct r_core_t *core) r_lib_opendir(&core->lib, homeplugindir); free(homeplugindir); } + r_core_config_init(core); // XXX fix path here return 0; }