summaryrefslogtreecommitdiff
path: root/src/arch/amd64/cpu/idt.c
diff options
context:
space:
mode:
authortrimill <trimill@trimillxyz.org>2024-02-03 21:40:17 -0500
committertrimill <trimill@trimillxyz.org>2024-02-03 21:40:55 -0500
commit22df3f473c00946e5c814de7e274ad72cc7b4910 (patch)
tree38996116308a4a7d131312932617d5953f265aa4 /src/arch/amd64/cpu/idt.c
parentspacing (diff)
downloadcorn-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.c47
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);