diff --git a/arch/amd64/hw/exc.c b/arch/amd64/hw/exc.c index d496212..6a1d122 100644 --- a/arch/amd64/hw/exc.c +++ b/arch/amd64/hw/exc.c @@ -181,7 +181,7 @@ void amd64_exception(struct amd64_exception_frame *frame) { if (debug_symbol_find(frame->rip, &sym_name, &sym_base) == 0) { kfatal(" Backtrace:\n"); kfatal("0: %p <%s + %04x>\n", frame->rip, sym_name, frame->rip - sym_base); - debug_backtrace(frame->rbp, 1, 10); + debug_backtrace(DEBUG_FATAL, frame->rbp, 1, 10); } else { kfatal("%rip is in unknown location\n"); } diff --git a/include/sys/debug.h b/include/sys/debug.h index 346ce2e..2dcc3da 100644 --- a/include/sys/debug.h +++ b/include/sys/debug.h @@ -44,7 +44,7 @@ void debug_symbol_table_set(uintptr_t symtab, uintptr_t strtab, size_t symtab_si void debug_symbol_table_multiboot2(struct multiboot_tag_elf_sections *tag); int debug_symbol_find(uintptr_t addr, const char **name, uintptr_t *base); int debug_symbol_find_by_name(const char *name, uintptr_t *value); -void debug_backtrace(uintptr_t rbp, int depth, int limit); +void debug_backtrace(int level, uintptr_t rbp, int depth, int limit); void fmtsiz(char *buf, size_t sz); diff --git a/sys/debug.c b/sys/debug.c index 672c68b..8edce21 100644 --- a/sys/debug.c +++ b/sys/debug.c @@ -122,7 +122,7 @@ int debug_symbol_find(uintptr_t addr, const char **name, uintptr_t *base) { return -1; } -void debug_backtrace(uintptr_t rbp, int depth, int limit) { +void debug_backtrace(int level, uintptr_t rbp, int depth, int limit) { // Typical layout: // rbp + 08 == rip // rbp + 00 == rbp_1 @@ -132,7 +132,7 @@ void debug_backtrace(uintptr_t rbp, int depth, int limit) { } if ((rbp & 0xFFFFFF0000000000) != 0xFFFFFF0000000000) { - debugs(DEBUG_FATAL, "-- %rbp is not from kernel space\n"); + debugs(level, "-- %rbp is not from kernel space\n"); return; } @@ -143,17 +143,17 @@ void debug_backtrace(uintptr_t rbp, int depth, int limit) { const char *name; if (debug_symbol_find(rip, &name, &base) == 0) { - debugf(DEBUG_FATAL, "%d: %p <%s + %04x>\n", depth, rip, name, rip - base); + debugf(level, "%d: %p <%s + %04x>\n", depth, rip, name, rip - base); } else { - debugf(DEBUG_FATAL, "%d: %p (unknown)\n", depth, rip); + debugf(level, "%d: %p (unknown)\n", depth, rip); } if (rbp_next == 0) { - debugs(DEBUG_FATAL, "-- End of frame chain\n"); + debugs(level, "-- End of frame chain\n"); return; } - debug_backtrace(rbp_next, depth + 1, limit - 1); + debug_backtrace(level, rbp_next, depth + 1, limit - 1); } //// diff --git a/sys/panic.c b/sys/panic.c index c5f41b9..b9ac12a 100644 --- a/sys/panic.c +++ b/sys/panic.c @@ -26,7 +26,7 @@ void panicf(const char *fmt, ...) { va_end(args); debugs(DEBUG_FATAL, "Call trace:\n"); - debug_backtrace(rbp, 0, 10); + debug_backtrace(DEBUG_FATAL, rbp, 0, 10); debugs(DEBUG_FATAL, "\033[0,"); kfatal("--- Panic ---\n");