Merge pull request #2033 from magumagu/mmio-fix-addresses

Fix the addresses of MMIO registers.
This commit is contained in:
magumagu committed 2015-02-22 10:58:25 -08:00
commit 18ada7a0f5
8 files changed
+202 -163

No files matched your search

+19 -4
View File
@@ -134,7 +134,7 @@ __forceinline static T ReadFromHardware(const u32 em_address)
if (em_address < 0xcc000000)
return EFB_Read(em_address);
else
return (T)Memory::mmio_mapping->Read<typename std::make_unsigned<T>::type>(em_address);
return (T)Memory::mmio_mapping->Read<typename std::make_unsigned<T>::type>(em_address & 0x0FFFFFFF);
}
if (segment == 0x0 || segment == 0x8 || segment == 0xC)
{
@@ -168,7 +168,7 @@ __forceinline static T ReadFromHardware(const u32 em_address)
if (em_address < 0x0c000000)
return EFB_Read(em_address);
else
return (T)Memory::mmio_mapping->Read<typename std::make_unsigned<T>::type>(em_address | 0xC0000000);
return (T)Memory::mmio_mapping->Read<typename std::make_unsigned<T>::type>(em_address);
}
if (segment == 0x0)
{
@@ -258,7 +258,7 @@ __forceinline static void WriteToHardware(u32 em_address, const T data)
}
else
{
Memory::mmio_mapping->Write(em_address, data);
Memory::mmio_mapping->Write(em_address & 0x0FFFFFFF, data);
return;
}
}
@@ -313,7 +313,7 @@ __forceinline static void WriteToHardware(u32 em_address, const T data)
}
else
{
Memory::mmio_mapping->Write(em_address | 0xC0000000, data);
Memory::mmio_mapping->Write(em_address, data);
return;
}
}
@@ -748,6 +748,21 @@ void ClearCacheLine(const u32 address)
Write_U64(0, address + i);
}
u32 IsOptimizableMMIOAccess(u32 address, u32 accessSize)
{
if (!UReg_MSR(MSR).DR)
return 0;
if ((address & 0xF0000000) != 0xC0000000)
return 0;
unsigned translated = address & 0x0FFFFFFF;
bool aligned = (translated & ((accessSize >> 3) - 1)) == 0;
if (!aligned || !MMIO::IsMMIOAddress(translated))
return 0;
return translated;
}
// *********************************************************************************
// Warning: Test Area
//