diff --git a/libr/core/cmd_anal.c b/libr/core/cmd_anal.c index 50b3a5a9f3..03fca6f432 100644 --- a/libr/core/cmd_anal.c +++ b/libr/core/cmd_anal.c @@ -4658,8 +4658,11 @@ void cmd_anal_reg(RCore *core, const char *str) { r_core_cmd_help (core, help_msg); } break; default: - r_cons_printf ("%d\n", r_list_length ( - core->dbg->reg->regset[0].pool)); + { + void *p = core->dbg->reg->regset[0].pool; + int len = p? r_list_length (p): 0; + r_cons_printf ("%d\n", len); + } break; } break; diff --git a/libr/core/cmd_debug.c b/libr/core/cmd_debug.c index 1bd98ee31b..881d763a6f 100644 --- a/libr/core/cmd_debug.c +++ b/libr/core/cmd_debug.c @@ -600,6 +600,9 @@ static int showreg(RCore *core, const char *str) { if (role != -1) { rname = r_reg_get_name (core->dbg->reg, role); } + if (!rname) { + return 0; + } r = r_reg_get (core->dbg->reg, rname , -1); if (r) { ut64 off; @@ -2014,6 +2017,10 @@ static void show_drpi(RCore *core) { const char *nmi = r_reg_get_type (i); r_cons_printf ("regset %d (%s)\n", i, nmi); RRegSet *rs = &core->anal->reg->regset[i]; + if (!rs || !rs->arena) { + r_cons_printf ("* arena %s no\n", r_reg_get_type (i)); + continue; + } r_cons_printf ("* arena %s size %d\n", r_reg_get_type (i), rs->arena->size); r_list_foreach (rs->regs, iter, ri) { const char *tpe = r_reg_get_type (ri->type); @@ -2099,7 +2106,9 @@ static void cmd_reg_profile(RCore *core, char from, const char *str) { // "arp" RRegSet *rs = r_reg_regset_get (core->dbg->reg, R_REG_TYPE_GPR); if (rs) { r_cons_printf ("%d\n", rs->arena->size); - } else eprintf ("Cannot find GPR register arena.\n"); + } else { + eprintf ("Cannot find GPR register arena.\n"); + } } break; case 'j': // "drpj" "arpj" diff --git a/libr/include/r_reg.h b/libr/include/r_reg.h index 7a85fc9575..d1a56b8e42 100644 --- a/libr/include/r_reg.h +++ b/libr/include/r_reg.h @@ -142,6 +142,7 @@ typedef struct r_reg_flags_t { R_API void r_reg_free(RReg *reg); R_API void r_reg_free_internal(RReg *reg, bool init); R_API RReg *r_reg_new(void); +R_API RReg *r_reg_init(RReg *reg); R_API bool r_reg_set_name(RReg *reg, int role, const char *name); R_API bool r_reg_set_profile_string(RReg *reg, const char *profile); R_API char* r_reg_profile_to_cc(RReg *reg); diff --git a/libr/reg/profile.c b/libr/reg/profile.c index 6a9ef65afd..e13b967cab 100644 --- a/libr/reg/profile.c +++ b/libr/reg/profile.c @@ -136,6 +136,8 @@ R_API bool r_reg_set_profile_string(RReg *reg, const char *str) { // Same profile, no need to change if (reg->reg_profile_str && !strcmp (reg->reg_profile_str, str)) { + // r_reg_free_internal (reg, false); + // r_reg_init (reg); return true; } @@ -150,6 +152,7 @@ R_API bool r_reg_set_profile_string(RReg *reg, const char *str) { // Line number l = 0; + bool have_a0 = false; // For every line do { // Increment line number @@ -206,6 +209,9 @@ R_API bool r_reg_set_profile_string(RReg *reg, const char *str) { const char *r = (*first == '=') ? parse_alias (reg, tok, j) : parse_def (reg, tok, j); + if (!strncmp (first, "=A0", 3)) { + have_a0 = true; + } // Clean up for (i = 0; i < j; i++) { free (tok[i]); @@ -217,10 +223,16 @@ R_API bool r_reg_set_profile_string(RReg *reg, const char *str) { //eprintf ("(%s)\n", str); // Clean up r_reg_free_internal (reg, false); + r_reg_init (reg); return false; } } } while (*p++); + if (!have_a0) { + eprintf ("Warning: =A0 not defined\n"); + //r_reg_free_internal (reg, false); + ///return false; + } reg->size = 0; for (i = 0; i < R_REG_TYPE_LAST; i++) { RRegSet *rs = ®->regset[i]; @@ -244,12 +256,11 @@ R_API bool r_reg_set_profile_string(RReg *reg, const char *str) { R_API bool r_reg_set_profile(RReg *reg, const char *profile) { r_return_val_if_fail (reg && profile, NULL); - char *base, *file; char *str = r_file_slurp (profile, NULL); if (!str) { - base = r_sys_getenv (R_LIB_ENV); + char *base = r_sys_getenv (R_LIB_ENV); if (base) { - file = r_str_append (base, profile); + char *file = r_str_append (base, profile); str = r_file_slurp (file, NULL); free (file); } diff --git a/libr/reg/reg.c b/libr/reg/reg.c index ff47c829a4..733c536faa 100644 --- a/libr/reg/reg.c +++ b/libr/reg/reg.c @@ -251,13 +251,10 @@ R_API void r_reg_free(RReg *reg) { } } -R_API RReg *r_reg_new(void) { +R_API RReg *r_reg_init(RReg *reg) { + r_return_val_if_fail (reg, NULL); RRegArena *arena; - RReg *reg = R_NEW0 (RReg); - int i; - if (!reg) { - return NULL; - } + size_t i; for (i = 0; i < R_REG_TYPE_LAST; i++) { arena = r_reg_arena_new (0); if (!arena) { @@ -276,6 +273,10 @@ R_API RReg *r_reg_new(void) { return reg; } +R_API RReg *r_reg_new(void) { + return r_reg_init (R_NEW0 (RReg)); +} + R_API bool r_reg_is_readonly(RReg *reg, RRegItem *item) { const char *name; RListIter *iter; @@ -349,7 +350,7 @@ R_API RList *r_reg_get_list(RReg *reg, int type) { } regs = reg->regset[type].regs; - if (r_list_length (regs) == 0) { + if (regs && r_list_length (regs) == 0) { mask = ((int)1 << type); for (i = 0; i < R_REG_TYPE_LAST; i++) { if (reg->regset[i].maskregstype & mask) { diff --git a/test/db/cmd/cmd_arp b/test/db/cmd/cmd_arp index d1b9fa50ec..15b0d83059 100644 --- a/test/db/cmd/cmd_arp +++ b/test/db/cmd/cmd_arp @@ -15,3 +15,288 @@ EXPECT=<name) +0 PC rip +1 SP rsp +2 SR (null) +3 BP rbp +4 LR (null) +5 A0 rdi +6 A1 rsi +7 A2 rdx +8 A3 rcx +9 A4 r8 +10 A5 r9 +11 A6 r10 +12 A7 r11 +13 A8 (null) +14 A9 (null) +15 R0 (null) +16 R1 (null) +17 R2 (null) +18 R3 (null) +19 ZF (null) +20 SF (null) +21 CF (null) +22 OF (null) +23 SN rax +regset 0 (gpr) +* arena gpr size 160 + rax gpr @ gpr (offset: 80 size: 8) + eax gpr @ gpr (offset: 80 size: 4) + ax gpr @ gpr (offset: 80 size: 2) + al gpr @ gpr (offset: 80 size: 1) + ah gpr @ gpr (offset: 81 size: 1) + rbx gpr @ gpr (offset: 40 size: 8) + ebx gpr @ gpr (offset: 40 size: 4) + bx gpr @ gpr (offset: 40 size: 2) + bl gpr @ gpr (offset: 40 size: 1) + bh gpr @ gpr (offset: 41 size: 1) + rcx gpr @ gpr (offset: 88 size: 8) + ecx gpr @ gpr (offset: 88 size: 4) + cx gpr @ gpr (offset: 88 size: 2) + cl gpr @ gpr (offset: 88 size: 1) + ch gpr @ gpr (offset: 89 size: 1) + rdx gpr @ gpr (offset: 96 size: 8) + edx gpr @ gpr (offset: 96 size: 4) + dx gpr @ gpr (offset: 96 size: 2) + dl gpr @ gpr (offset: 96 size: 1) + dh gpr @ gpr (offset: 97 size: 1) + rsi gpr @ gpr (offset: 104 size: 8) + esi gpr @ gpr (offset: 104 size: 4) + si gpr @ gpr (offset: 104 size: 2) + sil gpr @ gpr (offset: 104 size: 1) + rdi gpr @ gpr (offset: 112 size: 8) + edi gpr @ gpr (offset: 112 size: 4) + di gpr @ gpr (offset: 112 size: 2) + dil gpr @ gpr (offset: 112 size: 1) + r8 gpr @ gpr (offset: 72 size: 8) + r8d gpr @ gpr (offset: 72 size: 4) + r8w gpr @ gpr (offset: 72 size: 2) + r8b gpr @ gpr (offset: 72 size: 1) + r9 gpr @ gpr (offset: 64 size: 8) + r9d gpr @ gpr (offset: 64 size: 4) + r9w gpr @ gpr (offset: 64 size: 2) + r9b gpr @ gpr (offset: 64 size: 1) + r10 gpr @ gpr (offset: 56 size: 8) + r10d gpr @ gpr (offset: 56 size: 4) + r10w gpr @ gpr (offset: 56 size: 2) + r10b gpr @ gpr (offset: 56 size: 1) + r11 gpr @ gpr (offset: 48 size: 8) + r11d gpr @ gpr (offset: 48 size: 4) + r11w gpr @ gpr (offset: 48 size: 2) + r11b gpr @ gpr (offset: 48 size: 1) + r12 gpr @ gpr (offset: 24 size: 8) + r12d gpr @ gpr (offset: 24 size: 4) + r12w gpr @ gpr (offset: 24 size: 2) + r12b gpr @ gpr (offset: 24 size: 1) + r13 gpr @ gpr (offset: 16 size: 8) + r13d gpr @ gpr (offset: 16 size: 4) + r13w gpr @ gpr (offset: 16 size: 2) + r13b gpr @ gpr (offset: 16 size: 1) + r14 gpr @ gpr (offset: 8 size: 8) + r14d gpr @ gpr (offset: 8 size: 4) + r14w gpr @ gpr (offset: 8 size: 2) + r14b gpr @ gpr (offset: 8 size: 1) + r15 gpr @ gpr (offset: 0 size: 8) + r15d gpr @ gpr (offset: 0 size: 4) + r15w gpr @ gpr (offset: 0 size: 2) + r15b gpr @ gpr (offset: 0 size: 1) + rip gpr @ gpr (offset: 128 size: 8) + rbp gpr @ gpr (offset: 32 size: 8) + ebp gpr @ gpr (offset: 32 size: 4) + bp gpr @ gpr (offset: 32 size: 2) + bpl gpr @ gpr (offset: 32 size: 1) + rflags flg @ gpr (offset: 144 size: 8) + eflags flg @ gpr (offset: 144 size: 4) + cf flg @ gpr (offset: 144 size: 0) + pf flg @ gpr (offset: 144 size: 0) + af flg @ gpr (offset: 144 size: 0) + zf flg @ gpr (offset: 144 size: 0) + sf flg @ gpr (offset: 144 size: 0) + tf flg @ gpr (offset: 145 size: 0) + if flg @ gpr (offset: 145 size: 0) + df flg @ gpr (offset: 145 size: 0) + of flg @ gpr (offset: 145 size: 0) + rsp gpr @ gpr (offset: 152 size: 8) + esp gpr @ gpr (offset: 152 size: 4) + sp gpr @ gpr (offset: 152 size: 2) + spl gpr @ gpr (offset: 152 size: 1) +regset 1 (drx) +* arena drx size 64 + dr0 drx @ drx (offset: 0 size: 8) + dr1 drx @ drx (offset: 8 size: 8) + dr2 drx @ drx (offset: 16 size: 8) + dr3 drx @ drx (offset: 24 size: 8) + dr6 drx @ drx (offset: 48 size: 8) + dr7 drx @ drx (offset: 56 size: 8) +regset 2 (fpu) +* arena fpu size 296 + cwd fpu @ fpu (offset: 0 size: 2) + swd fpu @ fpu (offset: 2 size: 2) + ftw fpu @ fpu (offset: 4 size: 2) + fop fpu @ fpu (offset: 6 size: 2) + frip fpu @ fpu (offset: 8 size: 8) + frdp fpu @ fpu (offset: 16 size: 8) + mxcsr fpu @ fpu (offset: 24 size: 4) + mxcr_mask fpu @ fpu (offset: 28 size: 4) + st0 fpu @ fpu (offset: 32 size: 8) + st1 fpu @ fpu (offset: 48 size: 8) + st2 fpu @ fpu (offset: 64 size: 8) + st3 fpu @ fpu (offset: 80 size: 8) + st4 fpu @ fpu (offset: 96 size: 8) + st5 fpu @ fpu (offset: 112 size: 8) + st6 fpu @ fpu (offset: 128 size: 8) + st7 fpu @ fpu (offset: 144 size: 8) + xmm0 xmm @ fpu (offset: 160 size: 16) + xmm0h fpu @ fpu (offset: 160 size: 8) + xmm0l fpu @ fpu (offset: 168 size: 8) + xmm1 xmm @ fpu (offset: 176 size: 16) + xmm1h fpu @ fpu (offset: 176 size: 8) + xmm1l fpu @ fpu (offset: 184 size: 8) + xmm2 xmm @ fpu (offset: 192 size: 16) + xmm2h fpu @ fpu (offset: 192 size: 8) + xmm2l fpu @ fpu (offset: 200 size: 8) + xmm3 xmm @ fpu (offset: 208 size: 16) + xmm3h fpu @ fpu (offset: 208 size: 8) + xmm3l fpu @ fpu (offset: 216 size: 8) + xmm4 xmm @ fpu (offset: 224 size: 16) + xmm4h fpu @ fpu (offset: 224 size: 8) + xmm4l fpu @ fpu (offset: 232 size: 8) + xmm5 xmm @ fpu (offset: 240 size: 16) + xmm5h fpu @ fpu (offset: 240 size: 8) + xmm5l fpu @ fpu (offset: 248 size: 8) + xmm6 xmm @ fpu (offset: 256 size: 16) + xmm6h fpu @ fpu (offset: 256 size: 8) + xmm6l fpu @ fpu (offset: 264 size: 8) + xmm7 xmm @ fpu (offset: 272 size: 16) + xmm7h fpu @ fpu (offset: 272 size: 8) + xmm7l fpu @ fpu (offset: 280 size: 8) + x64 fpu @ fpu (offset: 288 size: 8) +regset 3 (mmx) +* arena mmx size 1 +regset 4 (xmm) +* arena xmm size 1 +regset 5 (ymm) +* arena ymm size 1 +regset 6 (flg) +* arena flg size 1 +regset 7 (seg) +* arena seg size 216 + cs seg @ seg (offset: 136 size: 8) + ss seg @ seg (offset: 160 size: 8) + fs_base seg @ seg (offset: 168 size: 8) + gs_base seg @ seg (offset: 176 size: 8) + ds seg @ seg (offset: 184 size: 8) + es seg @ seg (offset: 192 size: 8) + fs seg @ seg (offset: 200 size: 8) + gs seg @ seg (offset: 208 size: 8) +EOF +RUN + + +NAME=bad regprofile +FILE=- +CMDS=<