mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:04:57 +00:00
Kernel: Print panic backtrace to both the screen and serial
Previously it would only print the backtrace to serial, which would be inaccessible if you don't have serial setup.
This commit is contained in:
parent
7c617394a1
commit
cbbbc38f27
3 changed files with 22 additions and 9 deletions
|
@ -100,8 +100,16 @@ UNMAP_AFTER_INIT static void load_kernel_symbols_from_data(ReadonlyBytes const&
|
|||
g_kernel_symbols_available = true;
|
||||
}
|
||||
|
||||
NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksyms)
|
||||
NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksyms, PrintToScreen print_to_screen)
|
||||
{
|
||||
#define PRINT_LINE(fmtstr, ...) \
|
||||
do { \
|
||||
if (print_to_screen == PrintToScreen::No) \
|
||||
dbgln(fmtstr, __VA_ARGS__); \
|
||||
else \
|
||||
critical_dmesgln(fmtstr, __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
SmapDisabler disabler;
|
||||
if (use_ksyms && !g_kernel_symbols_available) {
|
||||
Processor::halt();
|
||||
|
@ -133,7 +141,7 @@ NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksym
|
|||
FlatPtr* stack_ptr = (FlatPtr*)base_pointer;
|
||||
while (stack_ptr && safe_memcpy(copied_stack_ptr, stack_ptr, sizeof(copied_stack_ptr), fault_at)) {
|
||||
FlatPtr retaddr = copied_stack_ptr[1];
|
||||
dbgln("{:p} (next: {:p})", retaddr, stack_ptr ? (FlatPtr*)copied_stack_ptr[0] : 0);
|
||||
PRINT_LINE("{:p} (next: {:p})", retaddr, stack_ptr ? (FlatPtr*)copied_stack_ptr[0] : 0);
|
||||
stack_ptr = (FlatPtr*)copied_stack_ptr[0];
|
||||
}
|
||||
return;
|
||||
|
@ -144,18 +152,18 @@ NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksym
|
|||
if (!symbol.address)
|
||||
break;
|
||||
if (!symbol.symbol) {
|
||||
dbgln("Kernel + {:p}", symbol.address - kernel_load_base);
|
||||
PRINT_LINE("Kernel + {:p}", symbol.address - kernel_load_base);
|
||||
continue;
|
||||
}
|
||||
size_t offset = symbol.address - symbol.symbol->address;
|
||||
if (symbol.symbol->address == g_highest_kernel_symbol_address && offset > 4096)
|
||||
dbgln("Kernel + {:p}", symbol.address - kernel_load_base);
|
||||
PRINT_LINE("Kernel + {:p}", symbol.address - kernel_load_base);
|
||||
else
|
||||
dbgln("Kernel + {:p} {} +{:#x}", symbol.address - kernel_load_base, symbol.symbol->name, offset);
|
||||
PRINT_LINE("Kernel + {:p} {} +{:#x}", symbol.address - kernel_load_base, symbol.symbol->name, offset);
|
||||
}
|
||||
}
|
||||
|
||||
void dump_backtrace()
|
||||
void dump_backtrace(PrintToScreen print_to_screen)
|
||||
{
|
||||
static bool in_dump_backtrace = false;
|
||||
if (in_dump_backtrace)
|
||||
|
@ -165,7 +173,7 @@ void dump_backtrace()
|
|||
FlatPtr ebp;
|
||||
asm volatile("movl %%ebp, %%eax"
|
||||
: "=a"(ebp));
|
||||
dump_backtrace_impl(ebp, g_kernel_symbols_available);
|
||||
dump_backtrace_impl(ebp, g_kernel_symbols_available, print_to_screen);
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT void load_kernel_symbol_table()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue