mirror of
https://github.com/RGBCube/serenity
synced 2025-07-10 09:57:35 +00:00
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
5 changed files with 33 additions and 1 deletions
|
@ -4838,4 +4838,25 @@ OwnPtr<Process::ELFBundle> Process::elf_bundle() const
|
||||||
return bundle;
|
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$pledge(const Syscall::SC_pledge_params*);
|
||||||
int sys$unveil(const Syscall::SC_unveil_params*);
|
int sys$unveil(const Syscall::SC_unveil_params*);
|
||||||
int sys$perf_event(int type, FlatPtr arg1, FlatPtr arg2);
|
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>
|
template<bool sockname, typename Params>
|
||||||
int get_sock_or_peer_name(const Params&);
|
int get_sock_or_peer_name(const Params&);
|
||||||
|
|
|
@ -178,7 +178,8 @@ namespace Kernel {
|
||||||
__ENUMERATE_SYSCALL(pledge) \
|
__ENUMERATE_SYSCALL(pledge) \
|
||||||
__ENUMERATE_SYSCALL(unveil) \
|
__ENUMERATE_SYSCALL(unveil) \
|
||||||
__ENUMERATE_SYSCALL(perf_event) \
|
__ENUMERATE_SYSCALL(perf_event) \
|
||||||
__ENUMERATE_SYSCALL(shutdown)
|
__ENUMERATE_SYSCALL(shutdown) \
|
||||||
|
__ENUMERATE_SYSCALL(get_stack_bounds)
|
||||||
|
|
||||||
namespace Syscall {
|
namespace Syscall {
|
||||||
|
|
||||||
|
|
|
@ -124,4 +124,11 @@ int shbuf_allow_all(int shbuf_id)
|
||||||
int rc = syscall(SC_shbuf_allow_all, shbuf_id);
|
int rc = syscall(SC_shbuf_allow_all, shbuf_id);
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
__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 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
|
__END_DECLS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue