From 4726c9075f7c1578eef6626ff4bb299a92ed0f71 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 14 May 2017 15:38:17 +0200 Subject: [PATCH 1/3] Split SetupBAT into SetupMSR and SetupBAT --- Source/Core/Core/Boot/Boot.cpp | 1 + Source/Core/Core/Boot/Boot.h | 1 + Source/Core/Core/Boot/Boot_BS2Emu.cpp | 8 +++++++- Source/Core/Core/Boot/Boot_ELF.cpp | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index c69d50b75c..57a8aab533 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -358,6 +358,7 @@ bool CBoot::BootUp() if (dolWii) { HID4.SBE = 1; + SetupMSR(); SetupBAT(dolWii); // Because there is no TMD to get the requested system (IOS) version from, diff --git a/Source/Core/Core/Boot/Boot.h b/Source/Core/Core/Boot/Boot.h index 22af0f5773..65caed6dae 100644 --- a/Source/Core/Core/Boot/Boot.h +++ b/Source/Core/Core/Boot/Boot.h @@ -54,6 +54,7 @@ private: static bool Boot_ELF(const std::string& filename); static bool Boot_WiiWAD(const std::string& filename); + static void SetupMSR(); static void SetupBAT(bool is_wii); static bool RunApploader(bool is_wii, const DiscIO::IVolume& volume); static bool EmulatedBS2_GC(const DiscIO::IVolume* volume, bool skip_app_loader = false); diff --git a/Source/Core/Core/Boot/Boot_BS2Emu.cpp b/Source/Core/Core/Boot/Boot_BS2Emu.cpp index ad662cf7f3..8f14297f36 100644 --- a/Source/Core/Core/Boot/Boot_BS2Emu.cpp +++ b/Source/Core/Core/Boot/Boot_BS2Emu.cpp @@ -51,13 +51,17 @@ void CBoot::RunFunction(u32 address) PowerPC::SingleStep(); } -void CBoot::SetupBAT(bool is_wii) +void CBoot::SetupMSR() { UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); m_MSR.FP = 1; m_MSR.DR = 1; m_MSR.IR = 1; m_MSR.EE = 1; +} + +void CBoot::SetupBAT(bool is_wii) +{ PowerPC::ppcState.spr[SPR_IBAT0U] = 0x80001fff; PowerPC::ppcState.spr[SPR_IBAT0L] = 0x00000002; PowerPC::ppcState.spr[SPR_DBAT0U] = 0x80001fff; @@ -155,6 +159,7 @@ bool CBoot::EmulatedBS2_GC(const DiscIO::IVolume* volume, bool skip_app_loader) { INFO_LOG(BOOT, "Faking GC BS2..."); + SetupMSR(); SetupBAT(/*is_wii*/ false); // Write necessary values @@ -346,6 +351,7 @@ bool CBoot::EmulatedBS2_Wii(const DiscIO::IVolume* volume) // after this check during booting. DVDRead(*volume, 0, 0x3180, 4, true); + SetupMSR(); SetupBAT(/*is_wii*/ true); Memory::Write_U32(0x4c000064, 0x00000300); // Write default DSI Handler: rfi diff --git a/Source/Core/Core/Boot/Boot_ELF.cpp b/Source/Core/Core/Boot/Boot_ELF.cpp index 9130fafdfc..1cef0937ba 100644 --- a/Source/Core/Core/Boot/Boot_ELF.cpp +++ b/Source/Core/Core/Boot/Boot_ELF.cpp @@ -70,6 +70,7 @@ bool CBoot::Boot_ELF(const std::string& filename) const bool is_wii = IsElfWii(filename); if (is_wii) HID4.SBE = 1; + SetupMSR(); SetupBAT(is_wii); if (!reader.LoadSymbols()) From a6283f6eecc671ba6acc2612d9fa1624f681975b Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 14 May 2017 15:44:55 +0200 Subject: [PATCH 2/3] Use SetupBAT in Load_BS2 --- Source/Core/Core/Boot/Boot.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index 57a8aab533..fe325308d7 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -254,18 +254,12 @@ bool CBoot::Load_BS2(const std::string& boot_rom_filename) PowerPC::ppcState.gpr[5] = 0x0000009c; PowerPC::ppcState.msr = 0x00002030; PowerPC::ppcState.spr[SPR_HID0] = 0x0011c464; - PowerPC::ppcState.spr[SPR_IBAT0U] = 0x80001fff; - PowerPC::ppcState.spr[SPR_IBAT0L] = 0x00000002; PowerPC::ppcState.spr[SPR_IBAT3U] = 0xfff0001f; PowerPC::ppcState.spr[SPR_IBAT3L] = 0xfff00001; - PowerPC::ppcState.spr[SPR_DBAT0U] = 0x80001fff; - PowerPC::ppcState.spr[SPR_DBAT0L] = 0x00000002; - PowerPC::ppcState.spr[SPR_DBAT1U] = 0xc0001fff; - PowerPC::ppcState.spr[SPR_DBAT1L] = 0x0000002a; PowerPC::ppcState.spr[SPR_DBAT3U] = 0xfff0001f; PowerPC::ppcState.spr[SPR_DBAT3L] = 0xfff00001; - PowerPC::DBATUpdated(); - PowerPC::IBATUpdated(); + SetupBAT(/*is_wii*/ false); + PC = 0x81200150; return true; } From 1e56972e4fcd67be6bad1e9a201c29fe295f5d07 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 14 May 2017 15:56:17 +0200 Subject: [PATCH 3/3] Make Load_BS2's MSR poking more readable --- Source/Core/Core/Boot/Boot.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index fe325308d7..9dca35b426 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -249,10 +249,16 @@ bool CBoot::Load_BS2(const std::string& boot_rom_filename) // to work around this. Memory::CopyToEmu(0x01200000, data.data() + 0x100, 0x700); Memory::CopyToEmu(0x01300000, data.data() + 0x820, 0x1AFE00); + PowerPC::ppcState.gpr[3] = 0xfff0001f; PowerPC::ppcState.gpr[4] = 0x00002030; PowerPC::ppcState.gpr[5] = 0x0000009c; - PowerPC::ppcState.msr = 0x00002030; + + UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); + m_MSR.FP = 1; + m_MSR.DR = 1; + m_MSR.IR = 1; + PowerPC::ppcState.spr[SPR_HID0] = 0x0011c464; PowerPC::ppcState.spr[SPR_IBAT3U] = 0xfff0001f; PowerPC::ppcState.spr[SPR_IBAT3L] = 0xfff00001;