Kernel: Add sys$get_stack_bounds() for finding the stack base & size
This will be useful when implementing conservative garbage collection.
This commit is contained in:
parent
086f68e878
commit
ad92a1e4bc
Notes:
sideshowbarker
2024-07-19 08:16:32 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/ad92a1e4bc0
5 changed files with 33 additions and 1 deletions
|
@ -4838,4 +4838,25 @@ OwnPtr<Process::ELFBundle> Process::elf_bundle() const
|
|||
return bundle;
|
||||
}
|
||||
|
||||
int Process::sys$get_stack_bounds(FlatPtr* user_stack_base, size_t* user_stack_size)
|
||||
{
|
||||
if (!validate_write_typed(user_stack_base))
|
||||
return -EFAULT;
|
||||
if (!validate_write_typed(user_stack_size))
|
||||
return -EFAULT;
|
||||
|
||||
FlatPtr stack_pointer = Thread::current->get_register_dump_from_stack().userspace_esp;
|
||||
auto* stack_region = MM.region_from_vaddr(*this, VirtualAddress(stack_pointer));
|
||||
if (!stack_region) {
|
||||
ASSERT_NOT_REACHED();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
FlatPtr stack_base = stack_region->range().base().get();
|
||||
size_t stack_size = stack_region->size();
|
||||
copy_to_user(user_stack_base, &stack_base);
|
||||
copy_to_user(user_stack_size, &stack_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -298,6 +298,7 @@ public:
|
|||
int sys$pledge(const Syscall::SC_pledge_params*);
|
||||
int sys$unveil(const Syscall::SC_unveil_params*);
|
||||
int sys$perf_event(int type, FlatPtr arg1, FlatPtr arg2);
|
||||
int sys$get_stack_bounds(FlatPtr* stack_base, size_t* stack_size);
|
||||
|
||||
template<bool sockname, typename Params>
|
||||
int get_sock_or_peer_name(const Params&);
|
||||
|
|
|
@ -178,7 +178,8 @@ namespace Kernel {
|
|||
__ENUMERATE_SYSCALL(pledge) \
|
||||
__ENUMERATE_SYSCALL(unveil) \
|
||||
__ENUMERATE_SYSCALL(perf_event) \
|
||||
__ENUMERATE_SYSCALL(shutdown)
|
||||
__ENUMERATE_SYSCALL(shutdown) \
|
||||
__ENUMERATE_SYSCALL(get_stack_bounds)
|
||||
|
||||
namespace Syscall {
|
||||
|
||||
|
|
|
@ -124,4 +124,11 @@ int shbuf_allow_all(int shbuf_id)
|
|||
int rc = syscall(SC_shbuf_allow_all, shbuf_id);
|
||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||
}
|
||||
|
||||
int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size)
|
||||
{
|
||||
int rc = syscall(SC_get_stack_bounds, user_stack_base, user_stack_size);
|
||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -68,4 +68,6 @@ int purge(int mode);
|
|||
|
||||
int perf_event(int type, uintptr_t arg1, uintptr_t arg2);
|
||||
|
||||
int get_stack_bounds(uintptr_t* user_stack_base, size_t* user_stack_size);
|
||||
|
||||
__END_DECLS
|
||||
|
|
Loading…
Add table
Reference in a new issue