From d8e680604c5c3c5d1ea7caf4638c47297d7b5c6c Mon Sep 17 00:00:00 2001 From: boreddevnl Date: Wed, 1 Apr 2026 23:33:25 +0200 Subject: [PATCH] FIX: gpf when closing boredword.c --- src/arch/interrupts.asm | 4 ++-- src/sys/process.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/arch/interrupts.asm b/src/arch/interrupts.asm index 4329a36..717a369 100644 --- a/src/arch/interrupts.asm +++ b/src/arch/interrupts.asm @@ -45,7 +45,7 @@ isr%2_wrapper: push r14 push r15 - ; Save SSE/FPU state + ; Save SSE/FPU state (fxsave requires 16-byte alignment) sub rsp, 512 fxsave [rsp] @@ -164,7 +164,7 @@ exception_common: push r14 push r15 - ; Save SSE/FPU state + ; Save SSE/FPU state (fxsave requires 16-byte alignment) sub rsp, 512 fxsave [rsp] diff --git a/src/sys/process.c b/src/sys/process.c index 0512b9c..7636c7a 100644 --- a/src/sys/process.c +++ b/src/sys/process.c @@ -24,6 +24,7 @@ int process_count = 0; static process_t* current_process[MAX_CPUS_SCHED] = {0}; // Per-CPU static uint32_t next_pid = 0; static void *free_kernel_stack_later = NULL; +static uint64_t free_pml4_later = 0; static spinlock_t runqueue_lock = SPINLOCK_INIT; static uint32_t next_cpu_assign = 1; // Round-robin CPU assignment (start from CPU 1) @@ -379,6 +380,11 @@ uint64_t process_schedule(uint64_t current_rsp) { kfree(free_kernel_stack_later); free_kernel_stack_later = NULL; } + if (free_pml4_later) { + extern void paging_destroy_user_pml4_phys(uint64_t pml4_phys); + paging_destroy_user_pml4_phys(free_pml4_later); + free_pml4_later = 0; + } uint32_t my_cpu = smp_this_cpu_id(); process_t *cur = current_process[my_cpu]; @@ -524,9 +530,8 @@ void process_terminate(process_t *to_delete) { to_delete->cpu_affinity = 0xFFFFFFFF; if (to_delete->user_stack_alloc) kfree(to_delete->user_stack_alloc); - if (to_delete->kernel_stack_alloc) { - kfree(to_delete->kernel_stack_alloc); - } + // Defer kernel stack until we switch away from it + to_delete->kernel_stack_alloc = NULL; extern void paging_destroy_user_pml4_phys(uint64_t pml4_phys); if (to_delete->pml4_phys && to_delete->is_user) {