summaryrefslogtreecommitdiff
path: root/kernel/src/check
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 07:29:26 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 07:39:55 +0100
commita362a43899040a3848427c4d1f3bd1d3e53f46ec (patch)
tree3255f10f358ab2dba1555a45a91950d185d397f7 /kernel/src/check
parent40eecaecc552945f72a2b90f4122bf929960671c (diff)
passing rsp from isr_stub, fixing panic()
Diffstat (limited to 'kernel/src/check')
-rw-r--r--kernel/src/check/panic.c64
-rw-r--r--kernel/src/check/ssp.c2
-rw-r--r--kernel/src/check/ubsan.c3
3 files changed, 32 insertions, 37 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();
diff --git a/kernel/src/check/ssp.c b/kernel/src/check/ssp.c
index 65271eb..c5eb105 100644
--- a/kernel/src/check/ssp.c
+++ b/kernel/src/check/ssp.c
@@ -9,5 +9,5 @@ uintptr_t __stack_chk_guard = STACK_CHK_GUARD;
__attribute__((noreturn)) void __stack_chk_fail(void);
__attribute__((noreturn)) void __stack_chk_fail(void)
{
- panic("Stack smashing detected");
+ panic(0, "Stack smashing detected");
}
diff --git a/kernel/src/check/ubsan.c b/kernel/src/check/ubsan.c
index eb7721e..851d920 100644
--- a/kernel/src/check/ubsan.c
+++ b/kernel/src/check/ubsan.c
@@ -49,8 +49,7 @@ ubsan_abort(const struct ubsan_source_location *location, const char *violation)
if (!location || !location->filename)
location = &unknown_location;
- panic_rsp = 0;
- panic("filename = %s; line = %d; column = %d; violation = %s;\n",
+ panic(0, "filename = %s; line = %d; column = %d; violation = %s;\n",
location->filename, location->line, location->column, violation);
}