Use the mach memory functions on Mac and 32-bit iOS as well.

This commit is contained in:
Henrik Rydgård 2017-01-25 20:34:57 +01:00
parent 98e0ccf1e1
commit b9bbee5c85
7 changed files with 39 additions and 19 deletions

View file

@ -97,6 +97,7 @@ public:
// Call this when shutting down. Don't rely on the destructor, even though it'll do the job.
void FreeCodeSpace() {
ProtectMemoryPages(region, region_size, MEM_PROT_READ | MEM_PROT_WRITE);
FreeMemoryPages(region, region_size);
region = nullptr;
region_size = 0;

View file

@ -295,6 +295,7 @@
<ClCompile Include="MemArenaAndroid.cpp" />
<ClCompile Include="MemArenaPosix.cpp" />
<ClCompile Include="MemArenaWin32.cpp" />
<ClCompile Include="MemArenaDarwin.cpp" />
<ClCompile Include="MemoryUtil.cpp" />
<ClCompile Include="MipsEmitter.cpp" />
<ClCompile Include="Misc.cpp" />
@ -325,4 +326,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

View file

@ -134,6 +134,7 @@
<ClCompile Include="MemArenaPosix.cpp" />
<ClCompile Include="MemArenaWin32.cpp" />
<ClCompile Include="MemArenaAndroid.cpp" />
<ClCompile Include="MemArenaDarwin.cpp" />
</ItemGroup>
<ItemGroup>
<Filter Include="Crypto">
@ -149,4 +150,4 @@
<UniqueIdentifier>{c14d66ef-5f7c-4565-975a-72774e7ccfb9}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>
</Project>

View file

@ -21,6 +21,8 @@
#ifdef _WIN32
#include "CommonWindows.h"
#elif defined(__APPLE__)
#include <mach/mach.h>
#endif
#include "Common.h"
@ -47,9 +49,9 @@ private:
#ifdef _WIN32
HANDLE hMemoryMapping;
SYSTEM_INFO sysInfo;
#elif defined(IOS) && PPSSPP_ARCH(ARM64)
#elif defined(__APPLE__)
size_t vm_size;
uintptr_t vm_mem; // same type as vm_address_t
vm_address_t vm_mem; // same type as vm_address_t
#else
int fd;
#endif

View file

@ -17,7 +17,7 @@
#include "ppsspp_config.h"
#if defined(IOS) && PPSSPP_ARCH(ARM64)
#if defined(__APPLE__)
#include <string>
#include <inttypes.h>
@ -39,8 +39,7 @@ size_t MemArena::roundup(size_t x) {
return x;
}
void MemArena::GrabLowMemSpace(size_t size)
{
void MemArena::GrabLowMemSpace(size_t size) {
vm_size = size;
kern_return_t retval = vm_allocate(mach_task_self(), &vm_mem, size, VM_FLAGS_ANYWHERE);
if (retval != KERN_SUCCESS) {
@ -56,8 +55,7 @@ void MemArena::ReleaseSpace() {
vm_mem = 0;
}
void *MemArena::CreateView(s64 offset, size_t size, void *base)
{
void *MemArena::CreateView(s64 offset, size_t size, void *base) {
mach_port_t self = mach_task_self();
vm_address_t target = (vm_address_t)base;
uint64_t mask = 0;
@ -86,12 +84,34 @@ void MemArena::ReleaseView(void* view, size_t size) {
}
bool MemArena::NeedsProbing() {
#if defined(IOS) && PPSSPP_ARCH(64BIT)
return true;
#else
return false;
#endif
}
u8* MemArena::Find4GBBase() {
#if defined(IOS) && PPSSPP_ARCH(64BIT)
// The caller will need to do probing, like on 32-bit Windows.
return nullptr;
#else
size_t size;
#if PPSSPP_ARCH(64BIT)
size = 0xE1000000;
#else
size = 0x10000000;
#endif
vm_address_t addr = 0;
kern_return_t retval = vm_allocate(mach_task_self(), &addr, size, VM_FLAGS_ANYWHERE);
if (retval == KERN_SUCCESS) {
// Don't need the memory now, was just probing.
vm_deallocate(mach_task_self(), addr, size);
return (u8 *)addr;
}
#endif
return nullptr;
}
#endif // defined(IOS) && PPSSPP_ARCH(ARM64)
#endif // __APPLE__

View file

@ -17,7 +17,7 @@
#include "ppsspp_config.h"
#if !defined(_WIN32) && !defined(ANDROID) && !(defined(IOS) && PPSSPP_ARCH(ARM64))
#if !defined(_WIN32) && !defined(ANDROID) && !defined(__APPLE__)
#include <string>
@ -107,13 +107,14 @@ u8* MemArena::Find4GBBase() {
// This makes the Windows approach above unusable on Linux, so we will simply pray...
return reinterpret_cast<u8*>(0x2300000000ULL);
#else
void* base = mmap(0, 0x10000000, PROT_READ | PROT_WRITE,
size_t size = 0x10000000;
void* base = mmap(0, size, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_SHARED, -1, 0);
if (base == MAP_FAILED) {
PanicAlert("Failed to map 256 MB of memory space: %s", strerror(errno));
return 0;
}
munmap(base, 0x10000000);
munmap(base, size);
return static_cast<u8*>(base);
#endif
}

View file

@ -52,7 +52,6 @@ bool simulateAnalog = false;
extern ScreenManager *screenManager;
InputState input_state;
extern std::string ram_temp_file;
extern bool iosCanUseJit;
extern bool targetIsJailbroken;
@ -97,11 +96,6 @@ static GraphicsContext *graphicsContext;
net::Init();
#if defined(IOS) && PPSSPP_ARCH(ARM64)
#else
ram_temp_file = [[NSTemporaryDirectory() stringByAppendingPathComponent:@"ram_tmp.file"] fileSystemRepresentation];
#endif
iosCanUseJit = true;
targetIsJailbroken = false;
NSArray *jailPath = [NSArray arrayWithObjects: