From ac6addd527710fb5e6e434cdd9778f18d4db3697 Mon Sep 17 00:00:00 2001 From: Matheus Date: Fri, 9 Oct 2026 01:46:15 -0300 Subject: [PATCH] dbg: map addresses to file+function+offset Add support for mapping kernel .text addresses into file + function + offset for debugging purposes. Make the backtrace use this new feature. --- kernel-src/include/dbg.h | 8 +++++++ kernel-src/lib/dbg.c | 45 ++++++++++++++++++++++++++++++++++++++++ kernel-src/lib/panic.c | 8 ++++++- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 kernel-src/include/dbg.h create mode 100644 kernel-src/lib/dbg.c diff --git a/kernel-src/include/dbg.h b/kernel-src/include/dbg.h new file mode 100644 index 00000000..286c7976 --- /dev/null +++ b/kernel-src/include/dbg.h @@ -0,0 +1,8 @@ +#ifndef _DBG_H +#define _DBG_H + +#include + +void dbg_get_symbol(void *rip, char **fn_name, char **file_name, size_t *offset); + +#endif diff --git a/kernel-src/lib/dbg.c b/kernel-src/lib/dbg.c new file mode 100644 index 00000000..5d9a0862 --- /dev/null +++ b/kernel-src/lib/dbg.c @@ -0,0 +1,45 @@ +#include +#include +#include + +#ifdef __x86_64__ +#define LOAD_BASE (uint64_t)0xffffffff80000000 +#endif + +#define SYM_TABLE_ENTRY_SIZE 3 +extern uint32_t dbg_sym_table[]; +extern uint32_t dbg_sym_table_end[]; + +extern char dbg_fn_name_table[]; +extern char dbg_fn_name_table_end[]; + +extern char dbg_file_name_table[]; +extern char dbg_file_name_table_end[]; + +void dbg_get_symbol(void *rip, char **fn_name, char **file_name, size_t *offset) { + *fn_name = "??"; + *file_name = "??"; + *offset = 0; + + if ((uint64_t)rip < LOAD_BASE) + return; + + uint64_t rip_offset = (uint64_t)rip - LOAD_BASE; + size_t low = 0; + size_t high = (dbg_sym_table_end - dbg_sym_table) / SYM_TABLE_ENTRY_SIZE; + while (low < high) { + size_t mid = low + (high - low) / 2; + if (dbg_sym_table[mid * SYM_TABLE_ENTRY_SIZE] <= rip_offset) + low = mid + 1; + else + high = mid; + } + + if (low == 0) + return; + + uint32_t *symbol = dbg_sym_table + (low - 1) * SYM_TABLE_ENTRY_SIZE; + *fn_name = dbg_fn_name_table + symbol[1]; + *file_name = dbg_file_name_table + symbol[2]; + *offset = rip_offset - symbol[0]; +} diff --git a/kernel-src/lib/panic.c b/kernel-src/lib/panic.c index 1d56ec40..5f822515 100644 --- a/kernel-src/lib/panic.c +++ b/kernel-src/lib/panic.c @@ -4,11 +4,17 @@ #include #include #include +#include static bool paniced = false; static bool step_backtrace(void *, void *ip) { - printf("%p\n", ip); + char *fn, *file; + size_t off; + + dbg_get_symbol(ip, &fn, &file, &off); + + printf("%p: %s:%s+%x\n", ip, file, fn, off); return true; }