MMU: Coding style fixes.

This commit is contained in:
degasus 2016-08-24 08:12:05 +02:00
parent ae1421b606
commit 6493ea1eb9
6 changed files with 39 additions and 42 deletions

View File

@ -96,20 +96,17 @@ bool IsInitialized()
return m_IsInitialized;
}
namespace
{
enum
{
MV_FAKE_VMEM = 1,
MV_WII_ONLY = 2,
};
struct PhysicalMemoryRegion
{
u8** out_pointer;
u32 physical_address;
u32 size;
u32 flags;
enum
{
ALWAYS = 0,
FAKE_VMEM = 1,
WII_ONLY = 2,
} flags;
u32 shm_position;
};
@ -118,7 +115,6 @@ struct LogicalMemoryView
void* mapped_pointer;
u32 mapped_size;
};
}
// Dolphin allocates memory to represent four regions:
// - 32MB RAM (actually 24MB on hardware), available on Gamecube and Wii
@ -161,10 +157,10 @@ struct LogicalMemoryView
// TODO: The actual size of RAM is REALRAM_SIZE (24MB); the other 8MB shouldn't
// be backed by actual memory.
static PhysicalMemoryRegion physical_regions[] = {
{&m_pRAM, 0x00000000, RAM_SIZE, 0},
{&m_pL1Cache, 0xE0000000, L1_CACHE_SIZE, 0},
{&m_pFakeVMEM, 0x7E000000, FAKEVMEM_SIZE, MV_FAKE_VMEM},
{&m_pEXRAM, 0x10000000, EXRAM_SIZE, MV_WII_ONLY},
{&m_pRAM, 0x00000000, RAM_SIZE, PhysicalMemoryRegion::ALWAYS},
{&m_pL1Cache, 0xE0000000, L1_CACHE_SIZE, PhysicalMemoryRegion::ALWAYS},
{&m_pFakeVMEM, 0x7E000000, FAKEVMEM_SIZE, PhysicalMemoryRegion::FAKE_VMEM},
{&m_pEXRAM, 0x10000000, EXRAM_SIZE, PhysicalMemoryRegion::WII_ONLY},
};
static std::vector<LogicalMemoryView> logical_mapped_entries;
@ -182,9 +178,9 @@ void Init()
u32 flags = 0;
if (wii)
flags |= MV_WII_ONLY;
flags |= PhysicalMemoryRegion::WII_ONLY;
if (bFakeVMEM)
flags |= MV_FAKE_VMEM;
flags |= PhysicalMemoryRegion::FAKE_VMEM;
u32 mem_size = 0;
for (PhysicalMemoryRegion& region : physical_regions)
{
@ -226,22 +222,22 @@ void Init()
m_IsInitialized = true;
}
void UpdateLogicalMemory(u32* dbat_table)
void UpdateLogicalMemory(const PowerPC::BatTable& dbat_table)
{
for (auto& entry : logical_mapped_entries)
{
g_arena.ReleaseView(entry.mapped_pointer, entry.mapped_size);
}
logical_mapped_entries.clear();
for (unsigned i = 0; i < (1 << (32 - PowerPC::BAT_INDEX_SHIFT)); ++i)
for (u32 i = 0; i < (1 << (32 - PowerPC::BAT_INDEX_SHIFT)); ++i)
{
if (dbat_table[i] & 1)
{
unsigned logical_address = i << PowerPC::BAT_INDEX_SHIFT;
u32 logical_address = i << PowerPC::BAT_INDEX_SHIFT;
// TODO: Merge adjacent mappings to make this faster.
unsigned logical_size = 1 << PowerPC::BAT_INDEX_SHIFT;
unsigned translated_address = dbat_table[i] & ~3;
for (PhysicalMemoryRegion& physical_region : physical_regions)
u32 logical_size = 1 << PowerPC::BAT_INDEX_SHIFT;
u32 translated_address = dbat_table[i] & ~3;
for (const auto& physical_region : physical_regions)
{
u32 mapping_address = physical_region.physical_address;
u32 mapping_end = mapping_address + physical_region.size;
@ -286,9 +282,9 @@ void Shutdown()
m_IsInitialized = false;
u32 flags = 0;
if (SConfig::GetInstance().bWii)
flags |= MV_WII_ONLY;
flags |= PhysicalMemoryRegion::WII_ONLY;
if (bFakeVMEM)
flags |= MV_FAKE_VMEM;
flags |= PhysicalMemoryRegion::FAKE_VMEM;
for (PhysicalMemoryRegion& region : physical_regions)
{
if ((flags & region.flags) != region.flags)

View File

@ -9,6 +9,7 @@
#include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h"
#include "Core/PowerPC/PowerPC.h"
// Enable memory checks in the Debug/DebugFast builds, but NOT in release
#if defined(_DEBUG) || defined(DEBUGFAST)
@ -68,7 +69,7 @@ void Init();
void Shutdown();
void DoState(PointerWrap& p);
void UpdateLogicalMemory(u32* dbat_table);
void UpdateLogicalMemory(const PowerPC::BatTable& dbat_table);
void Clear();
bool AreMemoryBreakpointsActivated();

View File

@ -375,7 +375,7 @@ void Jit64::dcbz(UGeckoInstruction inst)
// Perform lookup to see if we can use fast path.
MOV(32, R(RSCRATCH2), R(RSCRATCH));
SHR(32, R(RSCRATCH2), Imm8(PowerPC::BAT_INDEX_SHIFT));
TEST(32, MScaled(RSCRATCH2, SCALE_4, (u32)(u64)PowerPC::dbat_table), Imm32(2));
TEST(32, MScaled(RSCRATCH2, SCALE_4, (u32)(u64)&PowerPC::dbat_table[0]), Imm32(2));
FixupBranch slow = J_CC(CC_Z, true);
// Fast path: compute full address, then zero out 32 bytes of memory.

View File

@ -234,7 +234,7 @@ FixupBranch EmuCodeBlock::CheckIfSafeAddress(const OpArg& reg_value, X64Reg reg_
// Perform lookup to see if we can use fast path.
SHR(32, R(scratch), Imm8(PowerPC::BAT_INDEX_SHIFT));
TEST(32, MScaled(scratch, SCALE_4, (u32)(u64)PowerPC::dbat_table), Imm32(2));
TEST(32, MScaled(scratch, SCALE_4, (u32)(u64)&PowerPC::dbat_table[0]), Imm32(2));
if (scratch == reg_addr)
POP(scratch);

View File

@ -100,7 +100,7 @@ struct TranslateAddressResult
PAGE_FAULT
} result;
u32 address;
bool Success() { return result <= PAGE_TABLE_TRANSLATED; }
bool Success() const { return result <= PAGE_TABLE_TRANSLATED; }
};
template <const XCheckTLBFlag flag>
static TranslateAddressResult TranslateAddress(const u32 address);
@ -155,8 +155,8 @@ static void EFB_Write(u32 data, u32 addr)
}
}
u32 dbat_table[1 << (32 - BAT_INDEX_SHIFT)];
u32 ibat_table[1 << (32 - BAT_INDEX_SHIFT)];
BatTable ibat_table;
BatTable dbat_table;
static void GenerateDSIException(u32 _EffectiveAddress, bool _bWrite);
@ -392,7 +392,7 @@ TryReadInstResult TryReadInstruction(u32 address)
}
u32 hex;
// TODO: Refactor this.
// TODO: Refactor this. This icache implementation is totally wrong if used with the fake vmem.
if (Memory::bFakeVMEM && ((address & 0xFE000000) == 0x7E000000))
{
hex = bswap(*(const u32*)&Memory::m_pFakeVMEM[address & Memory::FAKEVMEM_MASK]);
@ -1114,7 +1114,7 @@ static __forceinline TranslateAddressResult TranslatePageAddress(const u32 addre
return TranslateAddressResult{TranslateAddressResult::PAGE_FAULT, 0};
}
static void UpdateBATs(u32* bat_table, u32 base_spr)
static void UpdateBATs(BatTable& bat_table, u32 base_spr)
{
// TODO: Separate BATs for MSR.PR==0 and MSR.PR==1
// TODO: Handle PP/WIMG settings.
@ -1181,9 +1181,9 @@ static void UpdateBATs(u32* bat_table, u32 base_spr)
}
}
static void UpdateFakeMMUBat(u32* bat_table, u32 start_addr)
static void UpdateFakeMMUBat(BatTable& bat_table, u32 start_addr)
{
for (unsigned i = 0; i < (0x10000000 >> BAT_INDEX_SHIFT); ++i)
for (u32 i = 0; i < (0x10000000 >> BAT_INDEX_SHIFT); ++i)
{
// Map from 0x4XXXXXXX or 0x7XXXXXXX to the range
// [0x7E000000,0x80000000).
@ -1195,7 +1195,7 @@ static void UpdateFakeMMUBat(u32* bat_table, u32 start_addr)
void DBATUpdated()
{
memset(dbat_table, 0, sizeof(dbat_table));
dbat_table = {};
UpdateBATs(dbat_table, SPR_DBAT0U);
bool extended_bats = SConfig::GetInstance().bWii && HID4.SBE;
if (extended_bats)
@ -1212,7 +1212,7 @@ void DBATUpdated()
void IBATUpdated()
{
memset(ibat_table, 0, sizeof(ibat_table));
ibat_table = {};
UpdateBATs(ibat_table, SPR_IBAT0U);
bool extended_bats = SConfig::GetInstance().bWii && HID4.SBE;
if (extended_bats)

View File

@ -4,6 +4,7 @@
#pragma once
#include <array>
#include <cstddef>
#include <tuple>
@ -282,12 +283,11 @@ struct TranslateResult
u32 address;
};
TranslateResult JitCache_TranslateAddress(u32 address);
enum
{
BAT_INDEX_SHIFT = 17
};
extern u32 ibat_table[];
extern u32 dbat_table[];
static const int BAT_INDEX_SHIFT = 17;
using BatTable = std::array<u32, 1 << (32 - BAT_INDEX_SHIFT)>; // 128 KB
extern BatTable ibat_table;
extern BatTable dbat_table;
} // namespace
enum CRBits