diff options
author | trimill <trimill@trimillxyz.org> | 2024-02-03 21:40:17 -0500 |
---|---|---|
committer | trimill <trimill@trimillxyz.org> | 2024-02-03 21:40:55 -0500 |
commit | 22df3f473c00946e5c814de7e274ad72cc7b4910 (patch) | |
tree | 38996116308a4a7d131312932617d5953f265aa4 /src/arch/amd64/cpu/idt.c | |
parent | spacing (diff) | |
download | corn-22df3f473c00946e5c814de7e274ad72cc7b4910.tar.gz corn-22df3f473c00946e5c814de7e274ad72cc7b4910.tar.bz2 corn-22df3f473c00946e5c814de7e274ad72cc7b4910.zip |
print registers on fatal exception
Diffstat (limited to 'src/arch/amd64/cpu/idt.c')
-rw-r--r-- | src/arch/amd64/cpu/idt.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/arch/amd64/cpu/idt.c b/src/arch/amd64/cpu/idt.c index 464bdb0..5c2ef5c 100644 --- a/src/arch/amd64/cpu/idt.c +++ b/src/arch/amd64/cpu/idt.c @@ -5,6 +5,7 @@ #include "idt.h" #include "backtrace.h" #include "debugger.h" +#include "registers.h" #include "../paging.h" #include "../bindings.h" #include "../drivers/pic.h" @@ -73,6 +74,48 @@ void idt_init(void) { __asm__ volatile ("lidt %0" : : "m"(idtr)); } +void isr_print_regs(struct isr_regs *regs) { + kprintf("rax: %#016lx (%lu)\n", regs->rax, regs->rax); + kprintf("rbx: %#016lx (%lu)\n", regs->rbx, regs->rbx); + kprintf("rcx: %#016lx (%lu)\n", regs->rcx, regs->rcx); + kprintf("rdx: %#016lx (%lu)\n", regs->rdx, regs->rdx); + kprintf("rsi: %#016lx (%lu)\n", regs->rsi, regs->rsi); + kprintf("rdi: %#016lx (%lu)\n", regs->rdi, regs->rdi); + kprintf("rsp: %#016lx (%lu)\n", regs->rsp, regs->rsp); + kprintf("rbp: %#016lx (%lu)\n", regs->rbp, regs->rbp); + kprintf("r8 : %#016lx (%lu)\n", regs->r8 , regs->r8 ); + kprintf("r9 : %#016lx (%lu)\n", regs->r9 , regs->r9 ); + kprintf("r10: %#016lx (%lu)\n", regs->r10, regs->r10); + kprintf("r11: %#016lx (%lu)\n", regs->r11, regs->r11); + kprintf("r12: %#016lx (%lu)\n", regs->r12, regs->r12); + kprintf("r13: %#016lx (%lu)\n", regs->r13, regs->r13); + kprintf("r14: %#016lx (%lu)\n", regs->r14, regs->r14); + kprintf("r15: %#016lx (%lu)\n", regs->r15, regs->r15); + kprintf("rip: %#016lx (%lu)\n", regs->rip, regs->rip); + kprintf("rflags: %#016lx (%lu)\n", regs->rflags, regs->rflags); + struct rflags *rflags = (struct rflags *)regs->rflags; + kputs("rflags: "); + if (rflags->cf) kputs("CF "); + if (rflags->pf) kputs("PF "); + if (rflags->af) kputs("AF "); + if (rflags->zf) kputs("ZF "); + if (rflags->sf) kputs("SF "); + if (rflags->tf) kputs("TF "); + if (rflags->if_) kputs("IF "); + if (rflags->df) kputs("DF "); + if (rflags->of) kputs("OF "); + if (rflags->iopl) kputs("IOPL "); + if (rflags->nt) kputs("NT "); + if (rflags->md) kputs("MD "); + if (rflags->rf) kputs("RF "); + if (rflags->vm) kputs("VM "); + if (rflags->ac) kputs("AC "); + if (rflags->vif) kputs("VIF "); + if (rflags->vip) kputs("VIP "); + if (rflags->id) kputs("ID "); + kputs("\n"); +} + #define EX_DEBUG 0x01 #define EX_BREAKPOINT 0x03 #define EX_PAGE_FAULT 0x0e @@ -139,6 +182,10 @@ void idt_exception_handler(uint64_t exception, uint64_t code, struct isr_regs *s } kputs("\n"); + + isr_print_regs(state); + + kputs("\n"); log_backtrace_ex((void *)state->rip, (void *)state->rbp); |