Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
emulators/{ppsspp,rpcs3}: switch to MAP_32BIT This may slightly improve JIT stability. Approved by: ports-secteam (miwi)
- Loading branch information
Showing
4 changed files
with
52 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,31 @@ | ||
--- Common/MemoryUtil.cpp.orig 2015-11-19 15:07:48 UTC | ||
https://github.com/hrydgard/ppsspp/pull/9857 | ||
|
||
--- Common/MemoryUtil.cpp.orig 2017-05-27 09:58:05 UTC | ||
+++ Common/MemoryUtil.cpp | ||
@@ -32,6 +32,10 @@ | ||
#include <mach/vm_param.h> | ||
@@ -154,7 +154,7 @@ void *AllocateExecutableMemory(size_t size) { | ||
} | ||
#else | ||
static char *map_hint = 0; | ||
-#if defined(_M_X64) | ||
+#if defined(_M_X64) && !defined(MAP_32BIT) | ||
// Try to request one that is close to our memory location if we're in high memory. | ||
// We use a dummy global variable to give us a good location to start from. | ||
if (!map_hint) { | ||
@@ -176,7 +176,7 @@ void *AllocateExecutableMemory(size_t size) { | ||
void* ptr = mmap(map_hint, size, prot, | ||
MAP_ANON | MAP_PRIVATE | ||
#if defined(_M_X64) && defined(MAP_32BIT) | ||
- | ((uintptr_t) map_hint == 0 ? MAP_32BIT : 0) | ||
+ | MAP_32BIT | ||
#endif | ||
, -1, 0); | ||
|
||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) | ||
+#include <sys/resource.h> | ||
+#endif | ||
+ | ||
#ifndef _WIN32 | ||
#include <unistd.h> | ||
#endif | ||
@@ -149,6 +153,21 @@ void *AllocateExecutableMemory(size_t si | ||
map_hint = (char*)round_page(&hint_location) - 0x20000000; // 0.5gb lower than our approximate location | ||
else | ||
map_hint = (char*)0x20000000; // 0.5GB mark in memory | ||
+ | ||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) | ||
+ // XXX Fix maximum data segment size (data + BSS + heap) to 256 MB. | ||
+ // This allows avoiding calling mmap(2) with MAP_FIXED. | ||
+ // On FreeBSD, without lowering this limit, calling mmap(2) | ||
+ // without MAP_FIXED will result in getting an address just | ||
+ // beyond maximum data segment size which will be far beyond | ||
+ // the desired 2 GB. | ||
+ struct rlimit limit; | ||
+ limit.rlim_cur = 0x10000000; // 256 MB | ||
+ limit.rlim_max = 0x10000000; | ||
+ if(setrlimit(RLIMIT_DATA, &limit) != 0) { | ||
+ PanicAlert("Failed to lower maximum data segment size"); | ||
+ } | ||
+#endif | ||
@@ -193,7 +193,7 @@ void *AllocateExecutableMemory(size_t size) { | ||
ERROR_LOG(MEMMAP, "Failed to allocate executable memory (%d)", (int)size); | ||
PanicAlert("Failed to allocate executable memory\n%s", GetLastErrorMsg()); | ||
} | ||
else if ((uintptr_t) map_hint > 0xFFFFFFFFULL) | ||
{ | ||
-#if defined(_M_X64) && !defined(_WIN32) | ||
+#if defined(_M_X64) && !defined(MAP_32BIT) && !defined(_WIN32) | ||
else if ((uintptr_t)map_hint <= 0xFFFFFFFF) { | ||
// Round up if we're below 32-bit mark, probably allocating sequentially. | ||
map_hint += round_page(size); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,35 +1,33 @@ | ||
--- Utilities/JIT.cpp.orig 2017-07-10 15:42:02 UTC | ||
FreeBSD ignores address hints with default RLIMIT_DATA | ||
|
||
--- Utilities/JIT.cpp.orig 2017-07-20 15:05:34 UTC | ||
+++ Utilities/JIT.cpp | ||
@@ -31,6 +31,10 @@ | ||
@@ -30,6 +30,8 @@ | ||
|
||
#ifdef _WIN32 | ||
#include <Windows.h> | ||
+#else | ||
+#include <sys/mman.h> | ||
#endif | ||
|
||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) | ||
+#include <sys/resource.h> | ||
+#endif | ||
+ | ||
#include "JIT.h" | ||
|
||
// Memory manager mutex | ||
@@ -45,6 +49,21 @@ static void* const s_memory = []() -> void* | ||
llvm::InitializeNativeTarget(); | ||
@@ -47,6 +49,11 @@ static void* const s_memory = []() -> void* | ||
llvm::InitializeNativeTargetAsmPrinter(); | ||
LLVMLinkInMCJIT(); | ||
+ | ||
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) | ||
+ // XXX Fix maximum data segment size (data + BSS + heap) to 256 MB. | ||
+ // This allows avoiding calling mmap(2) with MAP_FIXED. | ||
+ // On FreeBSD, without lowering this limit, calling mmap(2) | ||
+ // without MAP_FIXED will result in getting an address just | ||
+ // beyond maximum data segment size which will be far beyond | ||
+ // the desired 2 GB. | ||
+ struct rlimit limit; | ||
+ limit.rlim_cur = 0x10000000; // 256 MB | ||
+ limit.rlim_max = 0x10000000; | ||
+ if(setrlimit(RLIMIT_DATA, &limit) != 0) { | ||
+ LOG_ERROR(GENERAL, "LLVM: Failed to lower maximum data segment size"); | ||
+ } | ||
+#endif | ||
|
||
+#ifdef MAP_32BIT | ||
+ auto ptr = ::mmap(nullptr, s_memory_size, PROT_NONE, MAP_ANON | MAP_PRIVATE | MAP_32BIT, -1, 0); | ||
+ if (ptr != MAP_FAILED) | ||
+ return ptr; | ||
+#else | ||
for (u64 addr = 0x10000000; addr <= 0x80000000 - s_memory_size; addr += 0x1000000) | ||
{ | ||
if (auto ptr = utils::memory_reserve(s_memory_size, (void*)addr)) | ||
@@ -54,6 +61,7 @@ static void* const s_memory = []() -> void* | ||
return ptr; | ||
} | ||
} | ||
+#endif | ||
|
||
return utils::memory_reserve(s_memory_size); | ||
}(); |