summaryrefslogtreecommitdiff
path: root/kernel/src/check/panic.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/check/panic.c')
-rw-r--r--kernel/src/check/panic.c64
1 files changed, 30 insertions, 34 deletions
diff --git a/kernel/src/check/panic.c b/kernel/src/check/panic.c
index 66a73c7..ac40078 100644
--- a/kernel/src/check/panic.c
+++ b/kernel/src/check/panic.c
@@ -1,11 +1,10 @@
#include <libk/stdio.h>
#include <panic.h>
+#include <regs.h>
#include <graphics.h>
#include <idt.h>
-uint64_t panic_rsp;
-
-__attribute__((noreturn)) void panic(const char *s, ...)
+__attribute__((noreturn)) void panic(uint64_t rsp, const char *s, ...)
{
set_color(&main_fb, RED, BLACK);
printf("KERNEL PANIC\n");
@@ -15,37 +14,34 @@ __attribute__((noreturn)) void panic(const char *s, ...)
vprintf(s, list);
va_end(list);
- if (panic_rsp != 0) {
- printf("info:\n");
- uint64_t i = 0;
- printf("ss: 0x%x ",
- (uint16_t) * ((uint64_t *)panic_rsp + i++));
- printf("ds: 0x%x ",
- (uint16_t) * ((uint64_t *)panic_rsp + i++));
- printf("es: 0x%x ",
- (uint16_t) * ((uint64_t *)panic_rsp + i++));
- printf("r15: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r14: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r13: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r12: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r11: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r10: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r9: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("r8: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rdi: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rsi: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rdx: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rcx: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rbx: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rax: 0x%x ", *((uint64_t *)panic_rsp + i++));
- if (*((uint64_t *)panic_rsp + i) <= 0xffffffff)
- printf("err code: 0x%x ",
- *((uint64_t *)panic_rsp + i++));
- printf("rip: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("cs: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rflags: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("rsp: 0x%x ", *((uint64_t *)panic_rsp + i++));
- printf("ss: 0x%x ", *((uint64_t *)panic_rsp + i++));
+ if (rsp) {
+ uint64_t seg = *(uint64_t *)(rsp + SEG_OFF);
+
+ printf("info regs:\n");
+ printf("rax: 0x%x; ", *(uint64_t *)(rsp + RAX_OFF));
+ printf("rbx: 0x%x; ", *(uint64_t *)(rsp + RBX_OFF));
+ printf("rcx: 0x%x; ", *(uint64_t *)(rsp + RCX_OFF));
+ printf("rdx: 0x%x; ", *(uint64_t *)(rsp + RDX_OFF));
+ printf("rdi: 0x%x; ", *(uint64_t *)(rsp + RDI_OFF));
+ printf("rsi: 0x%x; ", *(uint64_t *)(rsp + RSI_OFF));
+ printf("rsp: 0x%x; ", *(uint64_t *)(rsp + RSP_OFF));
+ printf("rbp: 0x%x; ", *(uint64_t *)(rsp + RBP_OFF));
+ printf("r8: 0x%x; ", *(uint64_t *)(rsp + R8_OFF));
+ printf("r9: 0x%x; ", *(uint64_t *)(rsp + R9_OFF));
+ printf("r10: 0x%x; ", *(uint64_t *)(rsp + R10_OFF));
+ printf("r11: 0x%x; ", *(uint64_t *)(rsp + R11_OFF));
+ printf("r12: 0x%x; ", *(uint64_t *)(rsp + R12_OFF));
+ printf("r13: 0x%x; ", *(uint64_t *)(rsp + R13_OFF));
+ printf("r14: 0x%x; ", *(uint64_t *)(rsp + R14_OFF));
+ printf("r15: 0x%x; ", *(uint64_t *)(rsp + R15_OFF));
+ printf("rip: 0x%x; ", *(uint64_t *)(rsp + RIP_OFF));
+ printf("cs: 0x%x; ", *(uint64_t *)(rsp + CS_OFF));
+ printf("ds: 0x%x; ", seg >> 48);
+ printf("ss: 0x%x; ", *(uint64_t *)(rsp + SS_OFF));
+ printf("es: 0x%x; ", (seg >> 32) & 0xFFFF);
+ printf("fs: 0x%x; ", (seg >> 16) & 0xFFFF);
+ printf("gs: 0x%x; ", seg & 0xFFFF);
+ printf("rflags: 0x%x; ", *(uint64_t *)(rsp + RFLAGS_OFF));
}
disable_interrupts();