remove the extra virtual memory layer

This commit is contained in:
nmzik
2026-09-17 20:03:08 +04:00
parent 5dc644edb4
commit 5b2935e36c
9 changed files with 63 additions and 221 deletions
-1
View File
@@ -52,7 +52,6 @@ uint64_t SysFileTell(sys_file_t& f); // NOLINT(google-runt
bool SysFileTruncate(sys_file_t& f, uint64_t size); // NOLINT(google-runtime-references) bool SysFileTruncate(sys_file_t& f, uint64_t size); // NOLINT(google-runtime-references)
bool SysFileUnlink(sys_file_t& f, bool SysFileUnlink(sys_file_t& f,
const std::filesystem::path& name); // NOLINT(google-runtime-references) const std::filesystem::path& name); // NOLINT(google-runtime-references)
void SysFileWrite(uint32_t n, sys_file_t& f); // NOLINT(google-runtime-references)
uint64_t SysFileSize(const std::filesystem::path& file_name); uint64_t SysFileSize(const std::filesystem::path& file_name);
bool SysFileIsError(sys_file_t& f); // NOLINT(google-runtime-references) bool SysFileIsError(sys_file_t& f); // NOLINT(google-runtime-references)
bool SysFileIsDirectoryExisting(const std::filesystem::path& path); bool SysFileIsDirectoryExisting(const std::filesystem::path& path);
+1 -4
View File
@@ -11,6 +11,7 @@
#include <cerrno> #include <cerrno>
#include <cstdlib> #include <cstdlib>
#include <cstring>
#include <dirent.h> #include <dirent.h>
#include <fcntl.h> #include <fcntl.h>
#include <filesystem> #include <filesystem>
@@ -151,10 +152,6 @@ void SysFileWrite(const void* data, uint32_t size, sys_file_t& f, uint32_t* byte
} }
} }
void SysFileWrite(uint32_t n, sys_file_t& f) {
SysFileWrite(&n, 4, f);
}
sys_file_t* SysFileCreate(const std::filesystem::path& file_name) { sys_file_t* SysFileCreate(const std::filesystem::path& file_name) {
auto* ret = new sys_file_t; auto* ret = new sys_file_t;
+29 -31
View File
@@ -5,7 +5,6 @@
#else #else
#include "common/assert.h" #include "common/assert.h"
#include "common/platform/sysVirtual.h"
#include "common/virtualMemory.h" #include "common/virtualMemory.h"
#include <atomic> #include <atomic>
@@ -28,12 +27,12 @@
#define KYTY_FIXED_NOREPLACE #define KYTY_FIXED_NOREPLACE
#endif #endif
namespace Common { namespace Common::VirtualMemory {
static pthread_mutex_t g_virtual_mutex {}; static pthread_mutex_t g_virtual_mutex {};
static std::map<uintptr_t, size_t>* g_allocs = nullptr; static std::map<uintptr_t, size_t>* g_allocs = nullptr;
void SysVirtualInit() { void Init() {
pthread_mutexattr_t attr {}; pthread_mutexattr_t attr {};
pthread_mutexattr_init(&attr); pthread_mutexattr_init(&attr);
@@ -48,19 +47,19 @@ void SysVirtualInit() {
g_allocs = new std::map<uintptr_t, size_t>; g_allocs = new std::map<uintptr_t, size_t>;
} }
static int get_protection_flag(VirtualMemory::Mode mode) { static int get_protection_flag(Mode mode) {
int protect = PROT_NONE; int protect = PROT_NONE;
switch (mode) { switch (mode) {
case VirtualMemory::Mode::Read: protect = PROT_READ; break; case Mode::Read: protect = PROT_READ; break;
case VirtualMemory::Mode::Write: case Mode::Write:
case VirtualMemory::Mode::ReadWrite: protect = PROT_READ | PROT_WRITE; break; // NOLINT case Mode::ReadWrite: protect = PROT_READ | PROT_WRITE; break; // NOLINT
case VirtualMemory::Mode::Execute: protect = PROT_EXEC; break; case Mode::Execute: protect = PROT_EXEC; break;
case VirtualMemory::Mode::ExecuteRead: protect = PROT_EXEC | PROT_READ; break; // NOLINT case Mode::ExecuteRead: protect = PROT_EXEC | PROT_READ; break; // NOLINT
case VirtualMemory::Mode::ExecuteWrite: case Mode::ExecuteWrite:
case VirtualMemory::Mode::ExecuteReadWrite: case Mode::ExecuteReadWrite:
protect = PROT_EXEC | PROT_WRITE | PROT_READ; protect = PROT_EXEC | PROT_WRITE | PROT_READ;
break; // NOLINT break; // NOLINT
case VirtualMemory::Mode::NoAccess: case Mode::NoAccess:
default: protect = PROT_NONE; break; default: protect = PROT_NONE; break;
} }
return protect; return protect;
@@ -130,7 +129,7 @@ static void* map_anonymous(uintptr_t addr, size_t size, int protect, int flags)
return mmap(nullptr, size, protect, flags, -1, 0); // NOLINT return mmap(nullptr, size, protect, flags, -1, 0); // NOLINT
} }
uint64_t SysVirtualAlloc(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { uint64_t Alloc(uint64_t address, uint64_t size, Mode mode) {
EXIT_IF(g_allocs == nullptr); EXIT_IF(g_allocs == nullptr);
auto addr = static_cast<uintptr_t>(address); auto addr = static_cast<uintptr_t>(address);
@@ -154,8 +153,7 @@ static uintptr_t align_up(uintptr_t addr, uint64_t alignment) {
return (addr + alignment - 1) & ~(alignment - 1); return (addr + alignment - 1) & ~(alignment - 1);
} }
uint64_t SysVirtualAllocAligned(uint64_t address, uint64_t size, VirtualMemory::Mode mode, uint64_t AllocAligned(uint64_t address, uint64_t size, Mode mode, uint64_t alignment) {
uint64_t alignment) {
if (alignment == 0) { if (alignment == 0) {
return 0; return 0;
} }
@@ -224,7 +222,7 @@ uint64_t SysVirtualAllocAligned(uint64_t address, uint64_t size, VirtualMemory::
} }
if (ptr == MAP_FAILED) { if (ptr == MAP_FAILED) {
return SysVirtualAllocAligned(address, size, mode, alignment << 1u); return AllocAligned(address, size, mode, alignment << 1u);
} }
pthread_mutex_lock(&g_virtual_mutex); pthread_mutex_lock(&g_virtual_mutex);
@@ -281,7 +279,7 @@ static bool is_mapped(void* ptr, size_t length) {
} }
#endif #endif
bool SysVirtualAllocFixed(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool AllocFixed(uint64_t address, uint64_t size, Mode mode) {
EXIT_IF(g_allocs == nullptr); EXIT_IF(g_allocs == nullptr);
auto addr = static_cast<uintptr_t>(address); auto addr = static_cast<uintptr_t>(address);
@@ -318,15 +316,15 @@ bool SysVirtualAllocFixed(uint64_t address, uint64_t size, VirtualMemory::Mode m
return false; return false;
} }
bool SysVirtualCommit(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool Commit(uint64_t address, uint64_t size, Mode mode) {
return SysVirtualProtect(address, size, mode); return Protect(address, size, mode);
} }
uint64_t SysVirtualReserve(uint64_t address, uint64_t size) { uint64_t Reserve(uint64_t address, uint64_t size) {
return SysVirtualReserveAligned(address, size, 1); return ReserveAligned(address, size, 1);
} }
uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alignment) { uint64_t ReserveAligned(uint64_t address, uint64_t size, uint64_t alignment) {
if (alignment == 0) { if (alignment == 0) {
return 0; return 0;
} }
@@ -395,7 +393,7 @@ uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alig
} }
if (ptr == MAP_FAILED) { if (ptr == MAP_FAILED) {
return SysVirtualReserveAligned(address, size, alignment << 1u); return ReserveAligned(address, size, alignment << 1u);
} }
pthread_mutex_lock(&g_virtual_mutex); pthread_mutex_lock(&g_virtual_mutex);
@@ -405,7 +403,7 @@ uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alig
return ret_addr; return ret_addr;
} }
bool SysVirtualReserveFixed(uint64_t address, uint64_t size) { bool ReserveFixed(uint64_t address, uint64_t size) {
EXIT_IF(g_allocs == nullptr); EXIT_IF(g_allocs == nullptr);
auto addr = static_cast<uintptr_t>(address); auto addr = static_cast<uintptr_t>(address);
@@ -441,9 +439,9 @@ bool SysVirtualReserveFixed(uint64_t address, uint64_t size) {
return false; return false;
} }
bool SysVirtualDecommit(uint64_t address, uint64_t size) { bool Decommit(uint64_t address, uint64_t size) {
// Drop physical pages while preserving the reservation. // Drop physical pages while preserving the reservation.
if (!SysVirtualProtect(address, size, VirtualMemory::Mode::NoAccess)) { if (!Protect(address, size, Mode::NoAccess)) {
return false; return false;
} }
@@ -467,7 +465,7 @@ bool SysVirtualDecommit(uint64_t address, uint64_t size) {
return true; return true;
} }
bool SysVirtualFree(uint64_t address) { bool Free(uint64_t address) {
EXIT_IF(g_allocs == nullptr); EXIT_IF(g_allocs == nullptr);
size_t size = 0; size_t size = 0;
@@ -487,7 +485,7 @@ bool SysVirtualFree(uint64_t address) {
return munmap(reinterpret_cast<void*>(addr), size) == 0; return munmap(reinterpret_cast<void*>(addr), size) == 0;
} }
bool SysVirtualFreeRange(uint64_t address, uint64_t size) { bool FreeRange(uint64_t address, uint64_t size) {
EXIT_IF(g_allocs == nullptr); EXIT_IF(g_allocs == nullptr);
if (size == 0 || (address & 0xfffu) != 0 || (size & 0xfffu) != 0) { if (size == 0 || (address & 0xfffu) != 0 || (size & 0xfffu) != 0) {
return false; return false;
@@ -543,7 +541,7 @@ bool SysVirtualFreeRange(uint64_t address, uint64_t size) {
return true; return true;
} }
bool SysVirtualProtect(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool Protect(uint64_t address, uint64_t size, Mode mode) {
const auto addr = static_cast<uintptr_t>(address); const auto addr = static_cast<uintptr_t>(address);
const auto page_start = addr >> 12u; const auto page_start = addr >> 12u;
const auto page_end = (addr + size - 1) >> 12u; const auto page_end = (addr + size - 1) >> 12u;
@@ -551,10 +549,10 @@ bool SysVirtualProtect(uint64_t address, uint64_t size, VirtualMemory::Mode mode
get_protection_flag(mode)) == 0; get_protection_flag(mode)) == 0;
} }
bool SysVirtualFlushInstructionCache(uint64_t /*address*/, uint64_t /*size*/) { bool FlushInstructionCache(uint64_t /*address*/, uint64_t /*size*/) {
return true; return true;
} }
} // namespace Common } // namespace Common::VirtualMemory
#endif #endif
-53
View File
@@ -1,53 +0,0 @@
#ifndef KYTY_COMMON_PLATFORM_SYSSWAPBYTEORDER_H_
#define KYTY_COMMON_PLATFORM_SYSSWAPBYTEORDER_H_
#include "common/common.h"
#include <type_traits>
inline uint16_t SwapByteOrder16(uint16_t value) {
uint16_t hi = value << 8u;
uint16_t lo = value >> 8u;
return hi | lo;
}
inline uint32_t SwapByteOrder32(uint32_t value) {
return __builtin_bswap32(value);
}
inline uint64_t SwapByteOrder64(uint64_t value) {
return __builtin_bswap64(value);
}
template <typename T>
inline void SwapByteOrder(T& x) {
if (sizeof(x) == 2) {
if (std::is_signed_v<T>) {
x = static_cast<std::make_signed_t<T>>(
SwapByteOrder16(static_cast<std::make_unsigned_t<uint16_t>>(x)));
} else {
x = SwapByteOrder16(x);
}
}
if (sizeof(x) == 4) {
if (std::is_signed_v<T>) {
x = static_cast<std::make_signed_t<T>>(
SwapByteOrder32(static_cast<std::make_unsigned_t<uint32_t>>(x)));
} else {
x = SwapByteOrder32(x);
}
}
if (sizeof(x) == 8) {
if (std::is_signed_v<T>) {
x = static_cast<std::make_signed_t<T>>(
SwapByteOrder64(static_cast<std::make_unsigned_t<uint64_t>>(x)));
} else {
x = SwapByteOrder64(x);
}
}
}
template <typename T>
inline void NoSwapByteOrder(T& x) {}
#endif /* KYTY_COMMON_PLATFORM_SYSSWAPBYTEORDER_H_ */
+1 -5
View File
@@ -151,10 +151,6 @@ inline void SysTimeTToSystem(time_t t, SysTimeStruct& s) {
SysFileToSystemTimeUtc(ft, s); SysFileToSystemTimeUtc(ft, s);
} }
inline time_t SysTimegm(struct tm* tm) {
return timegm(tm);
}
inline void SysSystemToFileTimeUtc(const SysTimeStruct& f, SysFileTimeStruct& t) { inline void SysSystemToFileTimeUtc(const SysTimeStruct& f, SysFileTimeStruct& t) {
struct tm i {}; struct tm i {};
@@ -165,7 +161,7 @@ inline void SysSystemToFileTimeUtc(const SysTimeStruct& f, SysFileTimeStruct& t)
i.tm_min = f.Minute; i.tm_min = f.Minute;
i.tm_sec = f.Second; i.tm_sec = f.Second;
t.is_invalid = (f.is_invalid || (t.time = SysTimegm(&i)) == static_cast<time_t>(-1)); t.is_invalid = (f.is_invalid || (t.time = ::timegm(&i)) == static_cast<time_t>(-1));
} }
// Retrieves the current local date and time. // Retrieves the current local date and time.
-27
View File
@@ -1,27 +0,0 @@
#ifndef KYTY_COMMON_PLATFORM_SYSVIRTUAL_H_
#define KYTY_COMMON_PLATFORM_SYSVIRTUAL_H_
#include "common/common.h"
#include "common/virtualMemory.h"
namespace Common {
void SysVirtualInit();
uint64_t SysVirtualAlloc(uint64_t address, uint64_t size, VirtualMemory::Mode mode);
uint64_t SysVirtualAllocAligned(uint64_t address, uint64_t size, VirtualMemory::Mode mode,
uint64_t alignment);
bool SysVirtualAllocFixed(uint64_t address, uint64_t size, VirtualMemory::Mode mode);
bool SysVirtualCommit(uint64_t address, uint64_t size, VirtualMemory::Mode mode);
uint64_t SysVirtualReserve(uint64_t address, uint64_t size);
uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alignment);
bool SysVirtualReserveFixed(uint64_t address, uint64_t size);
bool SysVirtualDecommit(uint64_t address, uint64_t size);
bool SysVirtualFree(uint64_t address);
bool SysVirtualFreeRange(uint64_t address, uint64_t size);
bool SysVirtualProtect(uint64_t address, uint64_t size, VirtualMemory::Mode mode);
bool SysVirtualFlushInstructionCache(uint64_t address, uint64_t size);
} // namespace Common
#endif /* KYTY_COMMON_PLATFORM_SYSVIRTUAL_H_ */
+1 -4
View File
@@ -14,6 +14,7 @@
#include "common/stringUtils.h" #include "common/stringUtils.h"
#include <cstdlib> #include <cstdlib>
#include <cstring>
#include <vector> #include <vector>
// NOLINTNEXTLINE(readability-identifier-naming) // NOLINTNEXTLINE(readability-identifier-naming)
@@ -135,10 +136,6 @@ void SysFileWrite(const void* data, uint32_t size, sys_file_t& f, uint32_t* byte
} }
} }
void SysFileWrite(uint32_t n, sys_file_t& f) {
SysFileWrite(&n, 4, f);
}
sys_file_t* SysFileCreate(const std::filesystem::path& file_name) { sys_file_t* SysFileCreate(const std::filesystem::path& file_name) {
auto* ret = new sys_file_t; auto* ret = new sys_file_t;
+31 -33
View File
@@ -10,7 +10,6 @@
#include <windows.h> // IWYU pragma: keep #include <windows.h> // IWYU pragma: keep
#include "common/assert.h" #include "common/assert.h"
#include "common/platform/sysVirtual.h"
#include "common/virtualMemory.h" #include "common/virtualMemory.h"
// IWYU pragma: no_include <basetsd.h> // IWYU pragma: no_include <basetsd.h>
@@ -22,33 +21,33 @@
// IWYU pragma: no_include <winerror.h> // IWYU pragma: no_include <winerror.h>
// IWYU pragma: no_include <wtypes.h> // IWYU pragma: no_include <wtypes.h>
namespace Common { namespace Common::VirtualMemory {
static DWORD GetProtectionFlag(VirtualMemory::Mode mode) { static DWORD GetProtectionFlag(Mode mode) {
DWORD protect = PAGE_NOACCESS; DWORD protect = PAGE_NOACCESS;
switch (mode) { switch (mode) {
case VirtualMemory::Mode::Read: protect = PAGE_READONLY; break; case Mode::Read: protect = PAGE_READONLY; break;
case VirtualMemory::Mode::Write: case Mode::Write:
case VirtualMemory::Mode::ReadWrite: protect = PAGE_READWRITE; break; case Mode::ReadWrite: protect = PAGE_READWRITE; break;
case VirtualMemory::Mode::Execute: protect = PAGE_EXECUTE; break; case Mode::Execute: protect = PAGE_EXECUTE; break;
case VirtualMemory::Mode::ExecuteRead: protect = PAGE_EXECUTE_READ; break; case Mode::ExecuteRead: protect = PAGE_EXECUTE_READ; break;
case VirtualMemory::Mode::ExecuteWrite: case Mode::ExecuteWrite:
case VirtualMemory::Mode::ExecuteReadWrite: protect = PAGE_EXECUTE_READWRITE; break; case Mode::ExecuteReadWrite: protect = PAGE_EXECUTE_READWRITE; break;
case VirtualMemory::Mode::NoAccess: case Mode::NoAccess:
default: protect = PAGE_NOACCESS; break; default: protect = PAGE_NOACCESS; break;
} }
return protect; return protect;
} }
void SysVirtualInit() {} void Init() {}
uint64_t SysVirtualAlloc(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { uint64_t Alloc(uint64_t address, uint64_t size, Mode mode) {
auto ptr = (address == 0 ? SysVirtualAllocAligned(address, size, mode, 1) auto ptr = (address == 0 ? AllocAligned(address, size, mode, 1)
: reinterpret_cast<uintptr_t>(VirtualAlloc( : reinterpret_cast<uintptr_t>(VirtualAlloc(
reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
static_cast<DWORD>(MEM_COMMIT) | static_cast<DWORD>(MEM_RESERVE), static_cast<DWORD>(MEM_COMMIT) | static_cast<DWORD>(MEM_RESERVE),
@@ -59,7 +58,7 @@ uint64_t SysVirtualAlloc(uint64_t address, uint64_t size, VirtualMemory::Mode mo
if (err != ERROR_INVALID_ADDRESS) { if (err != ERROR_INVALID_ADDRESS) {
printf("VirtualAlloc() failed: 0x%08" PRIx32 "\n", err); printf("VirtualAlloc() failed: 0x%08" PRIx32 "\n", err);
} else { } else {
return SysVirtualAllocAligned(address, size, mode, 1); return AllocAligned(address, size, mode, 1);
} }
} }
return ptr; return ptr;
@@ -80,8 +79,7 @@ static uint64_t AlignUp(uint64_t addr, uint64_t alignment) {
return (addr + alignment - 1) & ~(alignment - 1); return (addr + alignment - 1) & ~(alignment - 1);
} }
uint64_t SysVirtualAllocAligned(uint64_t address, uint64_t size, VirtualMemory::Mode mode, uint64_t AllocAligned(uint64_t address, uint64_t size, Mode mode, uint64_t alignment) {
uint64_t alignment) {
if (alignment == 0) { if (alignment == 0) {
printf("VirtualAlloc2 failed: 0x%08" PRIx32 "\n", static_cast<uint32_t>(GetLastError())); printf("VirtualAlloc2 failed: 0x%08" PRIx32 "\n", static_cast<uint32_t>(GetLastError()));
return 0; return 0;
@@ -135,13 +133,13 @@ uint64_t SysVirtualAllocAligned(uint64_t address, uint64_t size, VirtualMemory::
printf("VirtualAlloc2(alignment = 0x%016" PRIx64 ") failed: 0x%08" PRIx32 "\n", printf("VirtualAlloc2(alignment = 0x%016" PRIx64 ") failed: 0x%08" PRIx32 "\n",
alignment, err); alignment, err);
} else { } else {
return SysVirtualAllocAligned(address, size, mode, alignment << 1u); return AllocAligned(address, size, mode, alignment << 1u);
} }
} }
return ptr; return ptr;
} }
bool SysVirtualAllocFixed(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool AllocFixed(uint64_t address, uint64_t size, Mode mode) {
auto ptr = reinterpret_cast<uintptr_t>(VirtualAlloc( auto ptr = reinterpret_cast<uintptr_t>(VirtualAlloc(
reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
static_cast<DWORD>(MEM_COMMIT) | static_cast<DWORD>(MEM_RESERVE), GetProtectionFlag(mode))); static_cast<DWORD>(MEM_COMMIT) | static_cast<DWORD>(MEM_RESERVE), GetProtectionFlag(mode)));
@@ -161,7 +159,7 @@ bool SysVirtualAllocFixed(uint64_t address, uint64_t size, VirtualMemory::Mode m
return true; return true;
} }
bool SysVirtualCommit(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool Commit(uint64_t address, uint64_t size, Mode mode) {
auto ptr = reinterpret_cast<uintptr_t>( auto ptr = reinterpret_cast<uintptr_t>(
VirtualAlloc(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, VirtualAlloc(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
static_cast<DWORD>(MEM_COMMIT), GetProtectionFlag(mode))); static_cast<DWORD>(MEM_COMMIT), GetProtectionFlag(mode)));
@@ -179,8 +177,8 @@ bool SysVirtualCommit(uint64_t address, uint64_t size, VirtualMemory::Mode mode)
return true; return true;
} }
uint64_t SysVirtualReserve(uint64_t address, uint64_t size) { uint64_t Reserve(uint64_t address, uint64_t size) {
auto ptr = (address == 0 ? SysVirtualReserveAligned(address, size, 1) auto ptr = (address == 0 ? ReserveAligned(address, size, 1)
: reinterpret_cast<uintptr_t>(VirtualAlloc( : reinterpret_cast<uintptr_t>(VirtualAlloc(
reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
static_cast<DWORD>(MEM_RESERVE), PAGE_NOACCESS))); static_cast<DWORD>(MEM_RESERVE), PAGE_NOACCESS)));
@@ -190,13 +188,13 @@ uint64_t SysVirtualReserve(uint64_t address, uint64_t size) {
if (err != ERROR_INVALID_ADDRESS) { if (err != ERROR_INVALID_ADDRESS) {
printf("VirtualAlloc(MEM_RESERVE) failed: 0x%08" PRIx32 "\n", err); printf("VirtualAlloc(MEM_RESERVE) failed: 0x%08" PRIx32 "\n", err);
} else { } else {
return SysVirtualReserveAligned(address, size, 1); return ReserveAligned(address, size, 1);
} }
} }
return ptr; return ptr;
} }
uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alignment) { uint64_t ReserveAligned(uint64_t address, uint64_t size, uint64_t alignment) {
if (alignment == 0) { if (alignment == 0) {
printf("VirtualAlloc2(MEM_RESERVE) failed: 0x%08" PRIx32 "\n", printf("VirtualAlloc2(MEM_RESERVE) failed: 0x%08" PRIx32 "\n",
static_cast<uint32_t>(GetLastError())); static_cast<uint32_t>(GetLastError()));
@@ -250,13 +248,13 @@ uint64_t SysVirtualReserveAligned(uint64_t address, uint64_t size, uint64_t alig
"\n", "\n",
alignment, err); alignment, err);
} else { } else {
return SysVirtualReserveAligned(address, size, alignment << 1u); return ReserveAligned(address, size, alignment << 1u);
} }
} }
return ptr; return ptr;
} }
bool SysVirtualReserveFixed(uint64_t address, uint64_t size) { bool ReserveFixed(uint64_t address, uint64_t size) {
auto ptr = reinterpret_cast<uintptr_t>( auto ptr = reinterpret_cast<uintptr_t>(
VirtualAlloc(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, VirtualAlloc(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
static_cast<DWORD>(MEM_RESERVE), PAGE_NOACCESS)); static_cast<DWORD>(MEM_RESERVE), PAGE_NOACCESS));
@@ -276,7 +274,7 @@ bool SysVirtualReserveFixed(uint64_t address, uint64_t size) {
return true; return true;
} }
bool SysVirtualDecommit(uint64_t address, uint64_t size) { bool Decommit(uint64_t address, uint64_t size) {
if (VirtualFree(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, if (VirtualFree(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
MEM_DECOMMIT) == 0) { MEM_DECOMMIT) == 0) {
printf("VirtualFree(MEM_DECOMMIT) failed: 0x%08" PRIx32 "\n", printf("VirtualFree(MEM_DECOMMIT) failed: 0x%08" PRIx32 "\n",
@@ -286,7 +284,7 @@ bool SysVirtualDecommit(uint64_t address, uint64_t size) {
return true; return true;
} }
bool SysVirtualFree(uint64_t address) { bool Free(uint64_t address) {
if (VirtualFree(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), 0, MEM_RELEASE) == if (VirtualFree(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), 0, MEM_RELEASE) ==
0) { 0) {
printf("VirtualFree() failed: 0x%08" PRIx32 "\n", static_cast<uint32_t>(GetLastError())); printf("VirtualFree() failed: 0x%08" PRIx32 "\n", static_cast<uint32_t>(GetLastError()));
@@ -295,7 +293,7 @@ bool SysVirtualFree(uint64_t address) {
return true; return true;
} }
bool SysVirtualFreeRange(uint64_t address, uint64_t size) { bool FreeRange(uint64_t address, uint64_t size) {
if (address == 0 || size == 0) { if (address == 0 || size == 0) {
return false; return false;
} }
@@ -313,10 +311,10 @@ bool SysVirtualFreeRange(uint64_t address, uint64_t size) {
} }
current = next; current = next;
} }
return current - address == size && SysVirtualFree(address); return current - address == size && Free(address);
} }
bool SysVirtualProtect(uint64_t address, uint64_t size, VirtualMemory::Mode mode) { bool Protect(uint64_t address, uint64_t size, Mode mode) {
DWORD old_protect = 0; DWORD old_protect = 0;
if (VirtualProtect(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size, if (VirtualProtect(reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), size,
GetProtectionFlag(mode), &old_protect) == 0) { GetProtectionFlag(mode), &old_protect) == 0) {
@@ -326,7 +324,7 @@ bool SysVirtualProtect(uint64_t address, uint64_t size, VirtualMemory::Mode mode
return true; return true;
} }
bool SysVirtualFlushInstructionCache(uint64_t address, uint64_t size) { bool FlushInstructionCache(uint64_t address, uint64_t size) {
if (::FlushInstructionCache(GetCurrentProcess(), if (::FlushInstructionCache(GetCurrentProcess(),
reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)), reinterpret_cast<LPVOID>(static_cast<uintptr_t>(address)),
size) == 0) { size) == 0) {
@@ -337,6 +335,6 @@ bool SysVirtualFlushInstructionCache(uint64_t address, uint64_t size) {
return true; return true;
} }
} // namespace Common } // namespace Common::VirtualMemory
#endif #endif
-63
View File
@@ -1,63 +0,0 @@
#include "common/virtualMemory.h"
#include "common/platform/sysVirtual.h"
namespace Common {
namespace VirtualMemory {
void Init() {
SysVirtualInit();
}
uint64_t Alloc(uint64_t address, uint64_t size, Mode mode) {
return SysVirtualAlloc(address, size, mode);
}
uint64_t AllocAligned(uint64_t address, uint64_t size, Mode mode, uint64_t alignment) {
return SysVirtualAllocAligned(address, size, mode, alignment);
}
bool AllocFixed(uint64_t address, uint64_t size, Mode mode) {
return SysVirtualAllocFixed(address, size, mode);
}
bool Commit(uint64_t address, uint64_t size, Mode mode) {
return SysVirtualCommit(address, size, mode);
}
uint64_t Reserve(uint64_t address, uint64_t size) {
return SysVirtualReserve(address, size);
}
uint64_t ReserveAligned(uint64_t address, uint64_t size, uint64_t alignment) {
return SysVirtualReserveAligned(address, size, alignment);
}
bool ReserveFixed(uint64_t address, uint64_t size) {
return SysVirtualReserveFixed(address, size);
}
bool Decommit(uint64_t address, uint64_t size) {
return SysVirtualDecommit(address, size);
}
bool Free(uint64_t address) {
return SysVirtualFree(address);
}
bool FreeRange(uint64_t address, uint64_t size) {
return SysVirtualFreeRange(address, size);
}
bool Protect(uint64_t address, uint64_t size, Mode mode) {
return SysVirtualProtect(address, size, mode);
}
bool FlushInstructionCache(uint64_t address, uint64_t size) {
return SysVirtualFlushInstructionCache(address, size);
}
} // namespace VirtualMemory
} // namespace Common