From a40ef610a265d8577e84c6264164589d674bdb80 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 17 Apr 2024 00:55:45 +0300 Subject: [PATCH] Kernel: Allow demand paging only for userspace threads --- kernel/include/kernel/Thread.h | 2 +- kernel/kernel/IDT.cpp | 34 +++++++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 97b4ee38..8e79d2c2 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -61,7 +61,7 @@ namespace Kernel vaddr_t kernel_stack_top() const { return m_kernel_stack->vaddr() + m_kernel_stack->size(); } VirtualRange& kernel_stack() { return *m_kernel_stack; } - vaddr_t userspace_stack_bottom() const { return is_userspace() ? m_userspace_stack->vaddr() : 0; } + vaddr_t userspace_stack_bottom() const { return is_userspace() ? m_userspace_stack->vaddr() : UINTPTR_MAX; } vaddr_t userspace_stack_top() const { return is_userspace() ? m_userspace_stack->vaddr() + m_userspace_stack->size() : 0; } VirtualRange& userspace_stack() { ASSERT(is_userspace()); return *m_userspace_stack; } diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index dc89aadd..93491da9 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -194,23 +194,27 @@ namespace Kernel goto done; } - // Try demand paging on non present pages - PageFaultError page_fault_error; - page_fault_error.raw = error; - if (!page_fault_error.present) + // Demand paging is only supported in userspace + if (thread.is_userspace()) { - Processor::set_interrupt_state(InterruptState::Enabled); - auto result = Process::current().allocate_page_for_demand_paging(regs->cr2); - Processor::set_interrupt_state(InterruptState::Disabled); - - if (!result.is_error() && result.value()) - goto done; - - if (result.is_error()) + // Try demand paging on non present pages + PageFaultError page_fault_error; + page_fault_error.raw = error; + if (!page_fault_error.present) { - dwarnln("Demand paging: {}", result.error()); - Thread::current().handle_signal(SIGKILL); - goto done; + Processor::set_interrupt_state(InterruptState::Enabled); + auto result = Process::current().allocate_page_for_demand_paging(regs->cr2); + Processor::set_interrupt_state(InterruptState::Disabled); + + if (!result.is_error() && result.value()) + goto done; + + if (result.is_error()) + { + dwarnln("Demand paging: {}", result.error()); + Thread::current().handle_signal(SIGKILL); + goto done; + } } } }