Display register numbers in a more usable format.

gdb_next_port
Tim Newsome 2017-07-27 13:45:26 -07:00
parent 73dee3ad4a
commit 46b5f913c7
2 changed files with 55 additions and 4 deletions

View File

@ -25,4 +25,6 @@ enum gdb_regno {
GDB_REGNO_COUNT GDB_REGNO_COUNT
}; };
const char *gdb_regno_name(enum gdb_regno regno);
#endif #endif

View File

@ -437,7 +437,7 @@ static int add_trigger(struct target *target, struct trigger *trigger)
continue; continue;
} }
LOG_DEBUG("Using resource %d for bp %d", i, LOG_DEBUG("Using trigger %d (type %d) for bp %d", i, type,
trigger->unique_id); trigger->unique_id);
r->trigger_unique_id[i] = trigger->unique_id; r->trigger_unique_id[i] = trigger->unique_id;
break; break;
@ -1406,7 +1406,7 @@ void riscv_set_register_on_hart(struct target *target, int hartid,
enum gdb_regno regid, uint64_t value) enum gdb_regno regid, uint64_t value)
{ {
RISCV_INFO(r); RISCV_INFO(r);
LOG_DEBUG("[%d] reg[0x%x] <- %" PRIx64, hartid, regid, value); LOG_DEBUG("[%d] %s <- %" PRIx64, hartid, gdb_regno_name(regid), value);
assert(r->set_register); assert(r->set_register);
return r->set_register(target, hartid, regid, value); return r->set_register(target, hartid, regid, value);
} }
@ -1420,7 +1420,7 @@ uint64_t riscv_get_register_on_hart(struct target *target, int hartid, enum gdb_
{ {
RISCV_INFO(r); RISCV_INFO(r);
uint64_t value = r->get_register(target, hartid, regid); uint64_t value = r->get_register(target, hartid, regid);
LOG_DEBUG("[%d] reg[0x%x] = %" PRIx64, hartid, regid, value); LOG_DEBUG("[%d] %s: %" PRIx64, hartid, gdb_regno_name(regid), value);
return value; return value;
} }
@ -1596,8 +1596,57 @@ int riscv_enumerate_triggers(struct target *target)
riscv_set_register_on_hart(target, hartid, GDB_REGNO_TSELECT, tselect); riscv_set_register_on_hart(target, hartid, GDB_REGNO_TSELECT, tselect);
LOG_DEBUG("[%d] Found %d triggers", hartid, r->trigger_count[hartid]); LOG_INFO("[%d] Found %d triggers", hartid, r->trigger_count[hartid]);
} }
return ERROR_OK; return ERROR_OK;
} }
const char *gdb_regno_name(enum gdb_regno regno)
{
static char buf[32];
switch (regno) {
case GDB_REGNO_ZERO:
return "zero";
case GDB_REGNO_S0:
return "s0";
case GDB_REGNO_S1:
return "s1";
case GDB_REGNO_PC:
return "pc";
case GDB_REGNO_FPR0:
return "fpr0";
case GDB_REGNO_FPR31:
return "fpr31";
case GDB_REGNO_CSR0:
return "csr0";
case GDB_REGNO_TSELECT:
return "tselect";
case GDB_REGNO_TDATA1:
return "tdata1";
case GDB_REGNO_TDATA2:
return "tdata2";
case GDB_REGNO_MISA:
return "misa";
case GDB_REGNO_DPC:
return "dpc";
case GDB_REGNO_DCSR:
return "dcsr";
case GDB_REGNO_DSCRATCH:
return "dscratch";
case GDB_REGNO_MSTATUS:
return "mstatus";
case GDB_REGNO_PRIV:
return "priv";
default:
if (regno <= GDB_REGNO_XPR31) {
sprintf(buf, "x%d", regno - GDB_REGNO_XPR0);
} else if (regno >= GDB_REGNO_CSR0 && regno <= GDB_REGNO_CSR4095) {
sprintf(buf, "csr%d", regno - GDB_REGNO_CSR0);
} else {
sprintf(buf, "gdb_regno_%d", regno);
}
return buf;
}
}