Compare commits

..

No commits in common. "5f698b4774ee5d76a8fb62d8609cc1f6cda6889a" and "1f6a0db1889d2e6a703046749fe38b1b721ca299" have entirely different histories.

3 changed files with 15 additions and 9 deletions

View File

@ -327,7 +327,7 @@ namespace CPU
static void backtrace_impl(u64 base_pointer, void (*callback)(u64, void*), void* arg) static void backtrace_impl(u64 base_pointer, void (*callback)(u64, void*), void* arg)
{ {
StackFrame* current_frame = (StackFrame*)base_pointer; StackFrame* current_frame = (StackFrame*)base_pointer;
while (current_frame && (u64)current_frame >= 0xFFFF'FFFF'8000'0000 && while (current_frame &&
MemoryManager::validate_access(current_frame, sizeof(*current_frame), MemoryManager::DEFAULT_ACCESS) && MemoryManager::validate_access(current_frame, sizeof(*current_frame), MemoryManager::DEFAULT_ACCESS) &&
current_frame->instruction) current_frame->instruction)
{ {

View File

@ -6,20 +6,24 @@
static constexpr usize DEFAULT_USER_STACK_PAGES = 6; static constexpr usize DEFAULT_USER_STACK_PAGES = 6;
static constexpr usize DEFAULT_USER_STACK_SIZE = DEFAULT_USER_STACK_PAGES * ARCH_PAGE_SIZE; static constexpr usize DEFAULT_USER_STACK_SIZE = DEFAULT_USER_STACK_PAGES * ARCH_PAGE_SIZE;
static constexpr u64 THREAD_STACK_BASE = 0x10000;
static Result<void> create_user_stack(Stack& user_stack, AddressSpace* space) static Result<void> create_stacks(Stack& user_stack, Stack& kernel_stack, AddressSpace* space)
{ {
const u64 THREAD_STACK_BASE = 0x10000;
if (!TRY(space->test_and_alloc_region(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES, true))) return err(ENOMEM);
TRY(MemoryManager::alloc_at_zeroed(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES, TRY(MemoryManager::alloc_at_zeroed(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES,
MMU::ReadWrite | MMU::NoExecute | MMU::User)); MMU::ReadWrite | MMU::NoExecute | MMU::User));
auto guard = make_scope_guard([] { MemoryManager::unmap_owned(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES); }); auto guard = make_scope_guard([&] { MemoryManager::unmap_owned(THREAD_STACK_BASE, 4); });
if (!TRY(space->test_and_alloc_region(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES, true))) return err(ENOMEM); const u64 kernel_stack_base = TRY(MemoryManager::alloc_for_kernel(4, MMU::ReadWrite | MMU::NoExecute));
guard.deactivate(); guard.deactivate();
user_stack = { THREAD_STACK_BASE, DEFAULT_USER_STACK_SIZE }; user_stack = { THREAD_STACK_BASE, DEFAULT_USER_STACK_SIZE };
kernel_stack = { kernel_stack_base, 4 * ARCH_PAGE_SIZE };
return {}; return {};
} }
@ -39,10 +43,12 @@ Result<OwnedPtr<ThreadImage>> ThreadImage::try_load_from_elf(SharedPtr<VFS::Inod
const ELFData data = TRY(ELFLoader::load(inode, address_space.ptr())); const ELFData data = TRY(ELFLoader::load(inode, address_space.ptr()));
Stack user_stack; Stack user_stack;
TRY(create_user_stack(user_stack, address_space.ptr())); Stack kernel_stack;
TRY(create_stacks(user_stack, kernel_stack, address_space.ptr()));
guard.deactivate(); guard.deactivate();
image->m_kernel_stack = kernel_stack;
image->m_user_stack = user_stack; image->m_user_stack = user_stack;
image->m_loaded_image_data = data; image->m_loaded_image_data = data;
image->m_address_space = move(address_space); image->m_address_space = move(address_space);
@ -105,7 +111,7 @@ void ThreadImage::apply(Thread* thread)
thread->set_ip(m_loaded_image_data.entry); thread->set_ip(m_loaded_image_data.entry);
if (m_kernel_stack.bottom()) thread->kernel_stack = m_kernel_stack; thread->kernel_stack = m_kernel_stack;
thread->stack = m_user_stack; thread->stack = m_user_stack;
thread->set_sp(align_down<16>(m_sp)); thread->set_sp(align_down<16>(m_sp));

View File

@ -19,6 +19,6 @@ struct Stack
} }
private: private:
u64 m_base { 0 }; u64 m_base;
usize m_bytes { 0 }; usize m_bytes;
}; };