From 15bc439577c49e97c24a074fe6d9e9464f917054 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Fri, 26 Apr 2024 15:42:01 +0200 Subject: Kernel: Handle userspace memory errors instead of crashing. The kernel should kill the process if it has memory issues. --- kernel/sched/scheduler.c | 11 ++++++++++- kernel/sched/scheduler.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) (limited to 'kernel/sched') diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index 423c1b6..57ab33b 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -216,6 +216,7 @@ void free_process(process_t *p) { void exit_process(process_t *p, int status) { disable_interrupts(); + int killing_itself = (p == current_task); assert(p->pid != 1); if (p->parent) { p->parent->halts[WAIT_CHILD_HALT] = 0; @@ -246,6 +247,9 @@ void exit_process(process_t *p, int status) { } tmp = tmp->next; } + if (killing_itself) { + switch_task(); + } } void exit(int status) { @@ -474,9 +478,14 @@ void signal_process(process_t *p, int sig) { if (SIGTERM == sig) { kprintf("HAS NO SIGTERM\n"); exit_process(p, 1 /*TODO: what should the status be?*/); + ASSERT_NOT_REACHED; + } else if (SIGSEGV == sig) { + kprintf("HAS NO SIGSEGV\n"); + exit_process(p, 1 /*TODO: what should the status be?*/); + ASSERT_NOT_REACHED; } else { // TODO: Should also exit proess(I think) - assert(0); + ASSERT_NOT_REACHED; } } signal_t signal = {.handler_ip = (uintptr_t)p->signal_handlers[sig]}; diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h index b197117..7e42cc7 100644 --- a/kernel/sched/scheduler.h +++ b/kernel/sched/scheduler.h @@ -98,4 +98,5 @@ struct Process { int get_task_from_pid(pid_t pid, process_t **out); void free_process(process_t *p); void *get_free_virtual_memory(size_t length); +void signal_process(process_t *p, int sig); #endif -- cgit v1.2.3