|
|
|
@ -20,6 +20,7 @@
|
|
|
|
|
#include "common/logging/log.h"
|
|
|
|
|
#include "common/mem_arena.h"
|
|
|
|
|
#include "common/memory_util.h"
|
|
|
|
|
#include "common/platform.h"
|
|
|
|
|
#include "common/string_util.h"
|
|
|
|
|
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
@ -198,7 +199,7 @@ void MemArena::ReleaseView(void* view, size_t size)
|
|
|
|
|
|
|
|
|
|
u8* MemArena::Find4GBBase()
|
|
|
|
|
{
|
|
|
|
|
#ifdef _M_X64
|
|
|
|
|
#if EMU_ARCH_BITS == 64
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
// 64 bit
|
|
|
|
|
u8* base = (u8*)VirtualAlloc(0, 0xE1000000, MEM_RESERVE, PAGE_READWRITE);
|
|
|
|
@ -269,7 +270,7 @@ static bool Memory_TryBase(u8 *base, const MemoryView *views, int num_views, u32
|
|
|
|
|
if (!*view.out_ptr_low)
|
|
|
|
|
goto bail;
|
|
|
|
|
}
|
|
|
|
|
#ifdef _M_X64
|
|
|
|
|
#if EMU_ARCH_BITS == 64
|
|
|
|
|
*view.out_ptr = (u8*)arena->CreateView(
|
|
|
|
|
position, view.size, base + view.virtual_address);
|
|
|
|
|
#else
|
|
|
|
@ -305,7 +306,7 @@ bail:
|
|
|
|
|
}
|
|
|
|
|
if (*views[j].out_ptr)
|
|
|
|
|
{
|
|
|
|
|
#ifdef _M_X64
|
|
|
|
|
#if EMU_ARCH_BITS == 64
|
|
|
|
|
arena->ReleaseView(*views[j].out_ptr, views[j].size);
|
|
|
|
|
#else
|
|
|
|
|
if (!(views[j].flags & MV_MIRROR_PREVIOUS))
|
|
|
|
@ -336,7 +337,7 @@ u8 *MemoryMap_Setup(const MemoryView *views, int num_views, u32 flags, MemArena
|
|
|
|
|
arena->GrabLowMemSpace(total_mem);
|
|
|
|
|
|
|
|
|
|
// Now, create views in high memory where there's plenty of space.
|
|
|
|
|
#ifdef _M_X64
|
|
|
|
|
#if EMU_ARCH_BITS == 64
|
|
|
|
|
u8 *base = MemArena::Find4GBBase();
|
|
|
|
|
// This really shouldn't fail - in 64-bit, there will always be enough
|
|
|
|
|
// address space.
|
|
|
|
|