mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 15:31:26 +12:00
Implement utils::c_page_size (unused)
Query platform memory page size.
This commit is contained in:
parent
76c72351a5
commit
b0ccd2a8a0
2 changed files with 33 additions and 9 deletions
|
@ -11,6 +11,12 @@ namespace utils
|
||||||
using native_handle = int;
|
using native_handle = int;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Obtain system page size
|
||||||
|
long get_page_size();
|
||||||
|
|
||||||
|
// System page size
|
||||||
|
inline const long c_page_size = get_page_size();
|
||||||
|
|
||||||
// Memory protection type
|
// Memory protection type
|
||||||
enum class protection
|
enum class protection
|
||||||
{
|
{
|
||||||
|
|
|
@ -89,6 +89,24 @@ namespace utils
|
||||||
DYNAMIC_IMPORT("KernelBase.dll", MapViewOfFile3, PVOID(HANDLE Handle, HANDLE Process, PVOID Base, ULONG64 Off, SIZE_T ViewSize, ULONG AllocType, ULONG Prot, MEM_EXTENDED_PARAMETER*, ULONG));
|
DYNAMIC_IMPORT("KernelBase.dll", MapViewOfFile3, PVOID(HANDLE Handle, HANDLE Process, PVOID Base, ULONG64 Off, SIZE_T ViewSize, ULONG AllocType, ULONG Prot, MEM_EXTENDED_PARAMETER*, ULONG));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
long get_page_size()
|
||||||
|
{
|
||||||
|
static const long r = []() -> long
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
SYSTEM_INFO info;
|
||||||
|
::GetSystemInfo(&info);
|
||||||
|
return info.dwPageSize;
|
||||||
|
#else
|
||||||
|
return ::sysconf(_SC_PAGESIZE);
|
||||||
|
#endif
|
||||||
|
}();
|
||||||
|
|
||||||
|
ensure(r > 0 && r <= 0x10000);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert memory protection (internal)
|
// Convert memory protection (internal)
|
||||||
static auto operator +(protection prot)
|
static auto operator +(protection prot)
|
||||||
{
|
{
|
||||||
|
@ -189,15 +207,15 @@ namespace utils
|
||||||
ensure(::VirtualAlloc(pointer, size, MEM_COMMIT, +prot));
|
ensure(::VirtualAlloc(pointer, size, MEM_COMMIT, +prot));
|
||||||
#else
|
#else
|
||||||
const u64 ptr64 = reinterpret_cast<u64>(pointer);
|
const u64 ptr64 = reinterpret_cast<u64>(pointer);
|
||||||
ensure(::mprotect(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), +prot) != -1);
|
ensure(::mprotect(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), +prot) != -1);
|
||||||
|
|
||||||
if constexpr (c_madv_dump != 0)
|
if constexpr (c_madv_dump != 0)
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), c_madv_dump) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), c_madv_dump) != -1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), MADV_WILLNEED) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), MADV_WILLNEED) != -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -212,11 +230,11 @@ namespace utils
|
||||||
|
|
||||||
if constexpr (c_madv_no_dump != 0)
|
if constexpr (c_madv_no_dump != 0)
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), c_madv_no_dump) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), c_madv_no_dump) != -1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), c_madv_free) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), c_madv_free) != -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -234,17 +252,17 @@ namespace utils
|
||||||
{
|
{
|
||||||
if (size % 0x200000 == 0)
|
if (size % 0x200000 == 0)
|
||||||
{
|
{
|
||||||
::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), c_madv_hugepage);
|
::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), c_madv_hugepage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (c_madv_dump != 0)
|
if constexpr (c_madv_dump != 0)
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), c_madv_dump) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), c_madv_dump) != -1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), MADV_WILLNEED) != -1);
|
ensure(::madvise(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), MADV_WILLNEED) != -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -283,7 +301,7 @@ namespace utils
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
const u64 ptr64 = reinterpret_cast<u64>(pointer);
|
const u64 ptr64 = reinterpret_cast<u64>(pointer);
|
||||||
ensure(::mprotect(reinterpret_cast<void*>(ptr64 & -4096), size + (ptr64 & 4095), +prot) != -1);
|
ensure(::mprotect(reinterpret_cast<void*>(ptr64 & -c_page_size), size + (ptr64 & (c_page_size - 1)), +prot) != -1);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue