mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 13:56:59 +01:00
remove the extra virtual memory layer
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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_ */
|
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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_ */
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user