LibCore: Add functions to reserve and commit non-backed address space
This commit is contained in:
parent
26b18f192e
commit
0a7bef349d
3 changed files with 54 additions and 0 deletions
|
|
@ -142,6 +142,33 @@ ErrorOr<void> munmap(void* address, size_t size)
|
|||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void*> reserve_address_space(size_t size)
|
||||
{
|
||||
int flags = MAP_PRIVATE | MAP_ANONYMOUS;
|
||||
#ifdef MAP_NORESERVE
|
||||
flags |= MAP_NORESERVE;
|
||||
#endif
|
||||
auto* ptr = ::mmap(nullptr, size, PROT_NONE, flags, -1, 0);
|
||||
if (ptr == MAP_FAILED)
|
||||
return Error::from_syscall("mmap"sv, errno);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ErrorOr<void> commit_memory(void* address, size_t size)
|
||||
{
|
||||
auto* ptr = ::mmap(address, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
||||
if (ptr == MAP_FAILED)
|
||||
return Error::from_syscall("mmap"sv, errno);
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> release_address_space(void* address, size_t size)
|
||||
{
|
||||
if (::munmap(address, size) < 0)
|
||||
return Error::from_syscall("munmap"sv, errno);
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<int> anon_create([[maybe_unused]] size_t size, [[maybe_unused]] int options)
|
||||
{
|
||||
int fd = -1;
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ ErrorOr<struct stat> fstatat(int fd, StringView path, int flags);
|
|||
CORE_API ErrorOr<int> fcntl(int fd, int command, ...);
|
||||
ErrorOr<void*> mmap(void* address, size_t, int protection, int flags, int fd, off_t, size_t alignment = 0, StringView name = {});
|
||||
ErrorOr<void> munmap(void* address, size_t);
|
||||
CORE_API ErrorOr<void*> reserve_address_space(size_t size);
|
||||
CORE_API ErrorOr<void> commit_memory(void* address, size_t size);
|
||||
CORE_API ErrorOr<void> release_address_space(void* address, size_t size);
|
||||
ErrorOr<int> anon_create(size_t size, int options);
|
||||
CORE_API ErrorOr<int> open(StringView path, int options, mode_t mode = 0);
|
||||
ErrorOr<int> openat(int fd, StringView path, int options, mode_t mode = 0);
|
||||
|
|
|
|||
|
|
@ -199,6 +199,30 @@ ErrorOr<void> munmap(void* address, size_t size)
|
|||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void*> reserve_address_space(size_t size)
|
||||
{
|
||||
void* ptr = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_NOACCESS);
|
||||
if (!ptr)
|
||||
return Error::from_windows_error();
|
||||
return ptr;
|
||||
}
|
||||
|
||||
ErrorOr<void> commit_memory(void* address, size_t size)
|
||||
{
|
||||
if (!VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE))
|
||||
return Error::from_windows_error();
|
||||
return {};
|
||||
}
|
||||
|
||||
ErrorOr<void> release_address_space(void* address, size_t size)
|
||||
{
|
||||
// VirtualFree with MEM_RELEASE requires size == 0 and frees the entire reservation.
|
||||
(void)size;
|
||||
if (!VirtualFree(address, 0, MEM_RELEASE))
|
||||
return Error::from_windows_error();
|
||||
return {};
|
||||
}
|
||||
|
||||
int getpid()
|
||||
{
|
||||
return GetCurrentProcessId();
|
||||
|
|
|
|||
Loading…
Reference in a new issue