From 6a3abb0f55cc77403c19934641d380be91cd1fdd Mon Sep 17 00:00:00 2001 From: xamidev Date: Sat, 14 Mar 2026 10:13:53 +0100 Subject: [PATCH] Read RFLAGS register at panic --- src/debug/panic.c | 59 ++++++++++++++++++++++++++++++++++++++---- src/debug/stacktrace.c | 2 +- src/idt/idt.c | 7 +++++ 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/debug/panic.c b/src/debug/panic.c index d15a27d..3c2c5f2 100644 --- a/src/debug/panic.c +++ b/src/debug/panic.c @@ -11,6 +11,53 @@ extern struct init_status init; +/* + * reaf_rflags - provide easy reading of the RFLAGS register + * @rflags: RFLAGS register value + */ +void read_rflags(uint64_t rflags) +{ + DEBUG("\x1b[38;5;226m%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\x1b[38;5;231m", + CHECK_BIT(rflags, 0) ? "CF " : "", /*carry flag*/ + CHECK_BIT(rflags, 2) ? "PF " : "", /*parity flag*/ + CHECK_BIT(rflags, 4) ? "AF " : "", /*auxiliary carry flag*/ + CHECK_BIT(rflags, 6) ? "ZF " : "", /*zero flag*/ + CHECK_BIT(rflags, 7) ? "SF " : "", /*sign flag*/ + CHECK_BIT(rflags, 8) ? "TF " : "", /*trap flag*/ + CHECK_BIT(rflags, 9) ? "IF " : "", /*interrupt enable flag*/ + CHECK_BIT(rflags, 10) ? "DF " : "", /*direction flag*/ + CHECK_BIT(rflags, 11) ? "OF " : "", /*overflow flag*/ + (CHECK_BIT(rflags, 12) && CHECK_BIT(rflags, 13)) ? "IOPL3 " : "IOPL0 ", /*io privilege lvl*/ + CHECK_BIT(rflags, 14) ? "NT " : "", /*nested task*/ + CHECK_BIT(rflags, 16) ? "RF " : "", /*resume flag*/ + CHECK_BIT(rflags, 17) ? "VM " : "", /*virtual 8086 mode*/ + CHECK_BIT(rflags, 18) ? "AC " : "", /*alignment check/access control*/ + CHECK_BIT(rflags, 19) ? "VIF " : "", /*virtual interrupt flag*/ + CHECK_BIT(rflags, 20) ? "VIP " : "", /*virtual interrupt pending*/ + CHECK_BIT(rflags, 21) ? "ID " : ""); /*id flag*/ + + if (init.terminal) { + printf("\x1b[38;5;226m%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\x1b[38;5;231m\r\n", + CHECK_BIT(rflags, 0) ? "CF " : "", + CHECK_BIT(rflags, 2) ? "PF " : "", + CHECK_BIT(rflags, 4) ? "AF " : "", + CHECK_BIT(rflags, 6) ? "ZF " : "", + CHECK_BIT(rflags, 7) ? "SF " : "", + CHECK_BIT(rflags, 8) ? "TF " : "", + CHECK_BIT(rflags, 9) ? "IF " : "", + CHECK_BIT(rflags, 10) ? "DF " : "", + CHECK_BIT(rflags, 11) ? "OF " : "", + (CHECK_BIT(rflags, 12) && CHECK_BIT(rflags, 13)) ? "IOPL3 " : "IOPL0 ", + CHECK_BIT(rflags, 14) ? "NT " : "", + CHECK_BIT(rflags, 16) ? "RF " : "", + CHECK_BIT(rflags, 17) ? "VM " : "", + CHECK_BIT(rflags, 18) ? "AC " : "", + CHECK_BIT(rflags, 19) ? "VIF " : "", + CHECK_BIT(rflags, 20) ? "VIP " : "", + CHECK_BIT(rflags, 21) ? "ID " : ""); + } +} + /* * panic - Kernel panic * @ctx: CPU context (optional) @@ -30,29 +77,31 @@ void panic(struct cpu_status_t* ctx, const char* str) fctprintf((void*)&skputc, 0, "\x1b[0m"); skputc('\r'); skputc('\n'); - DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); + DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic\x1b[0m"); if (init.terminal) { printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232m Something went horribly wrong! (no cpu ctx)"); - printf("\r\n%s\r\n\x1b[38;5;231mend Kernel panic - halting...\x1b[0m", str); + printf("\r\n%s\r\n\x1b[38;5;231mend Kernel panic\x1b[0m", str); } + debug_stack_trace(100); 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...\x1b[0m", + 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\r\x1b[0m", 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); if (init.terminal) { - printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232mat 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...\x1b[0m", + printf("\r\n\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[48;5;232mat 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 ", 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); } - + + read_rflags(ctx->iret_flags); debug_stack_trace(100); hcf(); diff --git a/src/debug/stacktrace.c b/src/debug/stacktrace.c index 430bf94..3845c8c 100644 --- a/src/debug/stacktrace.c +++ b/src/debug/stacktrace.c @@ -46,7 +46,7 @@ void debug_stack_trace(unsigned int max_frames) rbp = next_rbp; } if (init.terminal) { - printf("*** end stack trace ***\x1b[0m"); + printf("*** end stack trace ***\r\nHalting system...\x1b[0m"); } DEBUG("*** end stack trace ***"); } diff --git a/src/idt/idt.c b/src/idt/idt.c index dd465e9..f70959f 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -154,6 +154,12 @@ static void gp_fault_handler(struct cpu_status_t* ctx) panic(ctx, "gp fault"); } +// DEBUG +void kbdproc_main(void* arg) +{ + printf("Key pressed/released.\r\n"); +} + /* * interrupt_dispatch - Interrupt dispatcher * @context: CPU context @@ -252,6 +258,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) case 33: // Keyboard Interrupt keyboard_handler(); + process_create("keyboard-initiated", kbdproc_main, NULL); // DEBUG outb(0x20, 0x20); break;