R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, const char *use_color) { int i, delta, from, to, cols, n = 0; const char *fmt, *fmt2, *kwhites; RListIter *iter; RRegItem *item; RList *head; ut64 diff; if (!dbg || !dbg->reg) return R_FALSE; if (!(dbg->reg->bits & size)) { // TODO: verify if 32bit exists, otherwise use 64 or 8? size = 32; } //if (dbg->h && dbg->h->bits & R_SYS_BITS_64) { if (dbg->bits & R_SYS_BITS_64) { fmt = "%s = 0x%08"PFMT64x"%s"; fmt2 = "%4s 0x%08"PFMT64x"%s"; cols = 3; kwhites = " "; } else { fmt = " %s = 0x%08"PFMT64x"%s"; fmt2 = " %3s 0x%08"PFMT64x"%s"; cols = 4; kwhites = " "; } if (rad=='j') dbg->printf ("{"); if (type == -1) { from = 0; to = R_REG_TYPE_LAST; } else { from = type; to = from +1; } for (i=from; i<to; i++) { head = r_reg_get_list (dbg->reg, i); if (!head) continue; r_list_foreach (head, iter, item) { ut64 value; if (type != -1) { if (type != item->type) continue; if (size != 0 && size != item->size) continue; } value = r_reg_get_value (dbg->reg, item); r_reg_arena_swap (dbg->reg, R_FALSE); diff = r_reg_get_value (dbg->reg, item); r_reg_arena_swap (dbg->reg, R_FALSE); delta = value-diff; switch (rad) { case 'j': dbg->printf ("%s\"%s\":%"PFMT64d, n?",":"", item->name, value); break; case 1: case '*': dbg->printf ("f %s 1 0x%"PFMT64x"\n", item->name, value); break; case 'd': case 2: { char *str, whites[16], content[128]; int len; strcpy (whites, kwhites); if (delta && use_color) dbg->printf (use_color); if (item->flags) { str = r_reg_get_bvalue (dbg->reg, item); len = strlen (str); strcpy (whites, " "); len = (len>9)?9:(9-len); whites[len] = 0; dbg->printf (" %s = %s%s", item->name, str, ((n+1)%cols)? whites: "\n"); free (str); } else { snprintf (content, sizeof(content), fmt2, item->name, value, ""); len = strlen (content); len -= 4; if (len>10) { len -= 10; len = (len>9)?9:(9-len); whites[len] = 0; } dbg->printf (fmt2, item->name, value, ((n+1)%cols)? whites: "\n"); } if (delta && use_color) dbg->printf (Color_RESET); } break; case 3: if (delta) { char woot[64]; snprintf (woot, sizeof (woot), " was 0x%08"PFMT64x" delta %d\n", diff, delta); dbg->printf (fmt, item->name, value, woot); } break; default: if (delta && use_color) dbg->printf (use_color); dbg->printf (fmt, item->name, value, "\n"); if (delta && use_color) dbg->printf (Color_RESET); break; } n++; } }
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, const char *use_color) { int i, delta, from, to, cols, n = 0; const char *fmt, *fmt2, *kwhites; int colwidth = 20; RListIter *iter; RRegItem *item; RList *head; RPrint *pr = NULL; ut64 diff; if (!dbg || !dbg->reg) { return false; } if (dbg->corebind.core) { pr = ((RCore*)dbg->corebind.core)->print; } if (!(dbg->reg->bits & size)) { // TODO: verify if 32bit exists, otherwise use 64 or 8? size = 32; } if (dbg->bits & R_SYS_BITS_64) { fmt = "%s = 0x%08"PFMT64x"%s"; fmt2 = "%s%4s%s 0x%08"PFMT64x"%s"; kwhites = " "; colwidth = dbg->regcols? 20: 25; cols = 3; } else { fmt = "%s = 0x%08"PFMT64x"%s"; fmt2 = "%s%4s%s 0x%08"PFMT64x"%s"; kwhites = " "; colwidth = 20; cols = 4; } if (dbg->regcols) { cols = dbg->regcols; } if (rad == 'j') dbg->cb_printf ("{"); if (type == -1) { from = 0; to = R_REG_TYPE_LAST; } else { from = type; to = from +1; } int itmidx = -1; dbg->creg = NULL; for (i = from; i < to; i++) { head = r_reg_get_list (dbg->reg, i); if (!head) continue; r_list_foreach (head, iter, item) { ut64 value; #if 0 bool is_arm = dbg->arch && strstr (dbg->arch, "arm"); /* the thumb flag in the cpsr register shouldnt forbid us to switch between arm or thumb */ /* this code must run only after a step maybe ... need some discussion, disabling for now */ if (is_arm && (rad == 1 || rad == '*') && item->size == 1) { if (!strcmp (item->name, "tf")) { bool is_thumb = r_reg_get_value (dbg->reg, item); int new_bits = is_thumb? 16: 32; if (dbg->anal->bits != new_bits) dbg->cb_printf ("e asm.bits=%d\n", new_bits); } continue; } #endif if (type != -1) { if (type != item->type) continue; if (size != 0 && size != item->size) continue; } value = r_reg_get_value (dbg->reg, item); r_reg_arena_swap (dbg->reg, false); diff = r_reg_get_value (dbg->reg, item); r_reg_arena_swap (dbg->reg, false); delta = value-diff; itmidx++; switch (rad) { case 'j': dbg->cb_printf ("%s\"%s\":%"PFMT64d, n?",":"", item->name, value); break; case '-': dbg->cb_printf ("f-%s\n", item->name); break; case 1: case '*': dbg->cb_printf ("f %s 1 0x%"PFMT64x"\n", item->name, value); break; case 'd': case 2: { int len, highlight = use_color && pr && pr->cur_enabled && itmidx == pr->cur; char *str, whites[32], content[128]; const char *a = "", *b = ""; if (highlight) { a = Color_INVERT; b = Color_INVERT_RESET; dbg->creg = item->name; } strcpy (whites, kwhites); if (delta && use_color) { dbg->cb_printf (use_color); } if (item->flags) { str = r_reg_get_bvalue (dbg->reg, item); len = 12 - strlen (str); memset (whites, ' ', sizeof (whites)); whites[len] = 0; dbg->cb_printf (" %s%s%s %s%s", a, item->name, b, str, ((n+1)%cols)? whites: "\n"); free (str); } else { snprintf (content, sizeof (content), fmt2, "", item->name, "", value, ""); len = colwidth - strlen (content); if (len < 0) len = 0; memset (whites, ' ', sizeof (whites)); whites[len] = 0; dbg->cb_printf (fmt2, a, item->name, b, value, ((n+1)%cols)? whites: "\n"); } if (highlight) { dbg->cb_printf (Color_INVERT_RESET); } if (delta && use_color) { dbg->cb_printf (Color_RESET); } } break; case 3: if (delta) { char woot[64]; snprintf (woot, sizeof (woot), " was 0x%08"PFMT64x" delta %d\n", diff, delta); dbg->cb_printf (fmt, item->name, value, woot); } break; default: if (delta && use_color) { dbg->cb_printf (use_color); dbg->cb_printf (fmt, item->name, value, Color_RESET"\n"); } else { dbg->cb_printf (fmt, item->name, value, "\n"); } break; } n++; } }