diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-10-28 04:02:12 -0700 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2014-11-02 16:50:36 -0800 |
| commit | 6813473367dbbeee67375311a8991cedfc72eaea (patch) | |
| tree | 78efaaf9a0815e52128ebae33dcfa7ae904e9c00 /Source/Core/Common/MemArena.cpp | |
| parent | 8858dc776467af45b95cf40ea7db7aebfc0e157d (diff) | |
MemArena: Remove the low mappings for our pointers
These are effectively unused, since the memmap already maps them in one
place. For 32-bit, they might have some slight advantage, but we already
special-case the regular "high-mem" pointer for 32-bit, so just use the
one we already have...
Diffstat (limited to 'Source/Core/Common/MemArena.cpp')
| -rw-r--r-- | Source/Core/Common/MemArena.cpp | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/Source/Core/Common/MemArena.cpp b/Source/Core/Common/MemArena.cpp index 5c3972d44a..237dc4356f 100644 --- a/Source/Core/Common/MemArena.cpp +++ b/Source/Core/Common/MemArena.cpp @@ -170,8 +170,7 @@ u8* MemArena::Find4GBBase() if (!(a_flags & MV_FAKE_VMEM) && (b_flags & MV_FAKE_VMEM)) \ continue; \ - -static bool Memory_TryBase(u8 *base, const MemoryView *views, int num_views, u32 flags, MemArena *arena) +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. @@ -181,45 +180,38 @@ static bool Memory_TryBase(u8 *base, const MemoryView *views, int num_views, u32 // Zero all the pointers to be sure. for (int i = 0; i < num_views; i++) { - if (views[i].out_ptr_low) - *views[i].out_ptr_low = nullptr; - if (views[i].out_ptr) - *views[i].out_ptr = nullptr; + views[i].mapped_ptr = nullptr; } int i; for (i = 0; i < num_views; i++) { SKIP(flags, views[i].flags); + if (views[i].flags & MV_MIRROR_PREVIOUS) - { position = last_position; - } - else - { - *(views[i].out_ptr_low) = (u8*)arena->CreateView(position, views[i].size); - if (!*views[i].out_ptr_low) - goto bail; - } + #if _ARCH_64 - *views[i].out_ptr = (u8*)arena->CreateView( + views[i].mapped_ptr = arena->CreateView( position, views[i].size, base + views[i].virtual_address); #else if (views[i].flags & MV_MIRROR_PREVIOUS) { // No need to create multiple identical views. - *views[i].out_ptr = *views[i - 1].out_ptr; + views[i].mapped_ptr = views[i - 1].mapped_ptr; } else { - *views[i].out_ptr = (u8*)arena->CreateView( + views[i].mapped_ptr = arena->CreateView( position, views[i].size, base + (views[i].virtual_address & 0x3FFFFFFF)); } #endif - if (!*views[i].out_ptr) + if (!views[i].mapped_ptr) goto bail; - last_position = position; + if (views[i].out_ptr) + *views[i].out_ptr = (u8*) views[i].mapped_ptr; + position += views[i].size; } @@ -231,7 +223,7 @@ bail: return false; } -u8 *MemoryMap_Setup(const MemoryView *views, int num_views, u32 flags, MemArena *arena) +u8 *MemoryMap_Setup(MemoryView *views, int num_views, u32 flags, MemArena *arena) { u32 total_mem = 0; @@ -258,21 +250,17 @@ u8 *MemoryMap_Setup(const MemoryView *views, int num_views, u32 flags, MemArena return base; } -void MemoryMap_Shutdown(const MemoryView *views, int num_views, u32 flags, MemArena *arena) +void MemoryMap_Shutdown(MemoryView *views, int num_views, u32 flags, MemArena *arena) { std::set<void*> freeset; for (int i = 0; i < num_views; i++) { - const MemoryView* view = &views[i]; - u8** outptrs[2] = {view->out_ptr_low, view->out_ptr}; - for (auto outptr : outptrs) + MemoryView* view = &views[i]; + if (view->mapped_ptr && *(u8*)view->mapped_ptr && !freeset.count(view->mapped_ptr)) { - if (outptr && *outptr && !freeset.count(*outptr)) - { - arena->ReleaseView(*outptr, view->size); - freeset.insert(*outptr); - *outptr = nullptr; - } + arena->ReleaseView(view->mapped_ptr, view->size); + freeset.insert(view->mapped_ptr); + view->mapped_ptr = nullptr; } } } |
