mirror of https://github.com/RPCS3/rpcs3.git
SPU/Linux: Ensure aligned 64k allocations in utils::memory_reserve
This commit is contained in:
parent
c37bc3c55c
commit
0d8152cd4e
|
@ -63,6 +63,17 @@ namespace utils
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
return ::VirtualAlloc(use_addr, size, MEM_RESERVE, PAGE_NOACCESS);
|
return ::VirtualAlloc(use_addr, size, MEM_RESERVE, PAGE_NOACCESS);
|
||||||
#else
|
#else
|
||||||
|
if (use_addr && reinterpret_cast<uptr>(use_addr) % 0x10000)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!use_addr)
|
||||||
|
{
|
||||||
|
// Hack: Ensure aligned 64k allocations
|
||||||
|
size += 0x10000;
|
||||||
|
}
|
||||||
|
|
||||||
auto ptr = ::mmap(use_addr, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
auto ptr = ::mmap(use_addr, size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||||
|
|
||||||
if (ptr == reinterpret_cast<void*>(-1))
|
if (ptr == reinterpret_cast<void*>(-1))
|
||||||
|
@ -76,6 +87,20 @@ namespace utils
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!use_addr && ptr)
|
||||||
|
{
|
||||||
|
// Continuation of the hack above
|
||||||
|
const auto misalign = reinterpret_cast<uptr>(ptr) % 0x10000;
|
||||||
|
::munmap(ptr, 0x10000 - misalign);
|
||||||
|
|
||||||
|
if (misalign)
|
||||||
|
{
|
||||||
|
::munmap(static_cast<u8*>(ptr) + size - misalign, misalign);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = static_cast<u8*>(ptr) + (0x10000 - misalign);
|
||||||
|
}
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue