Skip to content

Commit

Permalink
MFH: r446352
Browse files Browse the repository at this point in the history
emulators/{ppsspp,rpcs3}: switch to MAP_32BIT

This may slightly improve JIT stability.

Approved by:	ports-secteam (miwi)
  • Loading branch information
jbeich committed Jul 27, 2017
1 parent a9299dc commit 78837aa
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 57 deletions.
2 changes: 1 addition & 1 deletion emulators/ppsspp/Makefile
Expand Up @@ -3,7 +3,7 @@
PORTNAME= ppsspp
DISTVERSIONPREFIX= v
DISTVERSION?= 1.4.2
PORTREVISION?= 0
PORTREVISION?= 1
CATEGORIES= emulators
# XXX Get from Debian once #697821 lands
MASTER_SITES= https://bazaar.launchpad.net/~sergio-br2/${PORTNAME}/debian-sdl/download/5/${PORTNAME}.1-20140802045408-dd26dik367ztj5xg-8/:manpage
Expand Down
58 changes: 27 additions & 31 deletions emulators/ppsspp/files/patch-Common_MemoryUtil.cpp
@@ -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);
1 change: 1 addition & 0 deletions emulators/rpcs3/Makefile
Expand Up @@ -3,6 +3,7 @@
PORTNAME= rpcs3
DISTVERSIONPREFIX= v
DISTVERSION= 0.0.3
PORTREVISION= 1
CATEGORIES= emulators

MAINTAINER= jbeich@FreeBSD.org
Expand Down
48 changes: 23 additions & 25 deletions emulators/rpcs3/files/patch-Utilities_JIT.cpp
@@ -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);
}();

0 comments on commit 78837aa

Please sign in to comment.