Implement utils::c_page_size (unused)

Query platform memory page size.
This commit is contained in:
Nekotekina 2022-05-31 17:12:17 +03:00 committed by Ivan
parent 76c72351a5
commit b0ccd2a8a0
2 changed files with 33 additions and 9 deletions

View file

@ -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
{ {

View file

@ -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
} }