diff options
Diffstat (limited to 'Source/Core/Common/MemArena.cpp')
| -rw-r--r-- | Source/Core/Common/MemArena.cpp | 115 |
1 files changed, 0 insertions, 115 deletions
diff --git a/Source/Core/Common/MemArena.cpp b/Source/Core/Common/MemArena.cpp index 8112dbef8e..ce6cc2662e 100644 --- a/Source/Core/Common/MemArena.cpp +++ b/Source/Core/Common/MemArena.cpp @@ -157,118 +157,3 @@ u8* MemArena::FindMemoryBase() return static_cast<u8*>(base); #endif } - -// yeah, this could also be done in like two bitwise ops... -#define SKIP(a_flags, b_flags) \ - if (!(a_flags & MV_WII_ONLY) && (b_flags & MV_WII_ONLY)) \ - continue; \ - if (!(a_flags & MV_FAKE_VMEM) && (b_flags & MV_FAKE_VMEM)) \ - continue; - -static bool Memory_TryBase(u8* base, MemoryView* views, int num_views, u32 flags, MemArena* arena) -{ - // OK, we know where to find free space. Now grab it! - // We just mimic the popular BAT setup. - - int i; - for (i = 0; i < num_views; i++) - { - MemoryView* view = &views[i]; - void* view_base; - bool use_sw_mirror; - - SKIP(flags, view->flags); - -#if _ARCH_64 - // On 64-bit, we map the same file position multiple times, so we - // don't need the software fallback for the mirrors. - view_base = base + view->virtual_address; - use_sw_mirror = false; -#else - // On 32-bit, we don't have the actual address space to store all - // the mirrors, so we just map the fallbacks somewhere in our address - // space and use the software fallbacks for mirroring. - view_base = base + (view->virtual_address & 0x3FFFFFFF); - use_sw_mirror = true; -#endif - - if (use_sw_mirror && (view->flags & MV_MIRROR_PREVIOUS)) - { - view->view_ptr = views[i - 1].view_ptr; - } - else - { - view->mapped_ptr = arena->CreateView(view->shm_position, view->size, view_base); - view->view_ptr = view->mapped_ptr; - } - - if (!view->view_ptr) - { - // Argh! ERROR! Free what we grabbed so far so we can try again. - MemoryMap_Shutdown(views, i + 1, flags, arena); - return false; - } - - if (view->out_ptr) - *(view->out_ptr) = (u8*)view->view_ptr; - } - - return true; -} - -static u32 MemoryMap_InitializeViews(MemoryView* views, int num_views, u32 flags) -{ - u32 shm_position = 0; - u32 last_position = 0; - - for (int i = 0; i < num_views; i++) - { - // Zero all the pointers to be sure. - views[i].mapped_ptr = nullptr; - - SKIP(flags, views[i].flags); - - if (views[i].flags & MV_MIRROR_PREVIOUS) - shm_position = last_position; - views[i].shm_position = shm_position; - last_position = shm_position; - shm_position += views[i].size; - } - - return shm_position; -} - -u8* MemoryMap_Setup(MemoryView* views, int num_views, u32 flags, MemArena* arena) -{ - u32 total_mem = MemoryMap_InitializeViews(views, num_views, flags); - - arena->GrabSHMSegment(total_mem); - - // Now, create views in high memory where there's plenty of space. - u8* base = MemArena::FindMemoryBase(); - // This really shouldn't fail - in 64-bit, there will always be enough - // address space. - if (!Memory_TryBase(base, views, num_views, flags, arena)) - { - PanicAlert("MemoryMap_Setup: Failed finding a memory base."); - exit(0); - return nullptr; - } - - return base; -} - -void MemoryMap_Shutdown(MemoryView* views, int num_views, u32 flags, MemArena* arena) -{ - std::set<void*> freeset; - for (int i = 0; i < num_views; i++) - { - MemoryView* view = &views[i]; - if (view->mapped_ptr && !freeset.count(view->mapped_ptr)) - { - arena->ReleaseView(view->mapped_ptr, view->size); - freeset.insert(view->mapped_ptr); - view->mapped_ptr = nullptr; - } - } -} |
