From 72885190e9bdf63995bc565d5315cf8e62e187a8 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Mon, 12 Jun 2023 23:28:23 -0700 Subject: [PATCH] Resolved page faults from user stacks --- zion/memory/user_stack_manager.cpp | 11 +++++++++++ zion/memory/user_stack_manager.h | 3 +++ zion/object/address_space.cpp | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/zion/memory/user_stack_manager.cpp b/zion/memory/user_stack_manager.cpp index b6f1dc2..6a38b1c 100644 --- a/zion/memory/user_stack_manager.cpp +++ b/zion/memory/user_stack_manager.cpp @@ -21,3 +21,14 @@ void UserStackManager::FreeUserStack(uint64_t stack_ptr) { freed_stacks_++; dbgln("%u freed user stacks", freed_stacks_); } + +bool UserStackManager::IsValidStack(uint64_t vaddr) { + if (vaddr < next_stack_ || vaddr > (kStackMax - 0x1000)) { + return false; + } + // Checks if the address is in the first page of the stack. + if (vaddr & 0xFF000) { + return true; + } + return false; +} diff --git a/zion/memory/user_stack_manager.h b/zion/memory/user_stack_manager.h index ebd47bf..5ed7a0f 100644 --- a/zion/memory/user_stack_manager.h +++ b/zion/memory/user_stack_manager.h @@ -20,6 +20,9 @@ class UserStackManager { uint64_t NewUserStack(); void FreeUserStack(uint64_t stack_ptr); + // Used to check if we should page in this address. + bool IsValidStack(uint64_t vaddr); + private: const uint64_t kStackMax = 0x00008000'00000000; const uint64_t kStackMin = 0x00007FF0'00000000; diff --git a/zion/object/address_space.cpp b/zion/object/address_space.cpp index 2ee374e..0faa89f 100644 --- a/zion/object/address_space.cpp +++ b/zion/object/address_space.cpp @@ -55,6 +55,11 @@ bool AddressSpace::HandlePageFault(uint64_t vaddr) { #if K_VMAS_DEBUG dbgln("[VMAS] Page Fault!"); #endif + if (user_stacks_.IsValidStack(vaddr)) { + MapPage(cr3_, vaddr, phys_mem::AllocatePage()); + return true; + } + MemoryMapping* mapping = GetMemoryMappingForAddr(vaddr); if (mapping == nullptr) { return false;