From 10bd24e585ae7305ddc11a5b47631579898f37a6 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 25 Aug 2025 22:15:22 +0300 Subject: [PATCH] Kernel: Fix signal delivery without an alternate stack I had only tested that sigaltstack worked, so I didn't notice my normal signals broke :D --- kernel/kernel/Thread.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 4aae7452..d2616be3 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -573,13 +573,24 @@ namespace Kernel { // Make sure stack is allocated - const vaddr_t pages[3] { - (interrupt_stack.sp - sizeof(uintptr_t)) & PAGE_ADDR_MASK, - (signal_stack_top - 4 * sizeof(uintptr_t)) & PAGE_ADDR_MASK, - (signal_stack_top - 1 * sizeof(uintptr_t)) & PAGE_ADDR_MASK, - }; + vaddr_t pages[3] {}; + size_t page_count { 0 }; - for (size_t i = 0; i < 3; i++) + if (signal_stack_top == 0) + { + pages[0] = (interrupt_stack.sp - 1 * sizeof(uintptr_t)) & PAGE_ADDR_MASK; + pages[1] = (interrupt_stack.sp - 5 * sizeof(uintptr_t)) & PAGE_ADDR_MASK; + page_count = 2; + } + else + { + pages[0] = (interrupt_stack.sp - sizeof(uintptr_t)) & PAGE_ADDR_MASK; + pages[1] = (signal_stack_top - 4 * sizeof(uintptr_t)) & PAGE_ADDR_MASK; + pages[2] = (signal_stack_top - 1 * sizeof(uintptr_t)) & PAGE_ADDR_MASK; + page_count = 3; + } + + for (size_t i = 0; i < page_count; i++) { if (m_process->page_table().get_page_flags(pages[i]) & PageTable::Flags::Present) continue;