get_stack_bounds.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Panic.h>
  7. #include <Kernel/Process.h>
  8. #include <Kernel/VM/Region.h>
  9. namespace Kernel {
  10. KResultOr<FlatPtr> Process::sys$get_stack_bounds(Userspace<FlatPtr*> user_stack_base, Userspace<size_t*> user_stack_size)
  11. {
  12. auto& regs = Thread::current()->get_register_dump_from_stack();
  13. FlatPtr stack_pointer;
  14. #if ARCH(I386)
  15. stack_pointer = regs.userspace_esp;
  16. #else
  17. stack_pointer = regs.userspace_rsp;
  18. #endif
  19. auto* stack_region = space().find_region_containing(Range { VirtualAddress(stack_pointer), 1 });
  20. // The syscall handler should have killed us if we had an invalid stack pointer.
  21. VERIFY(stack_region);
  22. FlatPtr stack_base = stack_region->range().base().get();
  23. size_t stack_size = stack_region->size();
  24. if (!copy_to_user(user_stack_base, &stack_base))
  25. return EFAULT;
  26. if (!copy_to_user(user_stack_size, &stack_size))
  27. return EFAULT;
  28. return 0;
  29. }
  30. }