From a362a43899040a3848427c4d1f3bd1d3e53f46ec Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 26 Feb 2023 07:29:26 +0100 Subject: passing rsp from isr_stub, fixing panic() --- kernel/src/check/panic.c | 64 +++++++++++++++++++++++------------------------- kernel/src/check/ssp.c | 2 +- kernel/src/check/ubsan.c | 3 +-- 3 files changed, 32 insertions(+), 37 deletions(-) (limited to 'kernel/src/check') 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 #include +#include #include #include -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); } -- cgit v1.2.3