diff --git a/Source/Core/Core/Boot/Boot_BS2Emu.cpp b/Source/Core/Core/Boot/Boot_BS2Emu.cpp index b462e89edc..a44796dd4f 100644 --- a/Source/Core/Core/Boot/Boot_BS2Emu.cpp +++ b/Source/Core/Core/Boot/Boot_BS2Emu.cpp @@ -233,17 +233,8 @@ bool CBoot::RunApploader(Core::System& system, const Core::CPUThreadGuard& guard if (system.IsTriforce()) { auto& memory = system.GetMemory(); - const u32 disc_size = volume.GetDataSize(); - // Load game into RAM, like on the actual Triforce - u8* dimm = AMMediaboard::InitDIMM(disc_size); - if (!dimm) - { - ERROR_LOG_FMT(BOOT, "AMMediaboard::InitDIMM failed"); - return false; - } - - volume.Read(0, disc_size, dimm, DiscIO::PARTITION_NONE); + AMMediaboard::InitDIMM(volume); // Triforce disc register obfuscation AMMediaboard::InitKeys(memory.Read_U32(0), memory.Read_U32(4), memory.Read_U32(8)); diff --git a/Source/Core/Core/HW/DVD/AMMediaboard.cpp b/Source/Core/Core/HW/DVD/AMMediaboard.cpp index 0c2260628c..4ceca81925 100644 --- a/Source/Core/Core/HW/DVD/AMMediaboard.cpp +++ b/Source/Core/Core/HW/DVD/AMMediaboard.cpp @@ -11,7 +11,6 @@ #include -#include "Common/Buffer.h" #include "Common/CommonTypes.h" #include "Common/FileUtil.h" #include "Common/IOFile.h" @@ -37,6 +36,8 @@ #include "Core/Movie.h" #include "Core/System.h" +#include "DiscIO/CachedBlob.h" + #if defined(__linux__) or defined(__APPLE__) or defined(__FreeBSD__) or defined(__NetBSD__) or \ defined(__HAIKU__) @@ -142,7 +143,7 @@ static File::IOFile s_extra; static File::IOFile s_backup; static File::IOFile s_dimm; -static Common::UniqueBuffer s_dimm_disc; +static std::unique_ptr s_dimm_disc; static u8 s_firmware[2 * 1024 * 1024]; static u32 s_media_buffer_32[192]; @@ -499,20 +500,10 @@ void Init() s_test_menu = true; } -u8* InitDIMM(u32 size) +void InitDIMM(const DiscIO::Volume& volume) { - if (size == 0) - return nullptr; - - s_dimm_disc.reset(size); - if (s_dimm_disc.empty()) - { - PanicAlertFmt("Failed to allocate DIMM memory."); - return nullptr; - } - - s_firmware_map = false; - return s_dimm_disc.data(); + // Load game into RAM, like on the actual Triforce. + s_dimm_disc = DiscIO::CreateCachedBlobReader(volume.GetBlobReader().CopyReader()); } static int PlatformPoll(std::span pfds, std::chrono::milliseconds timeout) @@ -1556,13 +1547,13 @@ u32 ExecuteCommand(std::array& dicmd_buf, u32* diimm_buf, u32 address, u return 0; } - if (s_dimm_disc.size()) + if (const auto span = memory.GetSpanForAddress(address); span.size() < length) + { + ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: Invalid DIMM Disc read from: offset={}, length={}", + offset, length); + } + else if (s_dimm_disc->Read(offset, length, span.data())) { - if (!SafeCopyToEmu(memory, address, s_dimm_disc.data(), s_dimm_disc.size(), offset, length)) - { - ERROR_LOG_FMT(AMMEDIABOARD, "GC-AM: Invalid DIMM Disc read from: offset={}, length={}", - offset, length); - } return 0; } @@ -1996,7 +1987,8 @@ void Shutdown() s_extra.Close(); s_backup.Close(); s_dimm.Close(); - s_dimm_disc.clear(); + + s_dimm_disc.reset(); CloseAllSockets(); } diff --git a/Source/Core/Core/HW/DVD/AMMediaboard.h b/Source/Core/Core/HW/DVD/AMMediaboard.h index f5d19662ea..8ca7c7d9fd 100644 --- a/Source/Core/Core/HW/DVD/AMMediaboard.h +++ b/Source/Core/Core/HW/DVD/AMMediaboard.h @@ -11,6 +11,8 @@ #include "Common/ChunkFile.h" #include "Common/CommonTypes.h" +#include "DiscIO/Volume.h" + enum GameType { FZeroAX = 1, @@ -230,7 +232,7 @@ enum SocketStatusCodes void Init(); void FirmwareMap(bool on); -u8* InitDIMM(u32 size); +void InitDIMM(const DiscIO::Volume& volume); void InitKeys(u32 key_a, u32 key_b, u32 key_c); u32 ExecuteCommand(std::array& dicmd_buf, u32* diimm_buf, u32 address, u32 length); u32 GetGameType();