Serenity Operating System
at master 31 lines 1.0 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Memory/Region.h> 8#include <Kernel/Process.h> 9 10namespace Kernel { 11 12ErrorOr<FlatPtr> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size) 13{ 14 VERIFY_NO_PROCESS_BIG_LOCK(this); 15 auto& regs = Thread::current()->get_register_dump_from_stack(); 16 FlatPtr stack_pointer = regs.userspace_sp(); 17 return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> { 18 auto* stack_region = space->find_region_containing(Memory::VirtualRange { VirtualAddress(stack_pointer), 1 }); 19 20 // The syscall handler should have killed us if we had an invalid stack pointer. 21 VERIFY(stack_region); 22 23 FlatPtr stack_base = stack_region->range().base().get(); 24 size_t stack_size = stack_region->size(); 25 TRY(copy_to_user(user_stack_base, &stack_base)); 26 TRY(copy_to_user(user_stack_size, &stack_size)); 27 return 0; 28 }); 29} 30 31}