diff --git a/Libraries/LibCore/System.cpp b/Libraries/LibCore/System.cpp index 401e8c3a0f..00a2fbb5a5 100644 --- a/Libraries/LibCore/System.cpp +++ b/Libraries/LibCore/System.cpp @@ -142,6 +142,33 @@ ErrorOr munmap(void* address, size_t size) return {}; } +ErrorOr 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 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 release_address_space(void* address, size_t size) +{ + if (::munmap(address, size) < 0) + return Error::from_syscall("munmap"sv, errno); + return {}; +} + ErrorOr anon_create([[maybe_unused]] size_t size, [[maybe_unused]] int options) { int fd = -1; diff --git a/Libraries/LibCore/System.h b/Libraries/LibCore/System.h index f0448061b4..ad81f64a49 100644 --- a/Libraries/LibCore/System.h +++ b/Libraries/LibCore/System.h @@ -78,6 +78,9 @@ ErrorOr fstatat(int fd, StringView path, int flags); CORE_API ErrorOr fcntl(int fd, int command, ...); ErrorOr mmap(void* address, size_t, int protection, int flags, int fd, off_t, size_t alignment = 0, StringView name = {}); ErrorOr munmap(void* address, size_t); +CORE_API ErrorOr reserve_address_space(size_t size); +CORE_API ErrorOr commit_memory(void* address, size_t size); +CORE_API ErrorOr release_address_space(void* address, size_t size); ErrorOr anon_create(size_t size, int options); CORE_API ErrorOr open(StringView path, int options, mode_t mode = 0); ErrorOr openat(int fd, StringView path, int options, mode_t mode = 0); diff --git a/Libraries/LibCore/SystemWindows.cpp b/Libraries/LibCore/SystemWindows.cpp index d09762ebbf..cb7d56156e 100644 --- a/Libraries/LibCore/SystemWindows.cpp +++ b/Libraries/LibCore/SystemWindows.cpp @@ -199,6 +199,30 @@ ErrorOr munmap(void* address, size_t size) return {}; } +ErrorOr 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 commit_memory(void* address, size_t size) +{ + if (!VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE)) + return Error::from_windows_error(); + return {}; +} + +ErrorOr 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();