diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index 09877c5a80..381f1a7e4c 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -321,26 +321,24 @@ static const DiscIO::VolumeDisc* SetDisc(std::unique_ptr dis return pointer; } -bool CBoot::DVDRead(const DiscIO::VolumeDisc& disc, u64 dvd_offset, u32 output_address, u32 length, - const DiscIO::Partition& partition) +bool CBoot::DVDRead(Core::System& system, const DiscIO::VolumeDisc& disc, u64 dvd_offset, + u32 output_address, u32 length, const DiscIO::Partition& partition) { std::vector buffer(length); if (!disc.Read(dvd_offset, length, buffer.data(), partition)) return false; - auto& system = Core::System::GetInstance(); auto& memory = system.GetMemory(); memory.CopyToEmu(output_address, buffer.data(), length); return true; } -bool CBoot::DVDReadDiscID(const DiscIO::VolumeDisc& disc, u32 output_address) +bool CBoot::DVDReadDiscID(Core::System& system, const DiscIO::VolumeDisc& disc, u32 output_address) { std::array buffer; if (!disc.Read(0, buffer.size(), buffer.data(), DiscIO::PARTITION_NONE)) return false; - auto& system = Core::System::GetInstance(); auto& memory = system.GetMemory(); memory.CopyToEmu(output_address, buffer.data(), buffer.size()); @@ -550,14 +548,14 @@ bool CBoot::BootUp(Core::System& system, const Core::CPUThreadGuard& guard, // Because there is no TMD to get the requested system (IOS) version from, // we default to IOS58, which is the version used by the Homebrew Channel. SetupWiiMemory(system, IOS::HLE::IOSC::ConsoleType::Retail); - IOS::HLE::GetIOS()->BootIOS(Titles::IOS(58)); + IOS::HLE::GetIOS()->BootIOS(system, Titles::IOS(58)); } else { SetupGCMemory(system, guard); } - if (!executable.reader->LoadIntoMemory()) + if (!executable.reader->LoadIntoMemory(system)) { PanicAlertFmtT("Failed to load the executable to memory."); return false; diff --git a/Source/Core/Core/Boot/Boot.h b/Source/Core/Core/Boot/Boot.h index 47eab60add..cb162b6b33 100644 --- a/Source/Core/Core/Boot/Boot.h +++ b/Source/Core/Core/Boot/Boot.h @@ -171,9 +171,10 @@ public: static bool LoadMapFromFilename(const Core::CPUThreadGuard& guard); private: - static bool DVDRead(const DiscIO::VolumeDisc& disc, u64 dvd_offset, u32 output_address, - u32 length, const DiscIO::Partition& partition); - static bool DVDReadDiscID(const DiscIO::VolumeDisc& disc, u32 output_address); + static bool DVDRead(Core::System& system, const DiscIO::VolumeDisc& disc, u64 dvd_offset, + u32 output_address, u32 length, const DiscIO::Partition& partition); + static bool DVDReadDiscID(Core::System& system, const DiscIO::VolumeDisc& disc, + u32 output_address); static void RunFunction(Core::System& system, u32 address); static void UpdateDebugger_MapLoaded(); @@ -213,7 +214,7 @@ public: virtual u32 GetEntryPoint() const = 0; virtual bool IsValid() const = 0; virtual bool IsWii() const = 0; - virtual bool LoadIntoMemory(bool only_in_mem1 = false) const = 0; + virtual bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const = 0; virtual bool LoadSymbols(const Core::CPUThreadGuard& guard) const = 0; protected: diff --git a/Source/Core/Core/Boot/Boot_BS2Emu.cpp b/Source/Core/Core/Boot/Boot_BS2Emu.cpp index df6acd0976..e72c491664 100644 --- a/Source/Core/Core/Boot/Boot_BS2Emu.cpp +++ b/Source/Core/Core/Boot/Boot_BS2Emu.cpp @@ -148,7 +148,7 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard INFO_LOG_FMT(BOOT, "Invalid apploader. Your disc image is probably corrupted."); return false; } - DVDRead(volume, offset + 0x20, 0x01200000, *size + *trailer, partition); + DVDRead(system, volume, offset + 0x20, 0x01200000, *size + *trailer, partition); // TODO - Make Apploader(or just RunFunction()) debuggable!!! @@ -195,7 +195,7 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard INFO_LOG_FMT(BOOT, "DVDRead: offset: {:08x} memOffset: {:08x} length: {}", dvd_offset, ram_address, length); - DVDRead(volume, dvd_offset, ram_address, length, partition); + DVDRead(system, volume, dvd_offset, ram_address, length, partition); DiscIO::Riivolution::ApplyApploaderMemoryPatches(guard, riivolution_patches, ram_address, length); @@ -284,7 +284,7 @@ bool CBoot::EmulatedBS2_GC(Core::System& system, const Core::CPUThreadGuard& gua auto& vertex_shader_manager = system.GetVertexShaderManager(); vertex_shader_manager.InvalidateXFRange(XFMEM_POSTMATRICES + 0x3d * 4, XFMEM_POSTMATRICES_END); - DVDReadDiscID(volume, 0x00000000); + DVDReadDiscID(system, volume, 0x00000000); auto& memory = system.GetMemory(); bool streaming = memory.Read_U8(0x80000008); @@ -554,7 +554,7 @@ bool CBoot::EmulatedBS2_Wii(Core::System& system, const Core::CPUThreadGuard& gu const u64 ios = ios_override >= 0 ? Titles::IOS(static_cast(ios_override)) : tmd.GetIOSId(); const auto console_type = volume.GetTicket(data_partition).GetConsoleType(); - if (!SetupWiiMemory(system, console_type) || !IOS::HLE::GetIOS()->BootIOS(ios)) + if (!SetupWiiMemory(system, console_type) || !IOS::HLE::GetIOS()->BootIOS(system, ios)) return false; auto di = @@ -563,13 +563,13 @@ bool CBoot::EmulatedBS2_Wii(Core::System& system, const Core::CPUThreadGuard& gu di->InitializeIfFirstTime(); di->ChangePartition(data_partition); - DVDReadDiscID(volume, 0x00000000); + DVDReadDiscID(system, volume, 0x00000000); // This is some kind of consistency check that is compared to the 0x00 // values as the game boots. This location keeps the 4 byte ID for as long // as the game is running. The 6 byte ID at 0x00 is overwritten sometime // after this check during booting. - DVDRead(volume, 0, 0x3180, 4, partition); + DVDRead(system, volume, 0, 0x3180, 4, partition); auto& ppc_state = system.GetPPCState(); diff --git a/Source/Core/Core/Boot/DolReader.cpp b/Source/Core/Core/Boot/DolReader.cpp index 3cd001bae6..c78cd36fcb 100644 --- a/Source/Core/Core/Boot/DolReader.cpp +++ b/Source/Core/Core/Boot/DolReader.cpp @@ -110,15 +110,14 @@ bool DolReader::Initialize(const std::vector& buffer) return true; } -bool DolReader::LoadIntoMemory(bool only_in_mem1) const +bool DolReader::LoadIntoMemory(Core::System& system, bool only_in_mem1) const { if (!m_is_valid) return false; if (m_is_ancast) - return LoadAncastIntoMemory(); + return LoadAncastIntoMemory(system); - auto& system = Core::System::GetInstance(); auto& memory = system.GetMemory(); // load all text (code) sections @@ -149,7 +148,7 @@ bool DolReader::LoadIntoMemory(bool only_in_mem1) const } // On a real console this would be done in the Espresso bootrom -bool DolReader::LoadAncastIntoMemory() const +bool DolReader::LoadAncastIntoMemory(Core::System& system) const { // The ancast image will always be in data section 0 const auto& section = m_data_sections[0]; @@ -227,7 +226,6 @@ bool DolReader::LoadAncastIntoMemory() const body_size)) return false; - auto& system = Core::System::GetInstance(); auto& memory = system.GetMemory(); // Copy the Ancast header to the emu diff --git a/Source/Core/Core/Boot/DolReader.h b/Source/Core/Core/Boot/DolReader.h index 4ceef9bd8b..af227bb3fe 100644 --- a/Source/Core/Core/Boot/DolReader.h +++ b/Source/Core/Core/Boot/DolReader.h @@ -26,7 +26,7 @@ public: bool IsWii() const override { return m_is_wii; } bool IsAncast() const { return m_is_ancast; }; u32 GetEntryPoint() const override { return m_dolheader.entryPoint; } - bool LoadIntoMemory(bool only_in_mem1 = false) const override; + bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override; bool LoadSymbols(const Core::CPUThreadGuard& guard) const override { return false; } private: @@ -63,5 +63,5 @@ private: // Copy sections to internal buffers bool Initialize(const std::vector& buffer); - bool LoadAncastIntoMemory() const; + bool LoadAncastIntoMemory(Core::System& system) const; }; diff --git a/Source/Core/Core/Boot/ElfReader.cpp b/Source/Core/Core/Boot/ElfReader.cpp index 85024857e3..f1281601ea 100644 --- a/Source/Core/Core/Boot/ElfReader.cpp +++ b/Source/Core/Core/Boot/ElfReader.cpp @@ -124,7 +124,7 @@ const char* ElfReader::GetSectionName(int section) const } // This is just a simple elf loader, good enough to load elfs generated by devkitPPC -bool ElfReader::LoadIntoMemory(bool only_in_mem1) const +bool ElfReader::LoadIntoMemory(Core::System& system, bool only_in_mem1) const { INFO_LOG_FMT(BOOT, "String section: {}", header->e_shstrndx); @@ -136,7 +136,6 @@ bool ElfReader::LoadIntoMemory(bool only_in_mem1) const INFO_LOG_FMT(BOOT, "{} segments:", header->e_phnum); - auto& system = Core::System::GetInstance(); auto& memory = system.GetMemory(); // Copy segments into ram. diff --git a/Source/Core/Core/Boot/ElfReader.h b/Source/Core/Core/Boot/ElfReader.h index 8c5406776d..28b4631c6e 100644 --- a/Source/Core/Core/Boot/ElfReader.h +++ b/Source/Core/Core/Boot/ElfReader.h @@ -35,7 +35,7 @@ public: ElfMachine GetMachine() const { return (ElfMachine)(header->e_machine); } u32 GetEntryPoint() const override { return entryPoint; } u32 GetFlags() const { return (u32)(header->e_flags); } - bool LoadIntoMemory(bool only_in_mem1 = false) const override; + bool LoadIntoMemory(Core::System& system, bool only_in_mem1 = false) const override; bool LoadSymbols(const Core::CPUThreadGuard& guard) const override; // TODO: actually check for validity. bool IsValid() const override { return true; } diff --git a/Source/Core/Core/IOS/ES/ES.cpp b/Source/Core/Core/IOS/ES/ES.cpp index 9c823e9a4f..238b38152f 100644 --- a/Source/Core/Core/IOS/ES/ES.cpp +++ b/Source/Core/Core/IOS/ES/ES.cpp @@ -362,7 +362,8 @@ bool ESDevice::LaunchIOS(u64 ios_title_id, HangPPC hang_ppc) const ES::TicketReader ticket = FindSignedTicket(ios_title_id); ES::Content content; if (!tmd.IsValid() || !ticket.IsValid() || !tmd.GetContent(tmd.GetBootIndex(), &content) || - !m_ios.BootIOS(ios_title_id, hang_ppc, GetContentPath(ios_title_id, content))) + !m_ios.BootIOS(Core::System::GetInstance(), ios_title_id, hang_ppc, + GetContentPath(ios_title_id, content))) { PanicAlertFmtT("Could not launch IOS {0:016x} because it is missing from the NAND.\n" "The emulated software will likely hang now.", @@ -372,7 +373,7 @@ bool ESDevice::LaunchIOS(u64 ios_title_id, HangPPC hang_ppc) return true; } - return m_ios.BootIOS(ios_title_id, hang_ppc); + return m_ios.BootIOS(Core::System::GetInstance(), ios_title_id, hang_ppc); } s32 ESDevice::WriteLaunchFile(const ES::TMDReader& tmd, Ticks ticks) @@ -471,7 +472,8 @@ bool ESDevice::LaunchPPCTitle(u64 title_id) bool ESDevice::BootstrapPPC() { - const bool result = m_ios.BootstrapPPC(m_pending_ppc_boot_content_path); + const bool result = + m_ios.BootstrapPPC(Core::System::GetInstance(), m_pending_ppc_boot_content_path); m_pending_ppc_boot_content_path = {}; return result; } diff --git a/Source/Core/Core/IOS/IOS.cpp b/Source/Core/Core/IOS/IOS.cpp index 3f17ababf7..9f9478dc71 100644 --- a/Source/Core/Core/IOS/IOS.cpp +++ b/Source/Core/Core/IOS/IOS.cpp @@ -403,7 +403,7 @@ static std::vector ReadBootContent(FSDevice* fs, const std::string& path, si // This corresponds to syscall 0x41, which loads a binary from the NAND and bootstraps the PPC. // Unlike 0x42, IOS will set up some constants in memory before booting the PPC. -bool Kernel::BootstrapPPC(const std::string& boot_content_path) +bool Kernel::BootstrapPPC(Core::System& system, const std::string& boot_content_path) { // Seeking and processing overhead is ignored as most time is spent reading from the NAND. u64 ticks = 0; @@ -422,12 +422,11 @@ bool Kernel::BootstrapPPC(const std::string& boot_content_path) if (dol.IsAncast()) INFO_LOG_FMT(IOS, "BootstrapPPC: Loading ancast image"); - if (!dol.LoadIntoMemory()) + if (!dol.LoadIntoMemory(system)) return false; INFO_LOG_FMT(IOS, "BootstrapPPC: {}", boot_content_path); - Core::System::GetInstance().GetCoreTiming().ScheduleEvent(ticks, s_event_finish_ppc_bootstrap, - dol.IsAncast()); + system.GetCoreTiming().ScheduleEvent(ticks, s_event_finish_ppc_bootstrap, dol.IsAncast()); return true; } @@ -478,7 +477,8 @@ static constexpr SystemTimers::TimeBaseTick GetIOSBootTicks(u32 version) // Passing a boot content path is optional because we do not require IOSes // to be installed at the moment. If one is passed, the boot binary must exist // on the NAND, or the call will fail like on a Wii. -bool Kernel::BootIOS(const u64 ios_title_id, HangPPC hang_ppc, const std::string& boot_content_path) +bool Kernel::BootIOS(Core::System& system, const u64 ios_title_id, HangPPC hang_ppc, + const std::string& boot_content_path) { // IOS suspends regular PPC<->ARM IPC before loading a new IOS. // IPC is not resumed if the boot fails for any reason. @@ -494,7 +494,7 @@ bool Kernel::BootIOS(const u64 ios_title_id, HangPPC hang_ppc, const std::string return false; ElfReader elf{binary.GetElf()}; - if (!elf.LoadIntoMemory(true)) + if (!elf.LoadIntoMemory(system, true)) return false; } @@ -503,8 +503,8 @@ bool Kernel::BootIOS(const u64 ios_title_id, HangPPC hang_ppc, const std::string if (Core::IsRunningAndStarted()) { - Core::System::GetInstance().GetCoreTiming().ScheduleEvent( - GetIOSBootTicks(GetVersion()), s_event_finish_ios_boot, ios_title_id); + system.GetCoreTiming().ScheduleEvent(GetIOSBootTicks(GetVersion()), s_event_finish_ios_boot, + ios_title_id); } else { diff --git a/Source/Core/Core/IOS/IOS.h b/Source/Core/Core/IOS/IOS.h index cac8f2b7f5..a9ca0ec0f5 100644 --- a/Source/Core/Core/IOS/IOS.h +++ b/Source/Core/Core/IOS/IOS.h @@ -20,6 +20,11 @@ class PointerWrap; +namespace Core +{ +class System; +} + namespace IOS::HLE { namespace FS @@ -134,8 +139,8 @@ public: void SetGidForPPC(u16 gid); u16 GetGidForPPC() const; - bool BootstrapPPC(const std::string& boot_content_path); - bool BootIOS(u64 ios_title_id, HangPPC hang_ppc = HangPPC::No, + bool BootstrapPPC(Core::System& system, const std::string& boot_content_path); + bool BootIOS(Core::System& system, u64 ios_title_id, HangPPC hang_ppc = HangPPC::No, const std::string& boot_content_path = {}); void InitIPC(); u32 GetVersion() const;