summaryrefslogtreecommitdiff
path: root/kernel/cpu
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-04-26 15:42:01 +0200
committerAnton Kling <anton@kling.gg>2024-04-26 15:44:26 +0200
commit15bc439577c49e97c24a074fe6d9e9464f917054 (patch)
tree8a60437726c70f5e046da785db3ea904b282cd66 /kernel/cpu
parentea653dc177eca18291f3081348d6104ac817f763 (diff)
Kernel: Handle userspace memory errors instead of crashing.
The kernel should kill the process if it has memory issues.
Diffstat (limited to 'kernel/cpu')
-rw-r--r--kernel/cpu/idt.c13
-rw-r--r--kernel/cpu/isr.s9
2 files changed, 16 insertions, 6 deletions
diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c
index 9508f8c..acede33 100644
--- a/kernel/cpu/idt.c
+++ b/kernel/cpu/idt.c
@@ -76,6 +76,13 @@ void page_fault(reg_t *regs) {
process_pop_restore_context(NULL, regs);
return;
}
+
+ int is_userspace = (regs->error_code & (1 << 2));
+ if (is_userspace) {
+ signal_process(current_task, SIGSEGV);
+ return;
+ }
+
klog("Page Fault", LOG_ERROR);
kprintf("CR2: %x\n", cr2);
if (current_task) {
@@ -97,15 +104,11 @@ void page_fault(reg_t *regs) {
kprintf("read access\n");
}
- if (regs->error_code & (1 << 2)) {
- kprintf("CPL = 3\n");
- }
-
if (regs->error_code & (1 << 4)) {
kprintf("Attempted instruction fetch\n");
}
- dump_backtrace(20);
+ dump_backtrace(15);
halt();
}
diff --git a/kernel/cpu/isr.s b/kernel/cpu/isr.s
index 8032485..819b22b 100644
--- a/kernel/cpu/isr.s
+++ b/kernel/cpu/isr.s
@@ -11,6 +11,13 @@
push \num
jmp isr_common_stub
.endm
+.macro ISR_ERRCODE num
+ .global isr\num
+ isr\num:
+ cli
+ push \num
+ jmp isr_common_stub
+.endm
ISR_NOERRCODE 0
ISR_NOERRCODE 1
@@ -26,7 +33,7 @@ ISR_NOERRCODE 10
ISR_NOERRCODE 11
ISR_NOERRCODE 12
ISR_NOERRCODE 13
-ISR_NOERRCODE 14
+ISR_ERRCODE 14
ISR_NOERRCODE 15
ISR_NOERRCODE 16
ISR_NOERRCODE 17