summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/include/irq_handler.h3
-rw-r--r--kernel/include/paging.h2
-rw-r--r--kernel/include/panic.h2
-rw-r--r--kernel/include/regs.h27
-rw-r--r--kernel/include/timer.h2
-rw-r--r--kernel/src/check/panic.c64
-rw-r--r--kernel/src/check/ssp.c2
-rw-r--r--kernel/src/check/ubsan.c3
-rw-r--r--kernel/src/cpu/irq.c17
-rw-r--r--kernel/src/cpu/irq_stub.S6
-rw-r--r--kernel/src/devices/timer.c3
-rw-r--r--kernel/src/mem/paging.c4
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);