From 31a7f53282040c7df93204d647de470390b96c4b Mon Sep 17 00:00:00 2001 From: Jesse Talavera Date: Wed, 13 Mar 2024 09:55:20 -0400 Subject: Fix a crash when using DSi mode in debug builds on macOS (#1976) Store the BIOS images in `NDSArgs`/`DSiArgs` through pointers, not directly - This will make it easier to keep such objects on the stack --- src/Args.h | 12 ++++++++---- src/DSi.cpp | 4 ++-- src/NDS.cpp | 8 ++++---- src/frontend/qt_sdl/EmuThread.cpp | 8 ++++---- src/frontend/qt_sdl/ROMManager.cpp | 40 +++++++++++++++++++------------------- src/frontend/qt_sdl/ROMManager.h | 12 +++++++----- 6 files changed, 45 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/Args.h b/src/Args.h index d836b64..0b20bbf 100644 --- a/src/Args.h +++ b/src/Args.h @@ -69,6 +69,10 @@ struct JITArgs bool FastMemory = true; }; +using ARM9BIOSImage = std::array; +using ARM7BIOSImage = std::array; +using DSiBIOSImage = std::array; + struct GDBArgs { u16 PortARM7 = 0; @@ -95,11 +99,11 @@ struct NDSArgs /// NDS ARM9 BIOS to install. /// Defaults to FreeBIOS, which is not compatible with DSi mode. - std::array ARM9BIOS = bios_arm9_bin; + std::unique_ptr ARM9BIOS = std::make_unique(bios_arm9_bin); /// NDS ARM7 BIOS to install. /// Defaults to FreeBIOS, which is not compatible with DSi mode. - std::array ARM7BIOS = bios_arm7_bin; + std::unique_ptr ARM7BIOS = std::make_unique(bios_arm7_bin); /// Firmware image to install. /// Defaults to generated NDS firmware. @@ -131,8 +135,8 @@ struct NDSArgs /// Contains no virtual methods, so there's no vtable. struct DSiArgs final : public NDSArgs { - std::array ARM9iBIOS = BrokenBIOS; - std::array ARM7iBIOS = BrokenBIOS; + std::unique_ptr ARM9iBIOS = std::make_unique(BrokenBIOS); + std::unique_ptr ARM7iBIOS = std::make_unique(BrokenBIOS); /// NAND image to install. /// Required, there is no default value. diff --git a/src/DSi.cpp b/src/DSi.cpp index c929c6d..306c5d1 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -82,8 +82,8 @@ DSi::DSi(DSiArgs&& args) noexcept : DSi_NDMA(1, 2, *this), DSi_NDMA(1, 3, *this), }, - ARM7iBIOS(args.ARM7iBIOS), - ARM9iBIOS(args.ARM9iBIOS), + ARM7iBIOS(*args.ARM7iBIOS), + ARM9iBIOS(*args.ARM9iBIOS), DSP(*this), SDMMC(*this, std::move(args.NANDImage), std::move(args.DSiSDCard)), SDIO(*this), diff --git a/src/NDS.cpp b/src/NDS.cpp index 1f9597c..284f6eb 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -80,8 +80,8 @@ NDS::NDS() noexcept : NDSArgs { nullptr, nullptr, - bios_arm9_bin, - bios_arm7_bin, + std::make_unique(bios_arm9_bin), + std::make_unique(bios_arm7_bin), Firmware(0), } ) @@ -90,8 +90,8 @@ NDS::NDS() noexcept : NDS::NDS(NDSArgs&& args, int type) noexcept : ConsoleType(type), - ARM7BIOS(args.ARM7BIOS), - ARM9BIOS(args.ARM9BIOS), + ARM7BIOS(*args.ARM7BIOS), + ARM9BIOS(*args.ARM9BIOS), ARM7BIOSNative(CRC32(ARM7BIOS.data(), ARM7BIOS.size()) == ARM7BIOSCRC32), ARM9BIOSNative(CRC32(ARM9BIOS.data(), ARM9BIOS.size()) == ARM9BIOSCRC32), JIT(*this, args.JIT), diff --git a/src/frontend/qt_sdl/EmuThread.cpp b/src/frontend/qt_sdl/EmuThread.cpp index 0728a08..d16aead 100644 --- a/src/frontend/qt_sdl/EmuThread.cpp +++ b/src/frontend/qt_sdl/EmuThread.cpp @@ -131,8 +131,8 @@ std::unique_ptr EmuThread::CreateConsole( NDSArgs ndsargs { std::move(ndscart), std::move(gbacart), - *arm9bios, - *arm7bios, + std::move(arm9bios), + std::move(arm7bios), std::move(*firmware), #ifdef JIT_ENABLED Config::JIT_Enable ? std::make_optional(jitargs) : std::nullopt, @@ -165,8 +165,8 @@ std::unique_ptr EmuThread::CreateConsole( auto sdcard = ROMManager::LoadDSiSDCard(); DSiArgs args { std::move(ndsargs), - *arm9ibios, - *arm7ibios, + std::move(arm9ibios), + std::move(arm7ibios), std::move(*nand), std::move(sdcard), Config::DSiFullBIOSBoot, diff --git a/src/frontend/qt_sdl/ROMManager.cpp b/src/frontend/qt_sdl/ROMManager.cpp index de1d864..6550846 100644 --- a/src/frontend/qt_sdl/ROMManager.cpp +++ b/src/frontend/qt_sdl/ROMManager.cpp @@ -512,59 +512,59 @@ void LoadCheats(NDS& nds) nds.AREngine.SetCodeFile(CheatsOn ? CheatFile : nullptr); } -std::optional> LoadARM9BIOS() noexcept +std::unique_ptr LoadARM9BIOS() noexcept { if (!Config::ExternalBIOSEnable) { - return Config::ConsoleType == 0 ? std::make_optional(bios_arm9_bin) : std::nullopt; + return Config::ConsoleType == 0 ? std::make_unique(bios_arm9_bin) : nullptr; } if (FileHandle* f = OpenLocalFile(Config::BIOS9Path, Read)) { - std::array bios {}; + std::unique_ptr bios = std::make_unique(); FileRewind(f); - FileRead(bios.data(), sizeof(bios), 1, f); + FileRead(bios->data(), bios->size(), 1, f); CloseFile(f); Log(Info, "ARM9 BIOS loaded from %s\n", Config::BIOS9Path.c_str()); return bios; } Log(Warn, "ARM9 BIOS not found\n"); - return std::nullopt; + return nullptr; } -std::optional> LoadARM7BIOS() noexcept +std::unique_ptr LoadARM7BIOS() noexcept { if (!Config::ExternalBIOSEnable) { - return Config::ConsoleType == 0 ? std::make_optional(bios_arm7_bin) : std::nullopt; + return Config::ConsoleType == 0 ? std::make_unique(bios_arm7_bin) : nullptr; } if (FileHandle* f = OpenLocalFile(Config::BIOS7Path, Read)) { - std::array bios {}; - FileRead(bios.data(), sizeof(bios), 1, f); + std::unique_ptr bios = std::make_unique(); + FileRead(bios->data(), bios->size(), 1, f); CloseFile(f); Log(Info, "ARM7 BIOS loaded from %s\n", Config::BIOS7Path.c_str()); return bios; } Log(Warn, "ARM7 BIOS not found\n"); - return std::nullopt; + return nullptr; } -std::optional> LoadDSiARM9BIOS() noexcept +std::unique_ptr LoadDSiARM9BIOS() noexcept { if (FileHandle* f = OpenLocalFile(Config::DSiBIOS9Path, Read)) { - std::array bios {}; - FileRead(bios.data(), sizeof(bios), 1, f); + std::unique_ptr bios = std::make_unique(); + FileRead(bios->data(), bios->size(), 1, f); CloseFile(f); if (!Config::DSiFullBIOSBoot) { // herp - *(u32*)&bios[0] = 0xEAFFFFFE; // overwrites the reset vector + *(u32*)bios->data() = 0xEAFFFFFE; // overwrites the reset vector // TODO!!!! // hax the upper 32K out of the goddamn DSi @@ -575,21 +575,21 @@ std::optional> LoadDSiARM9BIOS() noexcept } Log(Warn, "ARM9i BIOS not found\n"); - return std::nullopt; + return nullptr; } -std::optional> LoadDSiARM7BIOS() noexcept +std::unique_ptr LoadDSiARM7BIOS() noexcept { if (FileHandle* f = OpenLocalFile(Config::DSiBIOS7Path, Read)) { - std::array bios {}; - FileRead(bios.data(), sizeof(bios), 1, f); + std::unique_ptr bios = std::make_unique(); + FileRead(bios->data(), bios->size(), 1, f); CloseFile(f); if (!Config::DSiFullBIOSBoot) { // herp - *(u32*)&bios[0] = 0xEAFFFFFE; // overwrites the reset vector + *(u32*)bios->data() = 0xEAFFFFFE; // overwrites the reset vector // TODO!!!! // hax the upper 32K out of the goddamn DSi @@ -600,7 +600,7 @@ std::optional> LoadDSiARM7BIOS() noexcept } Log(Warn, "ARM7i BIOS not found\n"); - return std::nullopt; + return nullptr; } Firmware GenerateFirmware(int type) noexcept diff --git a/src/frontend/qt_sdl/ROMManager.h b/src/frontend/qt_sdl/ROMManager.h index 38ed65c..6d0b81d 100644 --- a/src/frontend/qt_sdl/ROMManager.h +++ b/src/frontend/qt_sdl/ROMManager.h @@ -26,6 +26,8 @@ #include #include "MemConstants.h" + +#include #include #include #include @@ -56,11 +58,11 @@ void ClearBackupState(); /// Returns the configured ARM9 BIOS loaded from disk, /// the FreeBIOS if external BIOS is disabled and we're in NDS mode, -/// or nullopt if loading failed. -std::optional> LoadARM9BIOS() noexcept; -std::optional> LoadARM7BIOS() noexcept; -std::optional> LoadDSiARM9BIOS() noexcept; -std::optional> LoadDSiARM7BIOS() noexcept; +/// or nullptr if loading failed. +std::unique_ptr LoadARM9BIOS() noexcept; +std::unique_ptr LoadARM7BIOS() noexcept; +std::unique_ptr LoadDSiARM9BIOS() noexcept; +std::unique_ptr LoadDSiARM7BIOS() noexcept; std::optional GetDSiSDCardArgs() noexcept; std::optional LoadDSiSDCard() noexcept; std::optional GetDLDISDCardArgs() noexcept; -- cgit v1.2.3