summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/panic.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/panic.c')
-rw-r--r--arch/x86_64/panic.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/arch/x86_64/panic.c b/arch/x86_64/panic.c
new file mode 100644
index 0000000..2e34500
--- /dev/null
+++ b/arch/x86_64/panic.c
@@ -0,0 +1,36 @@
+#include "jove.h"
+#include "arch/x86_64/idt.h"
+#include "print.h"
+
+#include <stddef.h>
+
+struct stackFrame {
+ struct stackFrame *ebp;
+ uintptr_t eip;
+};
+
+void
+kpanic_state(ivt_state_t *state, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ kprintf("Kernel Panic!\n");
+
+ kvprintf(fmt, ap);
+ kprintf("\n\nCore dump:\n");
+
+ kprintf("RAX %p | RBX %p | RCX %p | RDX %p\n", state->rax, state->rbx, state->rcx, state->rdx);
+ kprintf("RSI %p | RDI %p | RSP %p | RBP %p\n", state->rsi, state->rdi, state->rsp, state->rbp);
+ kprintf("R8 %p | R9 %p | R10 %p | R11 %p\n", state->r8, state->r9, state->r10, state->r11);
+ kprintf("R12 %p | R13 %p | R14 %p | R15 %p\n", state->r12, state->r13, state->r14, state->r15);
+ kprintf("RIP %p\n", state->rip);
+
+ kprintf("\nStack trace:\n");
+ struct stackFrame *frame = (struct stackFrame*)state->rbp;
+ for(size_t framei = 0; frame && framei < 64; ++framei) {
+ kprintf("%i %p : %p\n", framei, frame, frame->eip);
+ frame = frame->ebp;
+ }
+
+ hcf();
+}