From fcb110080eba5838c45e81e78695dbeef09029b9 Mon Sep 17 00:00:00 2001 From: Anton Kochkov Date: Wed, 10 Feb 2021 22:29:07 +0800 Subject: [PATCH] Refactor to use API in visual mode --- librz/core/agraph.c | 41 ++++++++------------------- librz/core/cdebug.c | 33 ++++++++++++++++++++++ librz/core/cmd_seek.c | 12 ++++---- librz/core/core_private.h | 6 ++++ librz/core/panels.c | 2 +- librz/core/visual.c | 58 ++++++++++----------------------------- 6 files changed, 72 insertions(+), 80 deletions(-) diff --git a/librz/core/agraph.c b/librz/core/agraph.c index 1ba1e927e0..338df63bcc 100644 --- a/librz/core/agraph.c +++ b/librz/core/agraph.c @@ -3522,7 +3522,7 @@ static int agraph_refresh(struct agraph_refresh_data *grd) { RzAnalysisBlock *block = rz_analysis_find_most_relevant_block_in(core->analysis, addr); char *title = get_title(block ? block->addr : addr); if (!acur || strcmp(acur->title, title)) { - rz_core_cmd0(core, "sr PC"); + rz_core_seek_to_register(core, "PC", false); } free(title); g->is_instep = false; @@ -3977,41 +3977,20 @@ static void seek_to_node(RzANode *n, RzCore *core) { } static void graph_single_step_in(RzCore *core, RzAGraph *g) { - if (rz_config_get_i(core->config, "cfg.debug")) { - if (core->print->cur_enabled) { - rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur); - core->print->cur_enabled = 0; - } else { - rz_core_debug_step_one(core, 1); - rz_core_debug_regs2flags(core, 0); - } - } else { - rz_core_cmd(core, "aes", 0); - rz_core_regs2flags(core); - } + rz_core_debug_single_step_in(core); g->is_instep = true; g->need_reload_nodes = true; } static void graph_single_step_over(RzCore *core, RzAGraph *g) { - if (rz_config_get_i(core->config, "cfg.debug")) { - if (core->print->cur_enabled) { - rz_core_cmd(core, "dcr", 0); - core->print->cur_enabled = 0; - } else { - rz_core_cmd(core, "dso", 0); - rz_core_debug_regs2flags(core, 0); - } - } else { - rz_core_cmd(core, "aeso", 0); - rz_core_regs2flags(core); - } + rz_core_debug_single_step_over(core); g->is_instep = true; g->need_reload_nodes = true; } static void graph_breakpoint(RzCore *core) { - rz_core_cmd(core, "dbs $$", 0); + ut64 addr = core->print->cur_enabled ? core->offset + core->print->cur : core->offset; + rz_core_debug_breakpoint_toggle(core, addr); } static void graph_continue(RzCore *core) { @@ -4514,8 +4493,12 @@ RZ_API int rz_core_visual_graph(RzCore *core, RzAGraph *g, RzAnalysisFunction *_ rz_core_visual_toggle_hints(core); break; case '$': - rz_core_cmd(core, "dr PC=$$", 0); - rz_core_cmd(core, "sr PC", 0); + if (core->print->cur_enabled) { + rz_core_debug_reg_set(core, "PC", core->offset + core->print->cur, NULL); + } else { + rz_core_debug_reg_set(core, "PC", core->offset, NULL); + } + rz_core_seek_to_register(core, "PC", false); g->need_reload_nodes = true; break; case 'R': @@ -4545,7 +4528,7 @@ RZ_API int rz_core_visual_graph(RzCore *core, RzAGraph *g, RzAnalysisFunction *_ char buf[256]; rz_line_set_prompt("[comment]> "); if (rz_cons_fgets(buf, sizeof(buf), 0, NULL) > 0) { - rz_core_cmdf(core, "\"CC %s\"", buf); + rz_meta_set_string(core->analysis, RZ_META_TYPE_COMMENT, core->offset, buf); } g->need_reload_nodes = true; showcursor(core, false); diff --git a/librz/core/cdebug.c b/librz/core/cdebug.c index d619e9072e..8f762a4d86 100644 --- a/librz/core/cdebug.c +++ b/librz/core/cdebug.c @@ -522,6 +522,39 @@ RZ_API void rz_core_debug_ri(RzCore *core, RzReg *reg, int mode) { ht_up_free(db); } +RZ_IPI void rz_core_debug_single_step_in(RzCore *core) { + if (rz_config_get_b(core->config, "cfg.debug")) { + if (core->print->cur_enabled) { + rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur); + core->print->cur_enabled = 0; + } else { + rz_core_debug_step_one(core, 1); + rz_core_debug_regs2flags(core, 0); + } + } else { + rz_core_esil_step(core, UT64_MAX, NULL, NULL, false); + rz_core_regs2flags(core); + } +} + +RZ_IPI void rz_core_debug_single_step_over(RzCore *core) { + bool io_cache = rz_config_get_b(core->config, "io.cache"); + rz_config_set_b(core->config, "io.cache", false); + if (rz_config_get_b(core->config, "cfg.debug")) { + if (core->print->cur_enabled) { + rz_core_cmd(core, "dcr", 0); + core->print->cur_enabled = 0; + } else { + rz_core_cmd(core, "dso", 0); + rz_core_debug_regs2flags(core, 0); + } + } else { + rz_core_cmd(core, "aeso", 0); + rz_core_regs2flags(core); + } + rz_config_set_b(core->config, "io.cache", io_cache); +} + RZ_IPI void rz_core_debug_breakpoint_toggle(RzCore *core, ut64 addr) { RzBreakpointItem *bpi = rz_bp_get_at(core->dbg->bp, addr); if (bpi) { diff --git a/librz/core/cmd_seek.c b/librz/core/cmd_seek.c index e1c66b712e..f5636fb692 100644 --- a/librz/core/cmd_seek.c +++ b/librz/core/cmd_seek.c @@ -62,15 +62,15 @@ static void printPadded(RzCore *core, int pad) { free(fmt); } -static bool seek_to_register(RzCore *core, const char *input, bool is_silent) { +RZ_IPI bool rz_core_seek_to_register(RzCore *core, const char *regname, bool is_silent) { ut64 off; if (core->bin->is_debugger) { - off = rz_debug_reg_get(core->dbg, input); + off = rz_debug_reg_get(core->dbg, regname); return rz_core_seek_opt(core, off, true, !is_silent); } else { RzReg *orig = core->dbg->reg; core->dbg->reg = core->analysis->reg; - off = rz_debug_reg_get(core->dbg, input); + off = rz_debug_reg_get(core->dbg, regname); core->dbg->reg = orig; return rz_core_seek_opt(core, off, true, !is_silent); } @@ -271,7 +271,7 @@ RZ_IPI int rz_cmd_seek(void *data, const char *input) { switch (*input) { case 'r': // "sr" if (input[1] && input[2]) { - seek_to_register(core, input + 2, silent); + rz_core_seek_to_register(core, input + 2, silent); } else { eprintf("|Usage| 'sr PC' seek to program counter register\n"); } @@ -772,5 +772,5 @@ RZ_IPI RzCmdStatus rz_seek_opcode_handler(RzCore *core, int argc, const char **a } RZ_IPI RzCmdStatus rz_seek_register_handler(RzCore *core, int argc, const char **argv) { - return bool2cmdstatus(seek_to_register(core, argv[1], false)); -} \ No newline at end of file + return bool2cmdstatus(rz_core_seek_to_register(core, argv[1], false)); +} diff --git a/librz/core/core_private.h b/librz/core/core_private.h index 0efa728540..1235e755ce 100644 --- a/librz/core/core_private.h +++ b/librz/core/core_private.h @@ -13,9 +13,15 @@ RZ_IPI bool rz_core_debug_reg_set(RzCore *core, const char *regname, ut64 val, c RZ_IPI bool rz_core_debug_reg_list(RzCore *core, int type, int size, PJ *pj, int rad, const char *use_color); RZ_IPI void rz_core_debug_regs2flags(RzCore *core, int bits); RZ_IPI void rz_core_regs2flags(RzCore *core); +RZ_IPI void rz_core_debug_single_step_in(RzCore *core); +RZ_IPI void rz_core_debug_single_step_over(RzCore *core); RZ_IPI void rz_core_debug_breakpoint_toggle(RzCore *core, ut64 addr); RZ_IPI void rz_core_debug_continue(RzCore *core); /* cmd_eval.c */ RZ_IPI bool rz_core_load_theme(RzCore *core, const char *name); + +/* cmd_seek.c */ + +RZ_IPI bool rz_core_seek_to_register(RzCore *core, const char *input, bool is_silent); #endif diff --git a/librz/core/panels.c b/librz/core/panels.c index 643c8a2ebc..e2f8f7af0b 100644 --- a/librz/core/panels.c +++ b/librz/core/panels.c @@ -5485,7 +5485,7 @@ void __set_breakpoints_on_cursor(RzCore *core, RzPanel *panel) { return; } if (__check_panel_type(panel, PANEL_CMD_DISASSEMBLY)) { - rz_core_cmdf(core, "dbs 0x%08" PFMT64x, core->offset + core->print->cur); + rz_core_debug_breakpoint_toggle(core, core->offset + core->print->cur); panel->view->refresh = true; } } diff --git a/librz/core/visual.c b/librz/core/visual.c index 9e47a85664..d5066a70cb 100644 --- a/librz/core/visual.c +++ b/librz/core/visual.c @@ -776,39 +776,6 @@ RZ_API int rz_core_visual_prompt(RzCore *core) { return ret; } -static void visual_single_step_in(RzCore *core) { - if (rz_config_get_b(core->config, "cfg.debug")) { - if (core->print->cur_enabled) { - rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur); - core->print->cur_enabled = 0; - } else { - rz_core_debug_step_one(core, 1); - rz_core_debug_regs2flags(core, 0); - } - } else { - rz_core_esil_step(core, UT64_MAX, NULL, NULL, false); - rz_core_regs2flags(core); - } -} - -static void __core_visual_step_over(RzCore *core) { - bool io_cache = rz_config_get_b(core->config, "io.cache"); - rz_config_set_b(core->config, "io.cache", false); - if (rz_config_get_b(core->config, "cfg.debug")) { - if (core->print->cur_enabled) { - rz_core_cmd(core, "dcr", 0); - core->print->cur_enabled = 0; - } else { - rz_core_cmd(core, "dso", 0); - rz_core_debug_regs2flags(core, 0); - } - } else { - rz_core_cmd(core, "aeso", 0); - rz_core_regs2flags(core); - } - rz_config_set_b(core->config, "io.cache", io_cache); -} - static void visual_breakpoint(RzCore *core) { rz_core_debug_breakpoint_toggle(core, core->offset); } @@ -872,7 +839,7 @@ static int visual_nkey(RzCore *core, int ch) { if (cmd && *cmd) { ch = rz_core_cmd0(core, cmd); } else { - visual_single_step_in(core); + rz_core_debug_single_step_in(core); } break; case RZ_CONS_KEY_F8: @@ -880,7 +847,7 @@ static int visual_nkey(RzCore *core, int ch) { if (cmd && *cmd) { ch = rz_core_cmd0(core, cmd); } else { - __core_visual_step_over(core); + rz_core_debug_single_step_over(core); } break; case RZ_CONS_KEY_F9: @@ -1437,13 +1404,16 @@ repeat: } else { name[0] = 0; } - char *cmt = rz_core_cmd_strf(core, "CC.@0x%08" PFMT64x, refi->addr); - rz_str_trim(cmt); - rz_cons_printf(" %d [%s] 0x%08" PFMT64x " 0x%08" PFMT64x " %s %sref (%s) ; %s\n", - idx, cstr, refi->at, refi->addr, - rz_analysis_xrefs_type_tostring(refi->type), - xref ? "x" : "", name, cmt); - free(cmt); + + char *cmt = (char *)rz_meta_get_string(core->analysis, RZ_META_TYPE_COMMENT, refi->addr); + if (cmt) { + rz_str_trim(cmt); + rz_cons_printf(" %d [%s] 0x%08" PFMT64x " 0x%08" PFMT64x " %s %sref (%s) ; %s\n", + idx, cstr, refi->at, refi->addr, + rz_analysis_xrefs_type_tostring(refi->type), + xref ? "x" : "", name, cmt); + free(cmt); + } free(name); if (idx == skip) { free(dis); @@ -2998,7 +2968,7 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) { if (key_s && *key_s) { rz_core_cmd0(core, key_s); } else { - visual_single_step_in(core); + rz_core_debug_single_step_in(core); } break; case 'S': @@ -3006,7 +2976,7 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) { if (key_s && *key_s) { rz_core_cmd0(core, key_s); } else { - __core_visual_step_over(core); + rz_core_debug_single_step_over(core); } break; case '"':