aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorChristos Margiolis <christos@FreeBSD.org>2023-07-04 15:38:37 +0000
committerChristos Margiolis <christos@FreeBSD.org>2023-07-04 15:38:37 +0000
commit1c776124513c0a1976d599077e50b5a1c034dadc (patch)
tree2116e909a7380b20903515e368e2b8bd4c2d3c92 /sys
parent9310bf54049422a9bd127100f697e6cbb189d889 (diff)
downloadsrc-1c776124513c0a1976d599077e50b5a1c034dadc.tar.gz
src-1c776124513c0a1976d599077e50b5a1c034dadc.zip
riscv: improve register dumping
Search for and print kernel symbols in case a register's value is a kernel address. Also improve column alignment. Reviewed by: mhorne, jhb Approved by: markj (mentor) Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D40829
Diffstat (limited to 'sys')
-rw-r--r--sys/riscv/riscv/trap.c67
1 files changed, 50 insertions, 17 deletions
diff --git a/sys/riscv/riscv/trap.c b/sys/riscv/riscv/trap.c
index ac481c313e15..49da91235c66 100644
--- a/sys/riscv/riscv/trap.c
+++ b/sys/riscv/riscv/trap.c
@@ -35,6 +35,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_ddb.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -69,6 +71,11 @@ __FBSDID("$FreeBSD$");
#include <sys/dtrace_bsd.h>
#endif
+#ifdef DDB
+#include <ddb/ddb.h>
+#include <ddb/db_sym.h>
+#endif
+
int (*dtrace_invop_jump_addr)(struct trapframe *);
/* Called from exception.S */
@@ -128,30 +135,56 @@ cpu_fetch_syscall_args(struct thread *td)
#include "../../kern/subr_syscall.c"
static void
+print_with_symbol(const char *name, uint64_t value)
+{
+#ifdef DDB
+ c_db_sym_t sym;
+ db_expr_t sym_value;
+ db_expr_t offset;
+ const char *sym_name;
+#endif
+
+ printf("%7s: 0x%016lx", name, value);
+
+#ifdef DDB
+ if (value >= VM_MIN_KERNEL_ADDRESS) {
+ sym = db_search_symbol(value, DB_STGY_ANY, &offset);
+ if (sym != C_DB_SYM_NULL) {
+ db_symbol_values(sym, &sym_name, &sym_value);
+ printf(" (%s + 0x%lx)", sym_name, offset);
+ }
+ }
+#endif
+ printf("\n");
+}
+
+static void
dump_regs(struct trapframe *frame)
{
- int n;
+ char name[6];
int i;
- n = nitems(frame->tf_t);
- for (i = 0; i < n; i++)
- printf("t[%d] == 0x%016lx\n", i, frame->tf_t[i]);
-
- n = nitems(frame->tf_s);
- for (i = 0; i < n; i++)
- printf("s[%d] == 0x%016lx\n", i, frame->tf_s[i]);
+ for (i = 0; i < nitems(frame->tf_t); i++) {
+ snprintf(name, sizeof(name), "t[%d]", i);
+ print_with_symbol(name, frame->tf_t[i]);
+ }
- n = nitems(frame->tf_a);
- for (i = 0; i < n; i++)
- printf("a[%d] == 0x%016lx\n", i, frame->tf_a[i]);
+ for (i = 0; i < nitems(frame->tf_s); i++) {
+ snprintf(name, sizeof(name), "s[%d]", i);
+ print_with_symbol(name, frame->tf_s[i]);
+ }
- printf("ra == 0x%016lx\n", frame->tf_ra);
- printf("sp == 0x%016lx\n", frame->tf_sp);
- printf("gp == 0x%016lx\n", frame->tf_gp);
- printf("tp == 0x%016lx\n", frame->tf_tp);
+ for (i = 0; i < nitems(frame->tf_a); i++) {
+ snprintf(name, sizeof(name), "a[%d]", i);
+ print_with_symbol(name, frame->tf_a[i]);
+ }
- printf("sepc == 0x%016lx\n", frame->tf_sepc);
- printf("sstatus == 0x%016lx\n", frame->tf_sstatus);
+ print_with_symbol("ra", frame->tf_ra);
+ print_with_symbol("sp", frame->tf_sp);
+ print_with_symbol("gp", frame->tf_gp);
+ print_with_symbol("tp", frame->tf_tp);
+ print_with_symbol("sepc", frame->tf_sepc);
+ printf("sstatus: 0x%016lx\n", frame->tf_sstatus);
}
static void