diff options
| -rw-r--r-- | kernel/include/irq_handler.h | 3 | ||||
| -rw-r--r-- | kernel/include/paging.h | 2 | ||||
| -rw-r--r-- | kernel/include/panic.h | 2 | ||||
| -rw-r--r-- | kernel/include/regs.h | 27 | ||||
| -rw-r--r-- | kernel/include/timer.h | 2 | ||||
| -rw-r--r-- | kernel/src/check/panic.c | 64 | ||||
| -rw-r--r-- | kernel/src/check/ssp.c | 2 | ||||
| -rw-r--r-- | kernel/src/check/ubsan.c | 3 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 17 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 6 | ||||
| -rw-r--r-- | kernel/src/devices/timer.c | 3 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 4 |
12 files changed, 78 insertions, 57 deletions
diff --git a/kernel/include/irq_handler.h b/kernel/include/irq_handler.h index 571d1ab..01f4950 100644 --- a/kernel/include/irq_handler.h +++ b/kernel/include/irq_handler.h @@ -3,8 +3,7 @@ #include <types.h> -void isr_def_handler(uint64_t number, uint64_t error); void eoi(uint64_t number); -void irq_def_handler(uint64_t number); +void isr_def_handler(uint64_t number, uint64_t rsp, uint64_t error); #endif diff --git a/kernel/include/paging.h b/kernel/include/paging.h index 4aaf6af..65c9652 100644 --- a/kernel/include/paging.h +++ b/kernel/include/paging.h @@ -12,7 +12,7 @@ void load_pt_lvl4(uint64_t *); void init_paging(void); void map_addr(uint64_t virt, uint64_t phys, uint32_t flags); -void page_fault(uint64_t error); +void page_fault(uint64_t rsp, uint64_t error); extern uint64_t __attribute__((aligned(4096))) page_table_lvl4[512]; extern uint64_t __attribute__((aligned(4096))) page_table_lvl3[512]; diff --git a/kernel/include/panic.h b/kernel/include/panic.h index 4949c77..9fb3f4f 100644 --- a/kernel/include/panic.h +++ b/kernel/include/panic.h @@ -5,6 +5,6 @@ extern uint64_t panic_rsp; -__attribute__((noreturn)) void panic(const char *error, ...); +__attribute__((noreturn)) void panic(uint64_t rsp, const char *s, ...); #endif diff --git a/kernel/include/regs.h b/kernel/include/regs.h new file mode 100644 index 0000000..81b8a69 --- /dev/null +++ b/kernel/include/regs.h @@ -0,0 +1,27 @@ +#ifndef REGS_H +#define REGS_H + +#define R15_OFF 0x0 +#define R14_OFF 0x08 +#define R13_OFF 0x10 +#define R12_OFF 0x18 +#define RBP_OFF 0x20 +#define RBX_OFF 0x28 +#define SEG_OFF 0x30 +#define R11_OFF 0x38 +#define R10_OFF 0x40 +#define R9_OFF 0x48 +#define R8_OFF 0x50 +#define RDI_OFF 0x58 +#define RSI_OFF 0x60 +#define RDX_OFF 0x68 +#define RCX_OFF 0x70 +#define RAX_OFF 0x78 +#define ERROR_OFF 0x80 +#define RIP_OFF 0x88 +#define CS_OFF 0x90 +#define RFLAGS_OFF 0x98 +#define RSP_OFF 0x100 +#define SS_OFF 0x108 + +#endif diff --git a/kernel/include/timer.h b/kernel/include/timer.h index 3ddef4d..899f09f 100644 --- a/kernel/include/timer.h +++ b/kernel/include/timer.h @@ -5,7 +5,7 @@ #define TICKS_PER_SECOND 1000 -void timer_handler(void); +void timer_handler(uint64_t rsp); void wait(uint64_t ms); void init_timer(uint32_t frequency); 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); } diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index a7288c0..7480eef 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -47,14 +47,15 @@ const char *const exception_name[] = { "Reserved", }; -void exception(uint64_t number, uint64_t error) { +void exception(uint64_t number, uint64_t rsp, uint64_t error) +{ switch (number) { case 0xe: printf("%s, error: 0x%x\n", exception_name[14], error); - page_fault(error); + page_fault(rsp, error); break; default: - panic("%s, error: 0x%x\n", exception_name[number], error); + panic(rsp, "%s, error: 0x%x\n", exception_name[number], error); } } @@ -72,11 +73,11 @@ void eoi(uint64_t number) } } -void interrupt(uint64_t number) +void interrupt(uint64_t number, uint64_t rsp) { switch (number) { case 0x20: - timer_handler(); + timer_handler(rsp); eoi(number); break; case 0x21: @@ -89,11 +90,11 @@ void interrupt(uint64_t number) } } -void isr_def_handler(uint64_t number, uint64_t error) +void isr_def_handler(uint64_t number, uint64_t rsp, uint64_t error) { if (number < 0x20) { - exception(number, error); + exception(number, rsp, error); } else { - interrupt(number); + interrupt(number, rsp); } } diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index a80b721..a89cd6b 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -1,14 +1,12 @@ -.extern panic_rsp - #include "x86_64_regs.S" .macro isrstub number push_caller_saved push_callee_saved /* get error code from stack */ - mov ERROR_OFF(%rsp), %rsi - mov %rsp, panic_rsp mov $\number, %rdi + mov %rsp, %rsi + mov ERROR_OFF(%rsp), %rdx cld call isr_def_handler pop_callee_saved diff --git a/kernel/src/devices/timer.c b/kernel/src/devices/timer.c index f6463ab..0f6fc20 100644 --- a/kernel/src/devices/timer.c +++ b/kernel/src/devices/timer.c @@ -16,7 +16,7 @@ typedef struct wait_queue wait_queue; wait_queue timer_queue; -void timer_handler() +void timer_handler(uint64_t rsp) { wait_queue *pos; list_for_each_entry(pos, (&timer_queue.list), list) { @@ -24,6 +24,7 @@ void timer_handler() } tick++; + if (tick >= TICKS_PER_SECOND) { tick = 0; seconds++; diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index cf62980..94ac226 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -64,7 +64,7 @@ void init_paging(void) load_pt_lvl4(page_table_lvl4); } -void page_fault(uint64_t error) +void page_fault(uint64_t rsp, uint64_t error) { uint64_t addr; __asm__ __volatile__("mov %%cr2, %0;" : "=r"(addr) : : "memory"); @@ -72,7 +72,7 @@ void page_fault(uint64_t error) printf("address: 0x%x, error code: 0x%x\n", addr, error); if (error == 7) { - panic("Accessing privileged page in usermode\n"); + panic(rsp, "Accessing privileged page in usermode\n"); } map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); |
