mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #11700 from AdmiralCurtiss/mmu-class
PowerPC/MMU: Refactor to class, move to System.
This commit is contained in:
@@ -1137,6 +1137,17 @@ public:
|
||||
ABI_CallFunction(func);
|
||||
}
|
||||
|
||||
template <typename FunctionPointer>
|
||||
void ABI_CallFunctionPAC(int bits, FunctionPointer func, const void* ptr1, const Gen::OpArg& arg2,
|
||||
u32 param3)
|
||||
{
|
||||
if (!arg2.IsSimpleReg(ABI_PARAM2))
|
||||
MOV(bits, R(ABI_PARAM2), arg2);
|
||||
MOV(32, R(ABI_PARAM3), Imm32(param3));
|
||||
MOV(64, R(ABI_PARAM1), Imm64(reinterpret_cast<u64>(ptr1)));
|
||||
ABI_CallFunction(func);
|
||||
}
|
||||
|
||||
template <typename FunctionPointer>
|
||||
void ABI_CallFunctionA(int bits, FunctionPointer func, const Gen::OpArg& arg1)
|
||||
{
|
||||
|
||||
@@ -375,7 +375,7 @@ static bool Subtype_RamWriteAndFill(const Core::CPUThreadGuard& guard, const ARA
|
||||
const u32 repeat = data >> 8;
|
||||
for (u32 i = 0; i <= repeat; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, data & 0xFF, new_addr + i);
|
||||
PowerPC::MMU::HostWrite_U8(guard, data & 0xFF, new_addr + i);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", data & 0xFF, new_addr + i);
|
||||
}
|
||||
LogInfo("--------");
|
||||
@@ -389,7 +389,7 @@ static bool Subtype_RamWriteAndFill(const Core::CPUThreadGuard& guard, const ARA
|
||||
const u32 repeat = data >> 16;
|
||||
for (u32 i = 0; i <= repeat; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U16(guard, data & 0xFFFF, new_addr + i * 2);
|
||||
PowerPC::MMU::HostWrite_U16(guard, data & 0xFFFF, new_addr + i * 2);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", data & 0xFFFF, new_addr + i * 2);
|
||||
}
|
||||
LogInfo("--------");
|
||||
@@ -400,7 +400,7 @@ static bool Subtype_RamWriteAndFill(const Core::CPUThreadGuard& guard, const ARA
|
||||
case DATATYPE_32BIT: // Dword write
|
||||
LogInfo("32-bit Write");
|
||||
LogInfo("--------");
|
||||
PowerPC::HostWrite_U32(guard, data, new_addr);
|
||||
PowerPC::MMU::HostWrite_U32(guard, data, new_addr);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", data, new_addr);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
@@ -420,7 +420,7 @@ static bool Subtype_WriteToPointer(const Core::CPUThreadGuard& guard, const ARAd
|
||||
const u32 data)
|
||||
{
|
||||
const u32 new_addr = addr.GCAddress();
|
||||
const u32 ptr = PowerPC::HostRead_U32(guard, new_addr);
|
||||
const u32 ptr = PowerPC::MMU::HostRead_U32(guard, new_addr);
|
||||
|
||||
LogInfo("Hardware Address: {:08x}", new_addr);
|
||||
LogInfo("Size: {:08x}", addr.size);
|
||||
@@ -436,7 +436,7 @@ static bool Subtype_WriteToPointer(const Core::CPUThreadGuard& guard, const ARAd
|
||||
LogInfo("Pointer: {:08x}", ptr);
|
||||
LogInfo("Byte: {:08x}", thebyte);
|
||||
LogInfo("Offset: {:08x}", offset);
|
||||
PowerPC::HostWrite_U8(guard, thebyte, ptr + offset);
|
||||
PowerPC::MMU::HostWrite_U8(guard, thebyte, ptr + offset);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", thebyte, ptr + offset);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
@@ -451,7 +451,7 @@ static bool Subtype_WriteToPointer(const Core::CPUThreadGuard& guard, const ARAd
|
||||
LogInfo("Pointer: {:08x}", ptr);
|
||||
LogInfo("Byte: {:08x}", theshort);
|
||||
LogInfo("Offset: {:08x}", offset);
|
||||
PowerPC::HostWrite_U16(guard, theshort, ptr + offset);
|
||||
PowerPC::MMU::HostWrite_U16(guard, theshort, ptr + offset);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", theshort, ptr + offset);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
@@ -461,7 +461,7 @@ static bool Subtype_WriteToPointer(const Core::CPUThreadGuard& guard, const ARAd
|
||||
case DATATYPE_32BIT:
|
||||
LogInfo("Write 32-bit to pointer");
|
||||
LogInfo("--------");
|
||||
PowerPC::HostWrite_U32(guard, data, ptr);
|
||||
PowerPC::MMU::HostWrite_U32(guard, data, ptr);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", data, ptr);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
@@ -489,24 +489,28 @@ static bool Subtype_AddCode(const Core::CPUThreadGuard& guard, const ARAddr& add
|
||||
case DATATYPE_8BIT:
|
||||
LogInfo("8-bit Add");
|
||||
LogInfo("--------");
|
||||
PowerPC::HostWrite_U8(guard, PowerPC::HostRead_U8(guard, new_addr) + data, new_addr);
|
||||
LogInfo("Wrote {:02x} to address {:08x}", PowerPC::HostRead_U8(guard, new_addr), new_addr);
|
||||
PowerPC::MMU::HostWrite_U8(guard, PowerPC::MMU::HostRead_U8(guard, new_addr) + data, new_addr);
|
||||
LogInfo("Wrote {:02x} to address {:08x}", PowerPC::MMU::HostRead_U8(guard, new_addr), new_addr);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
|
||||
case DATATYPE_16BIT:
|
||||
LogInfo("16-bit Add");
|
||||
LogInfo("--------");
|
||||
PowerPC::HostWrite_U16(guard, PowerPC::HostRead_U16(guard, new_addr) + data, new_addr);
|
||||
LogInfo("Wrote {:04x} to address {:08x}", PowerPC::HostRead_U16(guard, new_addr), new_addr);
|
||||
PowerPC::MMU::HostWrite_U16(guard, PowerPC::MMU::HostRead_U16(guard, new_addr) + data,
|
||||
new_addr);
|
||||
LogInfo("Wrote {:04x} to address {:08x}", PowerPC::MMU::HostRead_U16(guard, new_addr),
|
||||
new_addr);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
|
||||
case DATATYPE_32BIT:
|
||||
LogInfo("32-bit Add");
|
||||
LogInfo("--------");
|
||||
PowerPC::HostWrite_U32(guard, PowerPC::HostRead_U32(guard, new_addr) + data, new_addr);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::HostRead_U32(guard, new_addr), new_addr);
|
||||
PowerPC::MMU::HostWrite_U32(guard, PowerPC::MMU::HostRead_U32(guard, new_addr) + data,
|
||||
new_addr);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::MMU::HostRead_U32(guard, new_addr),
|
||||
new_addr);
|
||||
LogInfo("--------");
|
||||
break;
|
||||
|
||||
@@ -515,12 +519,12 @@ static bool Subtype_AddCode(const Core::CPUThreadGuard& guard, const ARAddr& add
|
||||
LogInfo("32-bit floating Add");
|
||||
LogInfo("--------");
|
||||
|
||||
const u32 read = PowerPC::HostRead_U32(guard, new_addr);
|
||||
const u32 read = PowerPC::MMU::HostRead_U32(guard, new_addr);
|
||||
const float read_float = Common::BitCast<float>(read);
|
||||
// data contains an (unsigned?) integer value
|
||||
const float fread = read_float + static_cast<float>(data);
|
||||
const u32 newval = Common::BitCast<u32>(fread);
|
||||
PowerPC::HostWrite_U32(guard, newval, new_addr);
|
||||
PowerPC::MMU::HostWrite_U32(guard, newval, new_addr);
|
||||
LogInfo("Old Value {:08x}", read);
|
||||
LogInfo("Increment {:08x}", data);
|
||||
LogInfo("New value {:08x}", newval);
|
||||
@@ -578,7 +582,7 @@ static bool ZeroCode_FillAndSlide(const Core::CPUThreadGuard& guard, const u32 v
|
||||
LogInfo("--------");
|
||||
for (int i = 0; i < write_num; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, val & 0xFF, curr_addr);
|
||||
PowerPC::MMU::HostWrite_U8(guard, val & 0xFF, curr_addr);
|
||||
curr_addr += addr_incr;
|
||||
val += val_incr;
|
||||
LogInfo("Write {:08x} to address {:08x}", val & 0xFF, curr_addr);
|
||||
@@ -594,7 +598,7 @@ static bool ZeroCode_FillAndSlide(const Core::CPUThreadGuard& guard, const u32 v
|
||||
LogInfo("--------");
|
||||
for (int i = 0; i < write_num; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U16(guard, val & 0xFFFF, curr_addr);
|
||||
PowerPC::MMU::HostWrite_U16(guard, val & 0xFFFF, curr_addr);
|
||||
LogInfo("Write {:08x} to address {:08x}", val & 0xFFFF, curr_addr);
|
||||
curr_addr += addr_incr * 2;
|
||||
val += val_incr;
|
||||
@@ -609,7 +613,7 @@ static bool ZeroCode_FillAndSlide(const Core::CPUThreadGuard& guard, const u32 v
|
||||
LogInfo("--------");
|
||||
for (int i = 0; i < write_num; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U32(guard, val, curr_addr);
|
||||
PowerPC::MMU::HostWrite_U32(guard, val, curr_addr);
|
||||
LogInfo("Write {:08x} to address {:08x}", val, curr_addr);
|
||||
curr_addr += addr_incr * 4;
|
||||
val += val_incr;
|
||||
@@ -650,14 +654,15 @@ static bool ZeroCode_MemoryCopy(const Core::CPUThreadGuard& guard, const u32 val
|
||||
{ // Memory Copy With Pointers Support
|
||||
LogInfo("Memory Copy With Pointers Support");
|
||||
LogInfo("--------");
|
||||
const u32 ptr_dest = PowerPC::HostRead_U32(guard, addr_dest);
|
||||
const u32 ptr_dest = PowerPC::MMU::HostRead_U32(guard, addr_dest);
|
||||
LogInfo("Resolved Dest Address to: {:08x}", ptr_dest);
|
||||
const u32 ptr_src = PowerPC::HostRead_U32(guard, addr_src);
|
||||
const u32 ptr_src = PowerPC::MMU::HostRead_U32(guard, addr_src);
|
||||
LogInfo("Resolved Src Address to: {:08x}", ptr_src);
|
||||
for (int i = 0; i < num_bytes; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, PowerPC::HostRead_U8(guard, ptr_src + i), ptr_dest + i);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::HostRead_U8(guard, ptr_src + i),
|
||||
PowerPC::MMU::HostWrite_U8(guard, PowerPC::MMU::HostRead_U8(guard, ptr_src + i),
|
||||
ptr_dest + i);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::MMU::HostRead_U8(guard, ptr_src + i),
|
||||
ptr_dest + i);
|
||||
}
|
||||
LogInfo("--------");
|
||||
@@ -668,8 +673,9 @@ static bool ZeroCode_MemoryCopy(const Core::CPUThreadGuard& guard, const u32 val
|
||||
LogInfo("--------");
|
||||
for (int i = 0; i < num_bytes; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, PowerPC::HostRead_U8(guard, addr_src + i), addr_dest + i);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::HostRead_U8(guard, addr_src + i),
|
||||
PowerPC::MMU::HostWrite_U8(guard, PowerPC::MMU::HostRead_U8(guard, addr_src + i),
|
||||
addr_dest + i);
|
||||
LogInfo("Wrote {:08x} to address {:08x}", PowerPC::MMU::HostRead_U8(guard, addr_src + i),
|
||||
addr_dest + i);
|
||||
}
|
||||
LogInfo("--------");
|
||||
@@ -777,16 +783,16 @@ static bool ConditionalCode(const Core::CPUThreadGuard& guard, const ARAddr& add
|
||||
switch (addr.size)
|
||||
{
|
||||
case DATATYPE_8BIT:
|
||||
result = CompareValues(PowerPC::HostRead_U8(guard, new_addr), (data & 0xFF), addr.type);
|
||||
result = CompareValues(PowerPC::MMU::HostRead_U8(guard, new_addr), (data & 0xFF), addr.type);
|
||||
break;
|
||||
|
||||
case DATATYPE_16BIT:
|
||||
result = CompareValues(PowerPC::HostRead_U16(guard, new_addr), (data & 0xFFFF), addr.type);
|
||||
result = CompareValues(PowerPC::MMU::HostRead_U16(guard, new_addr), (data & 0xFFFF), addr.type);
|
||||
break;
|
||||
|
||||
case DATATYPE_32BIT_FLOAT:
|
||||
case DATATYPE_32BIT:
|
||||
result = CompareValues(PowerPC::HostRead_U32(guard, new_addr), data, addr.type);
|
||||
result = CompareValues(PowerPC::MMU::HostRead_U32(guard, new_addr), data, addr.type);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -51,7 +51,7 @@ void PresetTimeBaseTicks(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
|
||||
const u64 time_base_ticks = emulated_time * 40500000ULL;
|
||||
|
||||
PowerPC::HostWrite_U64(guard, time_base_ticks, 0x800030D8);
|
||||
PowerPC::MMU::HostWrite_U64(guard, time_base_ticks, 0x800030D8);
|
||||
}
|
||||
} // Anonymous namespace
|
||||
|
||||
@@ -127,8 +127,10 @@ void CBoot::SetupBAT(Core::System& system, bool is_wii)
|
||||
ppc_state.spr[SPR_DBAT5L] = 0x1000002a;
|
||||
HID4(ppc_state).SBE = 1;
|
||||
}
|
||||
PowerPC::DBATUpdated();
|
||||
PowerPC::IBATUpdated();
|
||||
|
||||
auto& mmu = system.GetMMU();
|
||||
mmu.DBATUpdated();
|
||||
mmu.IBATUpdated();
|
||||
}
|
||||
|
||||
bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard, bool is_wii,
|
||||
@@ -153,6 +155,7 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
// TODO - Make Apploader(or just RunFunction()) debuggable!!!
|
||||
|
||||
auto& ppc_state = system.GetPPCState();
|
||||
auto& mmu = system.GetMMU();
|
||||
|
||||
// Call iAppLoaderEntry.
|
||||
DEBUG_LOG_FMT(BOOT, "Call iAppLoaderEntry");
|
||||
@@ -161,14 +164,14 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
ppc_state.gpr[4] = iAppLoaderFuncAddr + 4;
|
||||
ppc_state.gpr[5] = iAppLoaderFuncAddr + 8;
|
||||
RunFunction(system, *entry);
|
||||
const u32 iAppLoaderInit = PowerPC::Read_U32(iAppLoaderFuncAddr + 0);
|
||||
const u32 iAppLoaderMain = PowerPC::Read_U32(iAppLoaderFuncAddr + 4);
|
||||
const u32 iAppLoaderClose = PowerPC::Read_U32(iAppLoaderFuncAddr + 8);
|
||||
const u32 iAppLoaderInit = mmu.Read_U32(iAppLoaderFuncAddr + 0);
|
||||
const u32 iAppLoaderMain = mmu.Read_U32(iAppLoaderFuncAddr + 4);
|
||||
const u32 iAppLoaderClose = mmu.Read_U32(iAppLoaderFuncAddr + 8);
|
||||
|
||||
// iAppLoaderInit
|
||||
DEBUG_LOG_FMT(BOOT, "Call iAppLoaderInit");
|
||||
PowerPC::HostWrite_U32(guard, 0x4E800020, 0x81300000); // Write BLR
|
||||
HLE::Patch(system, 0x81300000, "AppLoaderReport"); // HLE OSReport for Apploader
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x4E800020, 0x81300000); // Write BLR
|
||||
HLE::Patch(system, 0x81300000, "AppLoaderReport"); // HLE OSReport for Apploader
|
||||
ppc_state.gpr[3] = 0x81300000;
|
||||
RunFunction(system, iAppLoaderInit);
|
||||
|
||||
@@ -189,9 +192,9 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
// iAppLoaderMain returns 0 when there are no more sections to copy.
|
||||
while (ppc_state.gpr[3] != 0x00)
|
||||
{
|
||||
const u32 ram_address = PowerPC::Read_U32(0x81300004);
|
||||
const u32 length = PowerPC::Read_U32(0x81300008);
|
||||
const u32 dvd_offset = PowerPC::Read_U32(0x8130000c) << (is_wii ? 2 : 0);
|
||||
const u32 ram_address = mmu.Read_U32(0x81300004);
|
||||
const u32 length = mmu.Read_U32(0x81300008);
|
||||
const u32 dvd_offset = mmu.Read_U32(0x8130000c) << (is_wii ? 2 : 0);
|
||||
|
||||
INFO_LOG_FMT(BOOT, "DVDRead: offset: {:08x} memOffset: {:08x} length: {}", dvd_offset,
|
||||
ram_address, length);
|
||||
@@ -223,35 +226,35 @@ void CBoot::SetupGCMemory(Core::System& system, const Core::CPUThreadGuard& guar
|
||||
auto& memory = system.GetMemory();
|
||||
|
||||
// Booted from bootrom. 0xE5207C22 = booted from jtag
|
||||
PowerPC::HostWrite_U32(guard, 0x0D15EA5E, 0x80000020);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x0D15EA5E, 0x80000020);
|
||||
|
||||
// Physical Memory Size (24MB on retail)
|
||||
PowerPC::HostWrite_U32(guard, memory.GetRamSizeReal(), 0x80000028);
|
||||
PowerPC::MMU::HostWrite_U32(guard, memory.GetRamSizeReal(), 0x80000028);
|
||||
|
||||
// Console type - DevKit (retail ID == 0x00000003) see YAGCD 4.2.1.1.2
|
||||
// TODO: determine why some games fail when using a retail ID.
|
||||
// (Seem to take different EXI paths, see Ikaruga for example)
|
||||
const u32 console_type = static_cast<u32>(Core::ConsoleType::LatestDevkit);
|
||||
PowerPC::HostWrite_U32(guard, console_type, 0x8000002C);
|
||||
PowerPC::MMU::HostWrite_U32(guard, console_type, 0x8000002C);
|
||||
|
||||
// Fake the VI Init of the IPL (YAGCD 4.2.1.4)
|
||||
PowerPC::HostWrite_U32(guard, DiscIO::IsNTSC(SConfig::GetInstance().m_region) ? 0 : 1,
|
||||
0x800000CC);
|
||||
PowerPC::MMU::HostWrite_U32(guard, DiscIO::IsNTSC(SConfig::GetInstance().m_region) ? 0 : 1,
|
||||
0x800000CC);
|
||||
|
||||
// ARAM Size. 16MB main + 4/16/32MB external. (retail consoles have no external ARAM)
|
||||
PowerPC::HostWrite_U32(guard, 0x01000000, 0x800000d0);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x01000000, 0x800000d0);
|
||||
|
||||
PowerPC::HostWrite_U32(guard, 0x09a7ec80, 0x800000F8); // Bus Clock Speed
|
||||
PowerPC::HostWrite_U32(guard, 0x1cf7c580, 0x800000FC); // CPU Clock Speed
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x09a7ec80, 0x800000F8); // Bus Clock Speed
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x1cf7c580, 0x800000FC); // CPU Clock Speed
|
||||
|
||||
PowerPC::HostWrite_U32(guard, 0x4c000064, 0x80000300); // Write default DSI Handler: rfi
|
||||
PowerPC::HostWrite_U32(guard, 0x4c000064, 0x80000800); // Write default FPU Handler: rfi
|
||||
PowerPC::HostWrite_U32(guard, 0x4c000064, 0x80000C00); // Write default Syscall Handler: rfi
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x4c000064, 0x80000300); // Write default DSI Handler: rfi
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x4c000064, 0x80000800); // Write default FPU Handler: rfi
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x4c000064, 0x80000C00); // Write default Syscall Handler: rfi
|
||||
|
||||
PresetTimeBaseTicks(system, guard);
|
||||
|
||||
// HIO checks this
|
||||
// PowerPC::HostWrite_U16(0x8200, 0x000030e6); // Console type
|
||||
// PowerPC::MMU::HostWrite_U16(0x8200, 0x000030e6); // Console type
|
||||
}
|
||||
|
||||
// __________________________________________________________________________________________________
|
||||
|
||||
@@ -111,7 +111,7 @@ std::optional<PowerPC::ReadResult<u8>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadU8(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadU8(guard, addr, space);
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -119,7 +119,7 @@ std::optional<PowerPC::ReadResult<u16>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadU16(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadU16(guard, addr, space);
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -127,7 +127,7 @@ std::optional<PowerPC::ReadResult<u32>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadU32(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadU32(guard, addr, space);
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -135,7 +135,7 @@ std::optional<PowerPC::ReadResult<u64>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadU64(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadU64(guard, addr, space);
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -143,7 +143,7 @@ std::optional<PowerPC::ReadResult<s8>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
auto tmp = PowerPC::HostTryReadU8(guard, addr, space);
|
||||
auto tmp = PowerPC::MMU::HostTryReadU8(guard, addr, space);
|
||||
if (!tmp)
|
||||
return std::nullopt;
|
||||
return PowerPC::ReadResult<s8>(tmp->translated, Common::BitCast<s8>(tmp->value));
|
||||
@@ -154,7 +154,7 @@ std::optional<PowerPC::ReadResult<s16>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
auto tmp = PowerPC::HostTryReadU16(guard, addr, space);
|
||||
auto tmp = PowerPC::MMU::HostTryReadU16(guard, addr, space);
|
||||
if (!tmp)
|
||||
return std::nullopt;
|
||||
return PowerPC::ReadResult<s16>(tmp->translated, Common::BitCast<s16>(tmp->value));
|
||||
@@ -165,7 +165,7 @@ std::optional<PowerPC::ReadResult<s32>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
auto tmp = PowerPC::HostTryReadU32(guard, addr, space);
|
||||
auto tmp = PowerPC::MMU::HostTryReadU32(guard, addr, space);
|
||||
if (!tmp)
|
||||
return std::nullopt;
|
||||
return PowerPC::ReadResult<s32>(tmp->translated, Common::BitCast<s32>(tmp->value));
|
||||
@@ -176,7 +176,7 @@ std::optional<PowerPC::ReadResult<s64>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
auto tmp = PowerPC::HostTryReadU64(guard, addr, space);
|
||||
auto tmp = PowerPC::MMU::HostTryReadU64(guard, addr, space);
|
||||
if (!tmp)
|
||||
return std::nullopt;
|
||||
return PowerPC::ReadResult<s64>(tmp->translated, Common::BitCast<s64>(tmp->value));
|
||||
@@ -187,7 +187,7 @@ std::optional<PowerPC::ReadResult<float>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadF32(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadF32(guard, addr, space);
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -195,7 +195,7 @@ std::optional<PowerPC::ReadResult<double>>
|
||||
TryReadValueFromEmulatedMemory(const Core::CPUThreadGuard& guard, u32 addr,
|
||||
PowerPC::RequestedAddressSpace space)
|
||||
{
|
||||
return PowerPC::HostTryReadF64(guard, addr, space);
|
||||
return PowerPC::MMU::HostTryReadF64(guard, addr, space);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ void AddAutoBreakpoints()
|
||||
// Returns true if the address is not a valid RAM address or NULL.
|
||||
static bool IsStackBottom(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
{
|
||||
return !addr || !PowerPC::HostIsRAMAddress(guard, addr);
|
||||
return !addr || !PowerPC::MMU::HostIsRAMAddress(guard, addr);
|
||||
}
|
||||
|
||||
static void WalkTheStack(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
@@ -51,18 +51,18 @@ static void WalkTheStack(Core::System& system, const Core::CPUThreadGuard& guard
|
||||
|
||||
if (!IsStackBottom(guard, ppc_state.gpr[1]))
|
||||
{
|
||||
u32 addr = PowerPC::HostRead_U32(guard, ppc_state.gpr[1]); // SP
|
||||
u32 addr = PowerPC::MMU::HostRead_U32(guard, ppc_state.gpr[1]); // SP
|
||||
|
||||
// Walk the stack chain
|
||||
for (int count = 0; !IsStackBottom(guard, addr + 4) && (count++ < 20); ++count)
|
||||
{
|
||||
u32 func_addr = PowerPC::HostRead_U32(guard, addr + 4);
|
||||
u32 func_addr = PowerPC::MMU::HostRead_U32(guard, addr + 4);
|
||||
stack_step(func_addr);
|
||||
|
||||
if (IsStackBottom(guard, addr))
|
||||
break;
|
||||
|
||||
addr = PowerPC::HostRead_U32(guard, addr);
|
||||
addr = PowerPC::MMU::HostRead_U32(guard, addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -75,7 +75,7 @@ bool GetCallstack(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
{
|
||||
auto& ppc_state = system.GetPPCState();
|
||||
|
||||
if (!Core::IsRunning() || !PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[1]))
|
||||
if (!Core::IsRunning() || !PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[1]))
|
||||
return false;
|
||||
|
||||
if (LR(ppc_state) == 0)
|
||||
|
||||
@@ -19,23 +19,23 @@ namespace Core::Debug
|
||||
void OSContext::Read(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
{
|
||||
for (std::size_t i = 0; i < gpr.size(); i++)
|
||||
gpr[i] = PowerPC::HostRead_U32(guard, addr + u32(i * sizeof(int)));
|
||||
cr = PowerPC::HostRead_U32(guard, addr + 0x80);
|
||||
lr = PowerPC::HostRead_U32(guard, addr + 0x84);
|
||||
ctr = PowerPC::HostRead_U32(guard, addr + 0x88);
|
||||
xer = PowerPC::HostRead_U32(guard, addr + 0x8C);
|
||||
gpr[i] = PowerPC::MMU::HostRead_U32(guard, addr + u32(i * sizeof(int)));
|
||||
cr = PowerPC::MMU::HostRead_U32(guard, addr + 0x80);
|
||||
lr = PowerPC::MMU::HostRead_U32(guard, addr + 0x84);
|
||||
ctr = PowerPC::MMU::HostRead_U32(guard, addr + 0x88);
|
||||
xer = PowerPC::MMU::HostRead_U32(guard, addr + 0x8C);
|
||||
for (std::size_t i = 0; i < fpr.size(); i++)
|
||||
fpr[i] = PowerPC::HostRead_F64(guard, addr + 0x90 + u32(i * sizeof(double)));
|
||||
fpscr = PowerPC::HostRead_U64(guard, addr + 0x190);
|
||||
srr0 = PowerPC::HostRead_U32(guard, addr + 0x198);
|
||||
srr1 = PowerPC::HostRead_U32(guard, addr + 0x19c);
|
||||
dummy = PowerPC::HostRead_U16(guard, addr + 0x1a0);
|
||||
state = static_cast<OSContext::State>(PowerPC::HostRead_U16(guard, addr + 0x1a2));
|
||||
fpr[i] = PowerPC::MMU::HostRead_F64(guard, addr + 0x90 + u32(i * sizeof(double)));
|
||||
fpscr = PowerPC::MMU::HostRead_U64(guard, addr + 0x190);
|
||||
srr0 = PowerPC::MMU::HostRead_U32(guard, addr + 0x198);
|
||||
srr1 = PowerPC::MMU::HostRead_U32(guard, addr + 0x19c);
|
||||
dummy = PowerPC::MMU::HostRead_U16(guard, addr + 0x1a0);
|
||||
state = static_cast<OSContext::State>(PowerPC::MMU::HostRead_U16(guard, addr + 0x1a2));
|
||||
for (std::size_t i = 0; i < gqr.size(); i++)
|
||||
gqr[i] = PowerPC::HostRead_U32(guard, addr + 0x1a4 + u32(i * sizeof(int)));
|
||||
gqr[i] = PowerPC::MMU::HostRead_U32(guard, addr + 0x1a4 + u32(i * sizeof(int)));
|
||||
psf_padding = 0;
|
||||
for (std::size_t i = 0; i < psf.size(); i++)
|
||||
psf[i] = PowerPC::HostRead_F64(guard, addr + 0x1c8 + u32(i * sizeof(double)));
|
||||
psf[i] = PowerPC::MMU::HostRead_F64(guard, addr + 0x1c8 + u32(i * sizeof(double)));
|
||||
}
|
||||
|
||||
// Mutex offsets based on the following functions:
|
||||
@@ -44,12 +44,12 @@ void OSContext::Read(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
// - __OSUnlockAllMutex
|
||||
void OSMutex::Read(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
{
|
||||
thread_queue.head = PowerPC::HostRead_U32(guard, addr);
|
||||
thread_queue.tail = PowerPC::HostRead_U32(guard, addr + 0x4);
|
||||
owner_addr = PowerPC::HostRead_U32(guard, addr + 0x8);
|
||||
lock_count = PowerPC::HostRead_U32(guard, addr + 0xc);
|
||||
link.next = PowerPC::HostRead_U32(guard, addr + 0x10);
|
||||
link.prev = PowerPC::HostRead_U32(guard, addr + 0x14);
|
||||
thread_queue.head = PowerPC::MMU::HostRead_U32(guard, addr);
|
||||
thread_queue.tail = PowerPC::MMU::HostRead_U32(guard, addr + 0x4);
|
||||
owner_addr = PowerPC::MMU::HostRead_U32(guard, addr + 0x8);
|
||||
lock_count = PowerPC::MMU::HostRead_U32(guard, addr + 0xc);
|
||||
link.next = PowerPC::MMU::HostRead_U32(guard, addr + 0x10);
|
||||
link.prev = PowerPC::MMU::HostRead_U32(guard, addr + 0x14);
|
||||
}
|
||||
|
||||
// Thread offsets based on the following functions:
|
||||
@@ -67,38 +67,38 @@ void OSMutex::Read(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
void OSThread::Read(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
{
|
||||
context.Read(guard, addr);
|
||||
state = PowerPC::HostRead_U16(guard, addr + 0x2c8);
|
||||
is_detached = PowerPC::HostRead_U16(guard, addr + 0x2ca);
|
||||
suspend = PowerPC::HostRead_U32(guard, addr + 0x2cc);
|
||||
effective_priority = PowerPC::HostRead_U32(guard, addr + 0x2d0);
|
||||
base_priority = PowerPC::HostRead_U32(guard, addr + 0x2d4);
|
||||
exit_code_addr = PowerPC::HostRead_U32(guard, addr + 0x2d8);
|
||||
state = PowerPC::MMU::HostRead_U16(guard, addr + 0x2c8);
|
||||
is_detached = PowerPC::MMU::HostRead_U16(guard, addr + 0x2ca);
|
||||
suspend = PowerPC::MMU::HostRead_U32(guard, addr + 0x2cc);
|
||||
effective_priority = PowerPC::MMU::HostRead_U32(guard, addr + 0x2d0);
|
||||
base_priority = PowerPC::MMU::HostRead_U32(guard, addr + 0x2d4);
|
||||
exit_code_addr = PowerPC::MMU::HostRead_U32(guard, addr + 0x2d8);
|
||||
|
||||
queue_addr = PowerPC::HostRead_U32(guard, addr + 0x2dc);
|
||||
queue_link.next = PowerPC::HostRead_U32(guard, addr + 0x2e0);
|
||||
queue_link.prev = PowerPC::HostRead_U32(guard, addr + 0x2e4);
|
||||
queue_addr = PowerPC::MMU::HostRead_U32(guard, addr + 0x2dc);
|
||||
queue_link.next = PowerPC::MMU::HostRead_U32(guard, addr + 0x2e0);
|
||||
queue_link.prev = PowerPC::MMU::HostRead_U32(guard, addr + 0x2e4);
|
||||
|
||||
join_queue.head = PowerPC::HostRead_U32(guard, addr + 0x2e8);
|
||||
join_queue.tail = PowerPC::HostRead_U32(guard, addr + 0x2ec);
|
||||
join_queue.head = PowerPC::MMU::HostRead_U32(guard, addr + 0x2e8);
|
||||
join_queue.tail = PowerPC::MMU::HostRead_U32(guard, addr + 0x2ec);
|
||||
|
||||
mutex_addr = PowerPC::HostRead_U32(guard, addr + 0x2f0);
|
||||
mutex_queue.head = PowerPC::HostRead_U32(guard, addr + 0x2f4);
|
||||
mutex_queue.tail = PowerPC::HostRead_U32(guard, addr + 0x2f8);
|
||||
mutex_addr = PowerPC::MMU::HostRead_U32(guard, addr + 0x2f0);
|
||||
mutex_queue.head = PowerPC::MMU::HostRead_U32(guard, addr + 0x2f4);
|
||||
mutex_queue.tail = PowerPC::MMU::HostRead_U32(guard, addr + 0x2f8);
|
||||
|
||||
thread_link.next = PowerPC::HostRead_U32(guard, addr + 0x2fc);
|
||||
thread_link.prev = PowerPC::HostRead_U32(guard, addr + 0x300);
|
||||
thread_link.next = PowerPC::MMU::HostRead_U32(guard, addr + 0x2fc);
|
||||
thread_link.prev = PowerPC::MMU::HostRead_U32(guard, addr + 0x300);
|
||||
|
||||
stack_addr = PowerPC::HostRead_U32(guard, addr + 0x304);
|
||||
stack_end = PowerPC::HostRead_U32(guard, addr + 0x308);
|
||||
error = PowerPC::HostRead_U32(guard, addr + 0x30c);
|
||||
specific[0] = PowerPC::HostRead_U32(guard, addr + 0x310);
|
||||
specific[1] = PowerPC::HostRead_U32(guard, addr + 0x314);
|
||||
stack_addr = PowerPC::MMU::HostRead_U32(guard, addr + 0x304);
|
||||
stack_end = PowerPC::MMU::HostRead_U32(guard, addr + 0x308);
|
||||
error = PowerPC::MMU::HostRead_U32(guard, addr + 0x30c);
|
||||
specific[0] = PowerPC::MMU::HostRead_U32(guard, addr + 0x310);
|
||||
specific[1] = PowerPC::MMU::HostRead_U32(guard, addr + 0x314);
|
||||
}
|
||||
|
||||
bool OSThread::IsValid(const Core::CPUThreadGuard& guard) const
|
||||
{
|
||||
return PowerPC::HostIsRAMAddress(guard, stack_end) &&
|
||||
PowerPC::HostRead_U32(guard, stack_end) == STACK_MAGIC;
|
||||
return PowerPC::MMU::HostIsRAMAddress(guard, stack_end) &&
|
||||
PowerPC::MMU::HostRead_U32(guard, stack_end) == STACK_MAGIC;
|
||||
}
|
||||
|
||||
OSThreadView::OSThreadView(const Core::CPUThreadGuard& guard, u32 addr)
|
||||
@@ -192,9 +192,9 @@ std::string OSThreadView::GetSpecific(const Core::CPUThreadGuard& guard) const
|
||||
|
||||
for (u32 addr : m_thread.specific)
|
||||
{
|
||||
if (!PowerPC::HostIsRAMAddress(guard, addr))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, addr))
|
||||
break;
|
||||
specific += fmt::format("{:08x} \"{}\"\n", addr, PowerPC::HostGetString(guard, addr));
|
||||
specific += fmt::format("{:08x} \"{}\"\n", addr, PowerPC::MMU::HostGetString(guard, addr));
|
||||
}
|
||||
|
||||
return specific;
|
||||
|
||||
@@ -33,20 +33,20 @@ void ApplyMemoryPatch(const Core::CPUThreadGuard& guard, Common::Debug::MemoryPa
|
||||
|
||||
const u32 address = patch.address;
|
||||
const std::size_t size = patch.value.size();
|
||||
if (!PowerPC::HostIsRAMAddress(guard, address))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, address))
|
||||
return;
|
||||
|
||||
for (u32 offset = 0; offset < size; ++offset)
|
||||
{
|
||||
if (store_existing_value)
|
||||
{
|
||||
const u8 value = PowerPC::HostRead_U8(guard, address + offset);
|
||||
PowerPC::HostWrite_U8(guard, patch.value[offset], address + offset);
|
||||
const u8 value = PowerPC::MMU::HostRead_U8(guard, address + offset);
|
||||
PowerPC::MMU::HostWrite_U8(guard, patch.value[offset], address + offset);
|
||||
patch.value[offset] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, patch.value[offset], address + offset);
|
||||
PowerPC::MMU::HostWrite_U8(guard, patch.value[offset], address + offset);
|
||||
}
|
||||
|
||||
if (((address + offset) % 4) == 3)
|
||||
@@ -231,10 +231,10 @@ Common::Debug::Threads PPCDebugInterface::GetThreads(const Core::CPUThreadGuard&
|
||||
Common::Debug::Threads threads;
|
||||
|
||||
constexpr u32 ACTIVE_QUEUE_HEAD_ADDR = 0x800000dc;
|
||||
if (!PowerPC::HostIsRAMAddress(guard, ACTIVE_QUEUE_HEAD_ADDR))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, ACTIVE_QUEUE_HEAD_ADDR))
|
||||
return threads;
|
||||
const u32 active_queue_head = PowerPC::HostRead_U32(guard, ACTIVE_QUEUE_HEAD_ADDR);
|
||||
if (!PowerPC::HostIsRAMAddress(guard, active_queue_head))
|
||||
const u32 active_queue_head = PowerPC::MMU::HostRead_U32(guard, ACTIVE_QUEUE_HEAD_ADDR);
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, active_queue_head))
|
||||
return threads;
|
||||
|
||||
auto active_thread = std::make_unique<Core::Debug::OSThreadView>(guard, active_queue_head);
|
||||
@@ -243,7 +243,7 @@ Common::Debug::Threads PPCDebugInterface::GetThreads(const Core::CPUThreadGuard&
|
||||
|
||||
std::vector<u32> visited_addrs{active_thread->GetAddress()};
|
||||
const auto insert_threads = [&guard, &threads, &visited_addrs](u32 addr, auto get_next_addr) {
|
||||
while (addr != 0 && PowerPC::HostIsRAMAddress(guard, addr))
|
||||
while (addr != 0 && PowerPC::MMU::HostIsRAMAddress(guard, addr))
|
||||
{
|
||||
if (std::find(visited_addrs.begin(), visited_addrs.end(), addr) != visited_addrs.end())
|
||||
break;
|
||||
@@ -271,12 +271,12 @@ std::string PPCDebugInterface::Disassemble(const Core::CPUThreadGuard* guard, u3
|
||||
{
|
||||
if (guard)
|
||||
{
|
||||
if (!PowerPC::HostIsRAMAddress(*guard, address))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(*guard, address))
|
||||
{
|
||||
return "(No RAM here)";
|
||||
}
|
||||
|
||||
const u32 op = PowerPC::HostRead_Instruction(*guard, address);
|
||||
const u32 op = PowerPC::MMU::HostRead_Instruction(*guard, address);
|
||||
std::string disasm = Common::GekkoDisassembler::Disassemble(op, address);
|
||||
const UGeckoInstruction inst{op};
|
||||
|
||||
@@ -300,7 +300,7 @@ std::string PPCDebugInterface::GetRawMemoryString(const Core::CPUThreadGuard& gu
|
||||
{
|
||||
const bool is_aram = memory != 0;
|
||||
|
||||
if (is_aram || PowerPC::HostIsRAMAddress(guard, address))
|
||||
if (is_aram || PowerPC::MMU::HostIsRAMAddress(guard, address))
|
||||
{
|
||||
return fmt::format("{:08X}{}", ReadExtraMemory(guard, memory, address),
|
||||
is_aram ? " (ARAM)" : "");
|
||||
@@ -314,7 +314,7 @@ std::string PPCDebugInterface::GetRawMemoryString(const Core::CPUThreadGuard& gu
|
||||
|
||||
u32 PPCDebugInterface::ReadMemory(const Core::CPUThreadGuard& guard, u32 address) const
|
||||
{
|
||||
return PowerPC::HostRead_U32(guard, address);
|
||||
return PowerPC::MMU::HostRead_U32(guard, address);
|
||||
}
|
||||
|
||||
u32 PPCDebugInterface::ReadExtraMemory(const Core::CPUThreadGuard& guard, int memory,
|
||||
@@ -323,7 +323,7 @@ u32 PPCDebugInterface::ReadExtraMemory(const Core::CPUThreadGuard& guard, int me
|
||||
switch (memory)
|
||||
{
|
||||
case 0:
|
||||
return PowerPC::HostRead_U32(guard, address);
|
||||
return PowerPC::MMU::HostRead_U32(guard, address);
|
||||
case 1:
|
||||
{
|
||||
auto& dsp = Core::System::GetInstance().GetDSP();
|
||||
@@ -337,7 +337,7 @@ u32 PPCDebugInterface::ReadExtraMemory(const Core::CPUThreadGuard& guard, int me
|
||||
|
||||
u32 PPCDebugInterface::ReadInstruction(const Core::CPUThreadGuard& guard, u32 address) const
|
||||
{
|
||||
return PowerPC::HostRead_Instruction(guard, address);
|
||||
return PowerPC::MMU::HostRead_Instruction(guard, address);
|
||||
}
|
||||
|
||||
bool PPCDebugInterface::IsAlive() const
|
||||
@@ -412,7 +412,7 @@ u32 PPCDebugInterface::GetColor(const Core::CPUThreadGuard* guard, u32 address)
|
||||
{
|
||||
if (!guard || !IsAlive())
|
||||
return 0xFFFFFF;
|
||||
if (!PowerPC::HostIsRAMAddress(*guard, address))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(*guard, address))
|
||||
return 0xeeeeee;
|
||||
|
||||
Common::Symbol* symbol = g_symbolDB.GetSymbolFromAddr(address);
|
||||
|
||||
@@ -17,37 +17,42 @@
|
||||
void RSOHeaderView::Load(const Core::CPUThreadGuard& guard, u32 address)
|
||||
{
|
||||
m_address = address;
|
||||
m_header.entry.next_entry = PowerPC::HostRead_U32(guard, address);
|
||||
m_header.entry.prev_entry = PowerPC::HostRead_U32(guard, address + 0x04);
|
||||
m_header.entry.section_count = PowerPC::HostRead_U32(guard, address + 0x08);
|
||||
m_header.entry.section_table_offset = PowerPC::HostRead_U32(guard, address + 0xC);
|
||||
m_header.entry.name_offset = PowerPC::HostRead_U32(guard, address + 0x10);
|
||||
m_header.entry.name_size = PowerPC::HostRead_U32(guard, address + 0x14);
|
||||
m_header.entry.version = PowerPC::HostRead_U32(guard, address + 0x18);
|
||||
m_header.entry.bss_size = PowerPC::HostRead_U32(guard, address + 0x1C);
|
||||
m_header.section_info.prolog_section_index = PowerPC::HostRead_U8(guard, address + 0x20);
|
||||
m_header.section_info.epilog_section_index = PowerPC::HostRead_U8(guard, address + 0x21);
|
||||
m_header.section_info.unresolved_section_index = PowerPC::HostRead_U8(guard, address + 0x22);
|
||||
m_header.section_info.bss_section_index = PowerPC::HostRead_U8(guard, address + 0x23);
|
||||
m_header.section_info.prolog_offset = PowerPC::HostRead_U32(guard, address + 0x24);
|
||||
m_header.section_info.epilog_offset = PowerPC::HostRead_U32(guard, address + 0x28);
|
||||
m_header.section_info.unresolved_offset = PowerPC::HostRead_U32(guard, address + 0x2C);
|
||||
m_header.relocation_tables.internals_offset = PowerPC::HostRead_U32(guard, address + 0x30);
|
||||
m_header.relocation_tables.internals_size = PowerPC::HostRead_U32(guard, address + 0x34);
|
||||
m_header.relocation_tables.externals_offset = PowerPC::HostRead_U32(guard, address + 0x38);
|
||||
m_header.relocation_tables.externals_size = PowerPC::HostRead_U32(guard, address + 0x3C);
|
||||
m_header.symbol_tables.exports_offset = PowerPC::HostRead_U32(guard, address + 0x40);
|
||||
m_header.symbol_tables.exports_size = PowerPC::HostRead_U32(guard, address + 0x44);
|
||||
m_header.symbol_tables.exports_name_table = PowerPC::HostRead_U32(guard, address + 0x48);
|
||||
m_header.symbol_tables.imports_offset = PowerPC::HostRead_U32(guard, address + 0x4C);
|
||||
m_header.symbol_tables.imports_size = PowerPC::HostRead_U32(guard, address + 0x50);
|
||||
m_header.symbol_tables.imports_name_table = PowerPC::HostRead_U32(guard, address + 0x54);
|
||||
m_header.entry.next_entry = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
m_header.entry.prev_entry = PowerPC::MMU::HostRead_U32(guard, address + 0x04);
|
||||
m_header.entry.section_count = PowerPC::MMU::HostRead_U32(guard, address + 0x08);
|
||||
m_header.entry.section_table_offset = PowerPC::MMU::HostRead_U32(guard, address + 0xC);
|
||||
m_header.entry.name_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x10);
|
||||
m_header.entry.name_size = PowerPC::MMU::HostRead_U32(guard, address + 0x14);
|
||||
m_header.entry.version = PowerPC::MMU::HostRead_U32(guard, address + 0x18);
|
||||
m_header.entry.bss_size = PowerPC::MMU::HostRead_U32(guard, address + 0x1C);
|
||||
m_header.section_info.prolog_section_index = PowerPC::MMU::HostRead_U8(guard, address + 0x20);
|
||||
m_header.section_info.epilog_section_index = PowerPC::MMU::HostRead_U8(guard, address + 0x21);
|
||||
m_header.section_info.unresolved_section_index = PowerPC::MMU::HostRead_U8(guard, address + 0x22);
|
||||
m_header.section_info.bss_section_index = PowerPC::MMU::HostRead_U8(guard, address + 0x23);
|
||||
m_header.section_info.prolog_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x24);
|
||||
m_header.section_info.epilog_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x28);
|
||||
m_header.section_info.unresolved_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x2C);
|
||||
m_header.relocation_tables.internals_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x30);
|
||||
m_header.relocation_tables.internals_size = PowerPC::MMU::HostRead_U32(guard, address + 0x34);
|
||||
m_header.relocation_tables.externals_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x38);
|
||||
m_header.relocation_tables.externals_size = PowerPC::MMU::HostRead_U32(guard, address + 0x3C);
|
||||
m_header.symbol_tables.exports_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x40);
|
||||
m_header.symbol_tables.exports_size = PowerPC::MMU::HostRead_U32(guard, address + 0x44);
|
||||
m_header.symbol_tables.exports_name_table = PowerPC::MMU::HostRead_U32(guard, address + 0x48);
|
||||
m_header.symbol_tables.imports_offset = PowerPC::MMU::HostRead_U32(guard, address + 0x4C);
|
||||
m_header.symbol_tables.imports_size = PowerPC::MMU::HostRead_U32(guard, address + 0x50);
|
||||
m_header.symbol_tables.imports_name_table = PowerPC::MMU::HostRead_U32(guard, address + 0x54);
|
||||
|
||||
// Prevent an invalid name going wild
|
||||
if (m_header.entry.name_size < 0x100)
|
||||
m_name = PowerPC::HostGetString(guard, m_header.entry.name_offset, m_header.entry.name_size);
|
||||
{
|
||||
m_name =
|
||||
PowerPC::MMU::HostGetString(guard, m_header.entry.name_offset, m_header.entry.name_size);
|
||||
}
|
||||
else
|
||||
m_name = PowerPC::HostGetString(guard, m_header.entry.name_offset, 0x100);
|
||||
{
|
||||
m_name = PowerPC::MMU::HostGetString(guard, m_header.entry.name_offset, 0x100);
|
||||
}
|
||||
}
|
||||
|
||||
u32 RSOHeaderView::GetNextEntry() const
|
||||
@@ -176,8 +181,8 @@ void RSOSectionsView::Load(const Core::CPUThreadGuard& guard, u32 address, std::
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
{
|
||||
RSOSection section;
|
||||
section.offset = PowerPC::HostRead_U32(guard, address);
|
||||
section.size = PowerPC::HostRead_U32(guard, address + 4);
|
||||
section.offset = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
section.size = PowerPC::MMU::HostRead_U32(guard, address + 4);
|
||||
m_sections.emplace_back(std::move(section));
|
||||
address += sizeof(RSOSection);
|
||||
}
|
||||
@@ -204,9 +209,9 @@ void RSOImportsView::Load(const Core::CPUThreadGuard& guard, u32 address, std::s
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
{
|
||||
RSOImport rso_import;
|
||||
rso_import.name_offset = PowerPC::HostRead_U32(guard, address);
|
||||
rso_import.code_offset = PowerPC::HostRead_U32(guard, address + 4);
|
||||
rso_import.entry_offset = PowerPC::HostRead_U32(guard, address + 8);
|
||||
rso_import.name_offset = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
rso_import.code_offset = PowerPC::MMU::HostRead_U32(guard, address + 4);
|
||||
rso_import.entry_offset = PowerPC::MMU::HostRead_U32(guard, address + 8);
|
||||
m_imports.emplace_back(std::move(rso_import));
|
||||
address += sizeof(RSOImport);
|
||||
}
|
||||
@@ -233,10 +238,10 @@ void RSOExportsView::Load(const Core::CPUThreadGuard& guard, u32 address, std::s
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
{
|
||||
RSOExport rso_export;
|
||||
rso_export.name_offset = PowerPC::HostRead_U32(guard, address);
|
||||
rso_export.code_offset = PowerPC::HostRead_U32(guard, address + 4);
|
||||
rso_export.section_index = PowerPC::HostRead_U32(guard, address + 8);
|
||||
rso_export.hash = PowerPC::HostRead_U32(guard, address + 12);
|
||||
rso_export.name_offset = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
rso_export.code_offset = PowerPC::MMU::HostRead_U32(guard, address + 4);
|
||||
rso_export.section_index = PowerPC::MMU::HostRead_U32(guard, address + 8);
|
||||
rso_export.hash = PowerPC::MMU::HostRead_U32(guard, address + 12);
|
||||
m_exports.emplace_back(std::move(rso_export));
|
||||
address += sizeof(RSOExport);
|
||||
}
|
||||
@@ -263,9 +268,9 @@ void RSOInternalsView::Load(const Core::CPUThreadGuard& guard, u32 address, std:
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
{
|
||||
RSOInternalsEntry entry;
|
||||
entry.r_offset = PowerPC::HostRead_U32(guard, address);
|
||||
entry.r_info = PowerPC::HostRead_U32(guard, address + 4);
|
||||
entry.r_addend = PowerPC::HostRead_U32(guard, address + 8);
|
||||
entry.r_offset = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
entry.r_info = PowerPC::MMU::HostRead_U32(guard, address + 4);
|
||||
entry.r_addend = PowerPC::MMU::HostRead_U32(guard, address + 8);
|
||||
m_entries.emplace_back(std::move(entry));
|
||||
address += sizeof(RSOInternalsEntry);
|
||||
}
|
||||
@@ -292,9 +297,9 @@ void RSOExternalsView::Load(const Core::CPUThreadGuard& guard, u32 address, std:
|
||||
for (std::size_t i = 0; i < count; ++i)
|
||||
{
|
||||
RSOExternalsEntry entry;
|
||||
entry.r_offset = PowerPC::HostRead_U32(guard, address);
|
||||
entry.r_info = PowerPC::HostRead_U32(guard, address + 4);
|
||||
entry.r_addend = PowerPC::HostRead_U32(guard, address + 8);
|
||||
entry.r_offset = PowerPC::MMU::HostRead_U32(guard, address);
|
||||
entry.r_info = PowerPC::MMU::HostRead_U32(guard, address + 4);
|
||||
entry.r_addend = PowerPC::MMU::HostRead_U32(guard, address + 8);
|
||||
m_entries.emplace_back(std::move(entry));
|
||||
address += sizeof(RSOExternalsEntry);
|
||||
}
|
||||
@@ -443,7 +448,8 @@ const RSOImport& RSOView::GetImport(std::size_t index) const
|
||||
std::string RSOView::GetImportName(const Core::CPUThreadGuard& guard,
|
||||
const RSOImport& rso_import) const
|
||||
{
|
||||
return PowerPC::HostGetString(guard, m_header.GetImportsNameTable() + rso_import.name_offset);
|
||||
return PowerPC::MMU::HostGetString(guard,
|
||||
m_header.GetImportsNameTable() + rso_import.name_offset);
|
||||
}
|
||||
|
||||
const std::vector<RSOImport>& RSOView::GetImports() const
|
||||
@@ -464,7 +470,8 @@ const RSOExport& RSOView::GetExport(std::size_t index) const
|
||||
std::string RSOView::GetExportName(const Core::CPUThreadGuard& guard,
|
||||
const RSOExport& rso_export) const
|
||||
{
|
||||
return PowerPC::HostGetString(guard, m_header.GetExportsNameTable() + rso_export.name_offset);
|
||||
return PowerPC::MMU::HostGetString(guard,
|
||||
m_header.GetExportsNameTable() + rso_export.name_offset);
|
||||
}
|
||||
|
||||
u32 RSOView::GetExportAddress(const RSOExport& rso_export) const
|
||||
|
||||
@@ -654,8 +654,10 @@ void FifoPlayer::LoadMemory()
|
||||
ppc_state.spr[SPR_DBAT0L] = 0x00000002;
|
||||
ppc_state.spr[SPR_DBAT1U] = 0xc0001fff;
|
||||
ppc_state.spr[SPR_DBAT1L] = 0x0000002a;
|
||||
PowerPC::DBATUpdated();
|
||||
PowerPC::IBATUpdated();
|
||||
|
||||
auto& mmu = system.GetMMU();
|
||||
mmu.DBATUpdated();
|
||||
mmu.IBATUpdated();
|
||||
|
||||
SetupFifo();
|
||||
LoadRegisters();
|
||||
@@ -713,12 +715,12 @@ void FifoPlayer::LoadTextureMemory()
|
||||
|
||||
void FifoPlayer::WriteCP(u32 address, u16 value)
|
||||
{
|
||||
PowerPC::Write_U16(value, 0xCC000000 | address);
|
||||
Core::System::GetInstance().GetMMU().Write_U16(value, 0xCC000000 | address);
|
||||
}
|
||||
|
||||
void FifoPlayer::WritePI(u32 address, u32 value)
|
||||
{
|
||||
PowerPC::Write_U32(value, 0xCC003000 | address);
|
||||
Core::System::GetInstance().GetMMU().Write_U32(value, 0xCC003000 | address);
|
||||
}
|
||||
|
||||
void FifoPlayer::FlushWGP()
|
||||
@@ -823,13 +825,13 @@ bool FifoPlayer::ShouldLoadXF(u8 reg)
|
||||
bool FifoPlayer::IsIdleSet()
|
||||
{
|
||||
CommandProcessor::UCPStatusReg status =
|
||||
PowerPC::Read_U16(0xCC000000 | CommandProcessor::STATUS_REGISTER);
|
||||
Core::System::GetInstance().GetMMU().Read_U16(0xCC000000 | CommandProcessor::STATUS_REGISTER);
|
||||
return status.CommandIdle;
|
||||
}
|
||||
|
||||
bool FifoPlayer::IsHighWatermarkSet()
|
||||
{
|
||||
CommandProcessor::UCPStatusReg status =
|
||||
PowerPC::Read_U16(0xCC000000 | CommandProcessor::STATUS_REGISTER);
|
||||
Core::System::GetInstance().GetMMU().Read_U16(0xCC000000 | CommandProcessor::STATUS_REGISTER);
|
||||
return status.OverflowHiWatermark;
|
||||
}
|
||||
|
||||
@@ -142,17 +142,17 @@ static Installation InstallCodeHandlerLocked(const Core::CPUThreadGuard& guard)
|
||||
|
||||
// Install code handler
|
||||
for (u32 i = 0; i < data.size(); ++i)
|
||||
PowerPC::HostWrite_U8(guard, data[i], INSTALLER_BASE_ADDRESS + i);
|
||||
PowerPC::MMU::HostWrite_U8(guard, data[i], INSTALLER_BASE_ADDRESS + i);
|
||||
|
||||
// Patch the code handler to the current system type (Gamecube/Wii)
|
||||
for (unsigned int h = 0; h < data.length(); h += 4)
|
||||
{
|
||||
// Patch MMIO address
|
||||
if (PowerPC::HostRead_U32(guard, INSTALLER_BASE_ADDRESS + h) ==
|
||||
if (PowerPC::MMU::HostRead_U32(guard, INSTALLER_BASE_ADDRESS + h) ==
|
||||
(0x3f000000u | ((mmio_addr ^ 1) << 8)))
|
||||
{
|
||||
NOTICE_LOG_FMT(ACTIONREPLAY, "Patching MMIO access at {:08x}", INSTALLER_BASE_ADDRESS + h);
|
||||
PowerPC::HostWrite_U32(guard, 0x3f000000u | mmio_addr << 8, INSTALLER_BASE_ADDRESS + h);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x3f000000u | mmio_addr << 8, INSTALLER_BASE_ADDRESS + h);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,11 +162,11 @@ static Installation InstallCodeHandlerLocked(const Core::CPUThreadGuard& guard)
|
||||
|
||||
// Write a magic value to 'gameid' (codehandleronly does not actually read this).
|
||||
// This value will be read back and modified over time by HLE_Misc::GeckoCodeHandlerICacheFlush.
|
||||
PowerPC::HostWrite_U32(guard, MAGIC_GAMEID, INSTALLER_BASE_ADDRESS);
|
||||
PowerPC::MMU::HostWrite_U32(guard, MAGIC_GAMEID, INSTALLER_BASE_ADDRESS);
|
||||
|
||||
// Create GCT in memory
|
||||
PowerPC::HostWrite_U32(guard, 0x00d0c0de, codelist_base_address);
|
||||
PowerPC::HostWrite_U32(guard, 0x00d0c0de, codelist_base_address + 4);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x00d0c0de, codelist_base_address);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x00d0c0de, codelist_base_address + 4);
|
||||
|
||||
// Each code is 8 bytes (2 words) wide. There is a starter code and an end code.
|
||||
const u32 start_address = codelist_base_address + CODE_SIZE;
|
||||
@@ -189,8 +189,8 @@ static Installation InstallCodeHandlerLocked(const Core::CPUThreadGuard& guard)
|
||||
|
||||
for (const GeckoCode::Code& code : active_code.codes)
|
||||
{
|
||||
PowerPC::HostWrite_U32(guard, code.address, next_address);
|
||||
PowerPC::HostWrite_U32(guard, code.data, next_address + 4);
|
||||
PowerPC::MMU::HostWrite_U32(guard, code.address, next_address);
|
||||
PowerPC::MMU::HostWrite_U32(guard, code.data, next_address + 4);
|
||||
next_address += CODE_SIZE;
|
||||
}
|
||||
}
|
||||
@@ -199,12 +199,12 @@ static Installation InstallCodeHandlerLocked(const Core::CPUThreadGuard& guard)
|
||||
end_address - start_address);
|
||||
|
||||
// Stop code. Tells the handler that this is the end of the list.
|
||||
PowerPC::HostWrite_U32(guard, 0xF0000000, next_address);
|
||||
PowerPC::HostWrite_U32(guard, 0x00000000, next_address + 4);
|
||||
PowerPC::HostWrite_U32(guard, 0, HLE_TRAMPOLINE_ADDRESS);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0xF0000000, next_address);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0x00000000, next_address + 4);
|
||||
PowerPC::MMU::HostWrite_U32(guard, 0, HLE_TRAMPOLINE_ADDRESS);
|
||||
|
||||
// Turn on codes
|
||||
PowerPC::HostWrite_U8(guard, 1, INSTALLER_BASE_ADDRESS + 7);
|
||||
PowerPC::MMU::HostWrite_U8(guard, 1, INSTALLER_BASE_ADDRESS + 7);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& ppc_state = system.GetPPCState();
|
||||
@@ -274,17 +274,18 @@ void RunCodeHandler(const Core::CPUThreadGuard& guard)
|
||||
ppc_state.gpr[1] -= 8; // Fake stack frame for codehandler
|
||||
ppc_state.gpr[1] &= 0xFFFFFFF0; // Align stack to 16bytes
|
||||
u32 SP = ppc_state.gpr[1]; // Stack Pointer
|
||||
PowerPC::HostWrite_U32(guard, SP + 8, SP);
|
||||
PowerPC::MMU::HostWrite_U32(guard, SP + 8, SP);
|
||||
// SP + 4 is reserved for the codehandler to save LR to the stack.
|
||||
PowerPC::HostWrite_U32(guard, SFP, SP + 8); // Real stack frame
|
||||
PowerPC::HostWrite_U32(guard, ppc_state.pc, SP + 12);
|
||||
PowerPC::HostWrite_U32(guard, LR(ppc_state), SP + 16);
|
||||
PowerPC::HostWrite_U32(guard, ppc_state.cr.Get(), SP + 20);
|
||||
PowerPC::MMU::HostWrite_U32(guard, SFP, SP + 8); // Real stack frame
|
||||
PowerPC::MMU::HostWrite_U32(guard, ppc_state.pc, SP + 12);
|
||||
PowerPC::MMU::HostWrite_U32(guard, LR(ppc_state), SP + 16);
|
||||
PowerPC::MMU::HostWrite_U32(guard, ppc_state.cr.Get(), SP + 20);
|
||||
// Registers FPR0->13 are volatile
|
||||
for (int i = 0; i < 14; ++i)
|
||||
{
|
||||
PowerPC::HostWrite_U64(guard, ppc_state.ps[i].PS0AsU64(), SP + 24 + 2 * i * sizeof(u64));
|
||||
PowerPC::HostWrite_U64(guard, ppc_state.ps[i].PS1AsU64(), SP + 24 + (2 * i + 1) * sizeof(u64));
|
||||
PowerPC::MMU::HostWrite_U64(guard, ppc_state.ps[i].PS0AsU64(), SP + 24 + 2 * i * sizeof(u64));
|
||||
PowerPC::MMU::HostWrite_U64(guard, ppc_state.ps[i].PS1AsU64(),
|
||||
SP + 24 + (2 * i + 1) * sizeof(u64));
|
||||
}
|
||||
DEBUG_LOG_FMT(ACTIONREPLAY,
|
||||
"GeckoCodes: Initiating phantom branch-and-link. "
|
||||
|
||||
@@ -42,7 +42,7 @@ void GeckoCodeHandlerICacheFlush(const Core::CPUThreadGuard& guard)
|
||||
// been read into memory, or such, so we do the first 5 frames. More
|
||||
// robust alternative would be to actually detect memory writes, but that
|
||||
// would be even uglier.)
|
||||
u32 gch_gameid = PowerPC::HostRead_U32(guard, Gecko::INSTALLER_BASE_ADDRESS);
|
||||
u32 gch_gameid = PowerPC::MMU::HostRead_U32(guard, Gecko::INSTALLER_BASE_ADDRESS);
|
||||
if (gch_gameid - Gecko::MAGIC_GAMEID == 5)
|
||||
{
|
||||
return;
|
||||
@@ -51,7 +51,7 @@ void GeckoCodeHandlerICacheFlush(const Core::CPUThreadGuard& guard)
|
||||
{
|
||||
gch_gameid = Gecko::MAGIC_GAMEID;
|
||||
}
|
||||
PowerPC::HostWrite_U32(guard, gch_gameid + 1, Gecko::INSTALLER_BASE_ADDRESS);
|
||||
PowerPC::MMU::HostWrite_U32(guard, gch_gameid + 1, Gecko::INSTALLER_BASE_ADDRESS);
|
||||
|
||||
ppc_state.iCache.Reset();
|
||||
}
|
||||
@@ -67,14 +67,14 @@ void GeckoReturnTrampoline(const Core::CPUThreadGuard& guard)
|
||||
|
||||
// Stack frame is built in GeckoCode.cpp, Gecko::RunCodeHandler.
|
||||
u32 SP = ppc_state.gpr[1];
|
||||
ppc_state.gpr[1] = PowerPC::HostRead_U32(guard, SP + 8);
|
||||
ppc_state.npc = PowerPC::HostRead_U32(guard, SP + 12);
|
||||
LR(ppc_state) = PowerPC::HostRead_U32(guard, SP + 16);
|
||||
ppc_state.cr.Set(PowerPC::HostRead_U32(guard, SP + 20));
|
||||
ppc_state.gpr[1] = PowerPC::MMU::HostRead_U32(guard, SP + 8);
|
||||
ppc_state.npc = PowerPC::MMU::HostRead_U32(guard, SP + 12);
|
||||
LR(ppc_state) = PowerPC::MMU::HostRead_U32(guard, SP + 16);
|
||||
ppc_state.cr.Set(PowerPC::MMU::HostRead_U32(guard, SP + 20));
|
||||
for (int i = 0; i < 14; ++i)
|
||||
{
|
||||
ppc_state.ps[i].SetBoth(PowerPC::HostRead_U64(guard, SP + 24 + 2 * i * sizeof(u64)),
|
||||
PowerPC::HostRead_U64(guard, SP + 24 + (2 * i + 1) * sizeof(u64)));
|
||||
ppc_state.ps[i].SetBoth(PowerPC::MMU::HostRead_U64(guard, SP + 24 + 2 * i * sizeof(u64)),
|
||||
PowerPC::MMU::HostRead_U64(guard, SP + 24 + (2 * i + 1) * sizeof(u64)));
|
||||
}
|
||||
}
|
||||
} // namespace HLE_Misc
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Common/MsgHandler.h"
|
||||
#include "Common/StringUtil.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/HLE/HLE_VarArgs.h"
|
||||
#include "Core/PowerPC/MMU.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
@@ -56,11 +57,11 @@ void HLE_GeneralDebugPrint(const Core::CPUThreadGuard& guard, ParameterType para
|
||||
std::string report_message;
|
||||
|
||||
// Is gpr3 pointing to a pointer (including nullptr) rather than an ASCII string
|
||||
if (PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[3]) &&
|
||||
(PowerPC::HostIsRAMAddress(guard, PowerPC::HostRead_U32(guard, ppc_state.gpr[3])) ||
|
||||
PowerPC::HostRead_U32(guard, ppc_state.gpr[3]) == 0))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[3]) &&
|
||||
(PowerPC::MMU::HostIsRAMAddress(guard, PowerPC::MMU::HostRead_U32(guard, ppc_state.gpr[3])) ||
|
||||
PowerPC::MMU::HostRead_U32(guard, ppc_state.gpr[3]) == 0))
|
||||
{
|
||||
if (PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[4]))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[4]))
|
||||
{
|
||||
// ___blank(void* this, const char* fmt, ...);
|
||||
report_message = GetStringVA(system, guard, 4, parameter_type);
|
||||
@@ -73,7 +74,7 @@ void HLE_GeneralDebugPrint(const Core::CPUThreadGuard& guard, ParameterType para
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[3]))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[3]))
|
||||
{
|
||||
// ___blank(const char* fmt, ...);
|
||||
report_message = GetStringVA(system, guard, 3, parameter_type);
|
||||
@@ -106,13 +107,13 @@ void HLE_GeneralDebugVPrint(const Core::CPUThreadGuard& guard)
|
||||
// __write_console(int fd, const void* buffer, const u32* size)
|
||||
void HLE_write_console(const Core::CPUThreadGuard& guard)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
auto& system = guard.GetSystem();
|
||||
auto& ppc_state = system.GetPPCState();
|
||||
|
||||
std::string report_message = GetStringVA(system, guard, 4);
|
||||
if (PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[5]))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[5]))
|
||||
{
|
||||
const u32 size = PowerPC::Read_U32(ppc_state.gpr[5]);
|
||||
const u32 size = system.GetMMU().Read_U32(ppc_state.gpr[5]);
|
||||
if (size > report_message.size())
|
||||
WARN_LOG_FMT(OSREPORT_HLE, "__write_console uses an invalid size of {:#010x}", size);
|
||||
else if (size == 0)
|
||||
@@ -169,16 +170,16 @@ void HLE_LogFPrint(const Core::CPUThreadGuard& guard, ParameterType parameter_ty
|
||||
// The structure FILE is implementation defined.
|
||||
// Both libogc and Dolphin SDK seem to store the fd at the same address.
|
||||
int fd = -1;
|
||||
if (PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[3]) &&
|
||||
PowerPC::HostIsRAMAddress(guard, ppc_state.gpr[3] + 0xF))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[3]) &&
|
||||
PowerPC::MMU::HostIsRAMAddress(guard, ppc_state.gpr[3] + 0xF))
|
||||
{
|
||||
// The fd is stored as a short at FILE+0xE.
|
||||
fd = static_cast<short>(PowerPC::HostRead_U16(guard, ppc_state.gpr[3] + 0xE));
|
||||
fd = static_cast<short>(PowerPC::MMU::HostRead_U16(guard, ppc_state.gpr[3] + 0xE));
|
||||
}
|
||||
if (fd != 1 && fd != 2)
|
||||
{
|
||||
// On RVL SDK it seems stored at FILE+0x2.
|
||||
fd = static_cast<short>(PowerPC::HostRead_U16(guard, ppc_state.gpr[3] + 0x2));
|
||||
fd = static_cast<short>(PowerPC::MMU::HostRead_U16(guard, ppc_state.gpr[3] + 0x2));
|
||||
}
|
||||
if (fd != 1 && fd != 2)
|
||||
return;
|
||||
@@ -210,7 +211,7 @@ std::string GetStringVA(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
|
||||
std::string ArgumentBuffer;
|
||||
std::string result;
|
||||
std::string string = PowerPC::HostGetString(guard, ppc_state.gpr[str_reg]);
|
||||
std::string string = PowerPC::MMU::HostGetString(guard, ppc_state.gpr[str_reg]);
|
||||
auto ap =
|
||||
parameter_type == ParameterType::VariableArgumentList ?
|
||||
std::make_unique<HLE::SystemVABI::VAListStruct>(system, guard,
|
||||
@@ -242,8 +243,9 @@ std::string GetStringVA(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
switch (string[i])
|
||||
{
|
||||
case 's':
|
||||
result += StringFromFormat(ArgumentBuffer.c_str(),
|
||||
PowerPC::HostGetString(guard, ap->GetArgT<u32>(guard)).c_str());
|
||||
result +=
|
||||
StringFromFormat(ArgumentBuffer.c_str(),
|
||||
PowerPC::MMU::HostGetString(guard, ap->GetArgT<u32>(guard)).c_str());
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
|
||||
@@ -20,10 +20,10 @@ double HLE::SystemVABI::VAList::GetFPR(const Core::CPUThreadGuard&, u32 fpr) con
|
||||
|
||||
HLE::SystemVABI::VAListStruct::VAListStruct(Core::System& system, const Core::CPUThreadGuard& guard,
|
||||
u32 address)
|
||||
: VAList(system, 0), m_va_list{PowerPC::HostRead_U8(guard, address),
|
||||
PowerPC::HostRead_U8(guard, address + 1),
|
||||
PowerPC::HostRead_U32(guard, address + 4),
|
||||
PowerPC::HostRead_U32(guard, address + 8)},
|
||||
: VAList(system, 0), m_va_list{PowerPC::MMU::HostRead_U8(guard, address),
|
||||
PowerPC::MMU::HostRead_U8(guard, address + 1),
|
||||
PowerPC::MMU::HostRead_U32(guard, address + 4),
|
||||
PowerPC::MMU::HostRead_U32(guard, address + 8)},
|
||||
m_address(address), m_has_fpr_area(system.GetPPCState().cr.GetBit(6) == 1)
|
||||
{
|
||||
m_stack = m_va_list.overflow_arg_area;
|
||||
@@ -49,7 +49,7 @@ u32 HLE::SystemVABI::VAListStruct::GetGPR(const Core::CPUThreadGuard& guard, u32
|
||||
return 0;
|
||||
}
|
||||
const u32 gpr_address = Common::AlignUp(GetGPRArea() + 4 * (gpr - 3), 4);
|
||||
return PowerPC::HostRead_U32(guard, gpr_address);
|
||||
return PowerPC::MMU::HostRead_U32(guard, gpr_address);
|
||||
}
|
||||
|
||||
double HLE::SystemVABI::VAListStruct::GetFPR(const Core::CPUThreadGuard& guard, u32 fpr) const
|
||||
@@ -60,5 +60,5 @@ double HLE::SystemVABI::VAListStruct::GetFPR(const Core::CPUThreadGuard& guard,
|
||||
return 0.0;
|
||||
}
|
||||
const u32 fpr_address = Common::AlignUp(GetFPRArea() + 8 * (fpr - 1), 8);
|
||||
return PowerPC::HostRead_F64(guard, fpr_address);
|
||||
return PowerPC::MMU::HostRead_F64(guard, fpr_address);
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
|
||||
for (size_t i = 0; i < sizeof(T); i += 1, addr += 1)
|
||||
{
|
||||
reinterpret_cast<u8*>(&obj)[i] = PowerPC::HostRead_U8(guard, addr);
|
||||
reinterpret_cast<u8*>(&obj)[i] = PowerPC::MMU::HostRead_U8(guard, addr);
|
||||
}
|
||||
|
||||
return obj;
|
||||
@@ -76,7 +76,7 @@ public:
|
||||
else
|
||||
{
|
||||
m_stack = Common::AlignUp(m_stack, 4);
|
||||
value = PowerPC::HostRead_U32(guard, m_stack);
|
||||
value = PowerPC::MMU::HostRead_U32(guard, m_stack);
|
||||
m_stack += 4;
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ public:
|
||||
else
|
||||
{
|
||||
m_stack = Common::AlignUp(m_stack, 8);
|
||||
value = PowerPC::HostRead_U64(guard, m_stack);
|
||||
value = PowerPC::MMU::HostRead_U64(guard, m_stack);
|
||||
m_stack += 8;
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
else
|
||||
{
|
||||
m_stack = Common::AlignUp(m_stack, 8);
|
||||
value = PowerPC::HostRead_F64(guard, m_stack);
|
||||
value = PowerPC::MMU::HostRead_F64(guard, m_stack);
|
||||
m_stack += 8;
|
||||
}
|
||||
|
||||
|
||||
@@ -84,43 +84,43 @@ struct EffectiveAddressSpaceAccessors : Accessors
|
||||
{
|
||||
bool IsValidAddress(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostIsRAMAddress(guard, address);
|
||||
return PowerPC::MMU::HostIsRAMAddress(guard, address);
|
||||
}
|
||||
u8 ReadU8(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostRead_U8(guard, address);
|
||||
return PowerPC::MMU::HostRead_U8(guard, address);
|
||||
}
|
||||
void WriteU8(const Core::CPUThreadGuard& guard, u32 address, u8 value) override
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, value, address);
|
||||
PowerPC::MMU::HostWrite_U8(guard, value, address);
|
||||
}
|
||||
u16 ReadU16(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostRead_U16(guard, address);
|
||||
return PowerPC::MMU::HostRead_U16(guard, address);
|
||||
}
|
||||
void WriteU16(const Core::CPUThreadGuard& guard, u32 address, u16 value) override
|
||||
{
|
||||
PowerPC::HostWrite_U16(guard, value, address);
|
||||
PowerPC::MMU::HostWrite_U16(guard, value, address);
|
||||
}
|
||||
u32 ReadU32(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostRead_U32(guard, address);
|
||||
return PowerPC::MMU::HostRead_U32(guard, address);
|
||||
}
|
||||
void WriteU32(const Core::CPUThreadGuard& guard, u32 address, u32 value) override
|
||||
{
|
||||
PowerPC::HostWrite_U32(guard, value, address);
|
||||
PowerPC::MMU::HostWrite_U32(guard, value, address);
|
||||
}
|
||||
u64 ReadU64(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostRead_U64(guard, address);
|
||||
return PowerPC::MMU::HostRead_U64(guard, address);
|
||||
}
|
||||
void WriteU64(const Core::CPUThreadGuard& guard, u32 address, u64 value) override
|
||||
{
|
||||
PowerPC::HostWrite_U64(guard, value, address);
|
||||
PowerPC::MMU::HostWrite_U64(guard, value, address);
|
||||
}
|
||||
float ReadF32(const Core::CPUThreadGuard& guard, u32 address) const override
|
||||
{
|
||||
return PowerPC::HostRead_F32(guard, address);
|
||||
return PowerPC::MMU::HostRead_F32(guard, address);
|
||||
};
|
||||
|
||||
bool Matches(const Core::CPUThreadGuard& guard, u32 haystack_start, const u8* needle_start,
|
||||
@@ -128,16 +128,17 @@ struct EffectiveAddressSpaceAccessors : Accessors
|
||||
{
|
||||
auto& system = guard.GetSystem();
|
||||
auto& memory = system.GetMemory();
|
||||
auto& mmu = system.GetMMU();
|
||||
|
||||
u32 page_base = haystack_start & 0xfffff000;
|
||||
u32 offset = haystack_start & 0x0000fff;
|
||||
do
|
||||
{
|
||||
if (!PowerPC::HostIsRAMAddress(guard, page_base))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, page_base))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
auto page_physical_address = PowerPC::GetTranslatedAddress(page_base);
|
||||
auto page_physical_address = mmu.GetTranslatedAddress(page_base);
|
||||
if (!page_physical_address.has_value())
|
||||
{
|
||||
return false;
|
||||
@@ -184,7 +185,7 @@ struct EffectiveAddressSpaceAccessors : Accessors
|
||||
const u32 haystack_offset_change = forward ? 1 : -1;
|
||||
do
|
||||
{
|
||||
if (PowerPC::HostIsRAMAddress(guard, haystack_address))
|
||||
if (PowerPC::MMU::HostIsRAMAddress(guard, haystack_address))
|
||||
{
|
||||
do
|
||||
{
|
||||
|
||||
@@ -72,8 +72,8 @@ u32 MemoryWatcher::ChasePointer(const Core::CPUThreadGuard& guard, const std::st
|
||||
u32 value = 0;
|
||||
for (u32 offset : m_addresses[line])
|
||||
{
|
||||
value = PowerPC::HostRead_U32(guard, value + offset);
|
||||
if (!PowerPC::HostIsRAMAddress(guard, value))
|
||||
value = PowerPC::MMU::HostRead_U32(guard, value + offset);
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, value))
|
||||
break;
|
||||
}
|
||||
return value;
|
||||
|
||||
@@ -245,17 +245,22 @@ static void ApplyPatches(const Core::CPUThreadGuard& guard, const std::vector<Pa
|
||||
switch (entry.type)
|
||||
{
|
||||
case PatchType::Patch8Bit:
|
||||
if (!entry.conditional || PowerPC::HostRead_U8(guard, addr) == static_cast<u8>(comparand))
|
||||
PowerPC::HostWrite_U8(guard, static_cast<u8>(value), addr);
|
||||
if (!entry.conditional ||
|
||||
PowerPC::MMU::HostRead_U8(guard, addr) == static_cast<u8>(comparand))
|
||||
{
|
||||
PowerPC::MMU::HostWrite_U8(guard, static_cast<u8>(value), addr);
|
||||
}
|
||||
break;
|
||||
case PatchType::Patch16Bit:
|
||||
if (!entry.conditional ||
|
||||
PowerPC::HostRead_U16(guard, addr) == static_cast<u16>(comparand))
|
||||
PowerPC::HostWrite_U16(guard, static_cast<u16>(value), addr);
|
||||
PowerPC::MMU::HostRead_U16(guard, addr) == static_cast<u16>(comparand))
|
||||
{
|
||||
PowerPC::MMU::HostWrite_U16(guard, static_cast<u16>(value), addr);
|
||||
}
|
||||
break;
|
||||
case PatchType::Patch32Bit:
|
||||
if (!entry.conditional || PowerPC::HostRead_U32(guard, addr) == comparand)
|
||||
PowerPC::HostWrite_U32(guard, value, addr);
|
||||
if (!entry.conditional || PowerPC::MMU::HostRead_U32(guard, addr) == comparand)
|
||||
PowerPC::MMU::HostWrite_U32(guard, value, addr);
|
||||
break;
|
||||
default:
|
||||
// unknown patchtype
|
||||
@@ -288,19 +293,19 @@ static bool IsStackValid(const Core::CPUThreadGuard& guard)
|
||||
|
||||
// Check the stack pointer
|
||||
u32 SP = ppc_state.gpr[1];
|
||||
if (!PowerPC::HostIsRAMAddress(guard, SP))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, SP))
|
||||
return false;
|
||||
|
||||
// Read the frame pointer from the stack (find 2nd frame from top), assert that it makes sense
|
||||
u32 next_SP = PowerPC::HostRead_U32(guard, SP);
|
||||
if (next_SP <= SP || !PowerPC::HostIsRAMAddress(guard, next_SP) ||
|
||||
!PowerPC::HostIsRAMAddress(guard, next_SP + 4))
|
||||
u32 next_SP = PowerPC::MMU::HostRead_U32(guard, SP);
|
||||
if (next_SP <= SP || !PowerPC::MMU::HostIsRAMAddress(guard, next_SP) ||
|
||||
!PowerPC::MMU::HostIsRAMAddress(guard, next_SP + 4))
|
||||
return false;
|
||||
|
||||
// Check the link register makes sense (that it points to a valid IBAT address)
|
||||
const u32 address = PowerPC::HostRead_U32(guard, next_SP + 4);
|
||||
return PowerPC::HostIsInstructionRAMAddress(guard, address) &&
|
||||
0 != PowerPC::HostRead_Instruction(guard, address);
|
||||
const u32 address = PowerPC::MMU::HostRead_U32(guard, next_SP + 4);
|
||||
return PowerPC::MMU::HostIsInstructionRAMAddress(guard, address) &&
|
||||
0 != PowerPC::MMU::HostRead_Instruction(guard, address);
|
||||
}
|
||||
|
||||
void AddMemoryPatch(std::size_t index)
|
||||
|
||||
@@ -280,7 +280,7 @@ void MemChecks::Add(TMemCheck memory_check)
|
||||
// watchpoint-compatible code.
|
||||
if (!had_any)
|
||||
Core::System::GetInstance().GetJitInterface().ClearCache();
|
||||
PowerPC::DBATUpdated();
|
||||
Core::System::GetInstance().GetMMU().DBATUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -309,7 +309,7 @@ void MemChecks::Remove(u32 address)
|
||||
m_mem_checks.erase(iter);
|
||||
if (!HasAny())
|
||||
Core::System::GetInstance().GetJitInterface().ClearCache();
|
||||
PowerPC::DBATUpdated();
|
||||
Core::System::GetInstance().GetMMU().DBATUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -318,7 +318,7 @@ void MemChecks::Clear()
|
||||
Core::RunAsCPUThread([&] {
|
||||
m_mem_checks.clear();
|
||||
Core::System::GetInstance().GetJitInterface().ClearCache();
|
||||
PowerPC::DBATUpdated();
|
||||
Core::System::GetInstance().GetMMU().DBATUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -31,49 +31,49 @@ static void HostWrite(const Core::CPUThreadGuard& guard, T var, u32 address);
|
||||
template <>
|
||||
u8 HostRead(const Core::CPUThreadGuard& guard, u32 address)
|
||||
{
|
||||
return PowerPC::HostRead_U8(guard, address);
|
||||
return PowerPC::MMU::HostRead_U8(guard, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
u16 HostRead(const Core::CPUThreadGuard& guard, u32 address)
|
||||
{
|
||||
return PowerPC::HostRead_U16(guard, address);
|
||||
return PowerPC::MMU::HostRead_U16(guard, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
u32 HostRead(const Core::CPUThreadGuard& guard, u32 address)
|
||||
{
|
||||
return PowerPC::HostRead_U32(guard, address);
|
||||
return PowerPC::MMU::HostRead_U32(guard, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
u64 HostRead(const Core::CPUThreadGuard& guard, u32 address)
|
||||
{
|
||||
return PowerPC::HostRead_U64(guard, address);
|
||||
return PowerPC::MMU::HostRead_U64(guard, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
void HostWrite(const Core::CPUThreadGuard& guard, u8 var, u32 address)
|
||||
{
|
||||
PowerPC::HostWrite_U8(guard, var, address);
|
||||
PowerPC::MMU::HostWrite_U8(guard, var, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
void HostWrite(const Core::CPUThreadGuard& guard, u16 var, u32 address)
|
||||
{
|
||||
PowerPC::HostWrite_U16(guard, var, address);
|
||||
PowerPC::MMU::HostWrite_U16(guard, var, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
void HostWrite(const Core::CPUThreadGuard& guard, u32 var, u32 address)
|
||||
{
|
||||
PowerPC::HostWrite_U32(guard, var, address);
|
||||
PowerPC::MMU::HostWrite_U32(guard, var, address);
|
||||
}
|
||||
|
||||
template <>
|
||||
void HostWrite(const Core::CPUThreadGuard& guard, u64 var, u32 address)
|
||||
{
|
||||
PowerPC::HostWrite_U64(guard, var, address);
|
||||
PowerPC::MMU::HostWrite_U64(guard, var, address);
|
||||
}
|
||||
|
||||
template <typename T, typename U = T>
|
||||
@@ -146,7 +146,7 @@ static std::optional<std::string> ReadStringArg(const Core::CPUThreadGuard& guar
|
||||
if (!std::isnan(num))
|
||||
{
|
||||
u32 address = static_cast<u32>(num);
|
||||
return PowerPC::HostGetString(guard, address);
|
||||
return PowerPC::MMU::HostGetString(guard, address);
|
||||
}
|
||||
|
||||
const char* cstr = expr_get_str(e);
|
||||
|
||||
@@ -821,7 +821,7 @@ static void ReadMemory(const Core::CPUThreadGuard& guard)
|
||||
if (len * 2 > sizeof reply)
|
||||
SendReply("E01");
|
||||
|
||||
if (!PowerPC::HostIsRAMAddress(guard, addr))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, addr))
|
||||
return SendReply("E00");
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
@@ -848,7 +848,7 @@ static void WriteMemory(const Core::CPUThreadGuard& guard)
|
||||
len = (len << 4) | Hex2char(s_cmd_bfr[i++]);
|
||||
INFO_LOG_FMT(GDB_STUB, "gdb: write memory: {:08x} bytes to {:08x}", len, addr);
|
||||
|
||||
if (!PowerPC::HostIsRAMAddress(guard, addr))
|
||||
if (!PowerPC::MMU::HostIsRAMAddress(guard, addr))
|
||||
return SendReply("E00");
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user