diff --git a/src/debug/panic.c b/src/debug/panic.c index 53a50a8..fce9bbe 100644 --- a/src/debug/panic.c +++ b/src/debug/panic.c @@ -3,6 +3,8 @@ #include "io/serial/serial.h" #include "kernel.h" +extern struct init_status init; + void panic(struct cpu_status_t* ctx, const char* str) { CLEAR_INTERRUPTS; @@ -15,6 +17,13 @@ void panic(struct cpu_status_t* ctx, const char* str) skputc('\r'); skputc('\n'); DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); + + if (init.terminal) + { + printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m Something went horribly wrong! (no cpu ctx)"); + printf("\r\n%s\r\n\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m", str); + } + hcf(); } DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rHalting...", @@ -22,6 +31,17 @@ void panic(struct cpu_status_t* ctx, const char* str) str, ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi, ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags); + + if (init.terminal) + { + printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\r\nSomething went horribly wrong! (%s) vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rHalting...", + ctx->iret_rip, + str, + ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi, + ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags); + } + debug_stack_trace(100); + hcf(); } \ No newline at end of file diff --git a/src/debug/stacktrace.c b/src/debug/stacktrace.c index af7af65..d71ca3e 100644 --- a/src/debug/stacktrace.c +++ b/src/debug/stacktrace.c @@ -1,9 +1,15 @@ #include #include "kernel.h" +extern struct init_status init; + void debug_stack_trace(unsigned int max_frames) { DEBUG("*** begin stack trace ***"); + if (init.terminal) + { + printf("\r\n*** begin stack trace ***\r\n"); + } // Thanks GCC :) uintptr_t* rbp = (uintptr_t*)__builtin_frame_address(0); @@ -15,6 +21,11 @@ void debug_stack_trace(unsigned int max_frames) const char* name = debug_find_symbol(rip, &offset); DEBUG("[%u] <0x%p> (%s+0x%x)", frame, (void*)rip, name, offset); + if (init.terminal) + { + printf("[%u] <0x%p> (%s+0x%x)\r\n", frame, (void*)rip, name, offset); + } + uintptr_t* next_rbp = (uintptr_t*)rbp[0]; // invalid rbp or we're at the end @@ -25,6 +36,10 @@ void debug_stack_trace(unsigned int max_frames) rbp = next_rbp; } + if (init.terminal) + { + printf("*** end stack trace ***"); + } DEBUG("*** end stack trace ***"); } diff --git a/src/kmain.c b/src/kmain.c index 5c38aa3..920639d 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -57,6 +57,7 @@ bool iran = false; // Never gets executed although pedicel is scheduled? void pedicel_main(void* arg) { + //panic(NULL, "test"); bool iran = true; // FROM THE NEXT LINE ONWARDS, CANNOT WRITE TO FRAMEBUFFER WITHOUT PAGE FAULT! //printf("\n\nWelcome to PepperOS! Pedicel speaking.\nNothing left to do, halting the system!");