diff options
| author | Jesse Talavera <jesse@jesse.tg> | 2024-03-13 09:55:20 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-13 14:55:20 +0100 | 
| commit | 31a7f53282040c7df93204d647de470390b96c4b (patch) | |
| tree | 0c8fcb6ab0b7c70e90e462169e209a805c25027a | |
| parent | ea1755bed0378a2f3783e78c5e63c266583218ce (diff) | |
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
| -rw-r--r-- | src/Args.h | 12 | ||||
| -rw-r--r-- | src/DSi.cpp | 4 | ||||
| -rw-r--r-- | src/NDS.cpp | 8 | ||||
| -rw-r--r-- | src/frontend/qt_sdl/EmuThread.cpp | 8 | ||||
| -rw-r--r-- | src/frontend/qt_sdl/ROMManager.cpp | 40 | ||||
| -rw-r--r-- | src/frontend/qt_sdl/ROMManager.h | 12 | 
6 files changed, 45 insertions, 39 deletions
@@ -69,6 +69,10 @@ struct JITArgs      bool FastMemory = true;  }; +using ARM9BIOSImage = std::array<u8, ARM9BIOSSize>; +using ARM7BIOSImage = std::array<u8, ARM7BIOSSize>; +using DSiBIOSImage = std::array<u8, DSiBIOSSize>; +  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<u8, ARM9BIOSSize> ARM9BIOS = bios_arm9_bin; +    std::unique_ptr<ARM9BIOSImage> ARM9BIOS = std::make_unique<ARM9BIOSImage>(bios_arm9_bin);      /// NDS ARM7 BIOS to install.      /// Defaults to FreeBIOS, which is not compatible with DSi mode. -    std::array<u8, ARM7BIOSSize> ARM7BIOS = bios_arm7_bin; +    std::unique_ptr<ARM7BIOSImage> ARM7BIOS = std::make_unique<ARM7BIOSImage>(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<u8, DSiBIOSSize> ARM9iBIOS = BrokenBIOS<DSiBIOSSize>; -    std::array<u8, DSiBIOSSize> ARM7iBIOS = BrokenBIOS<DSiBIOSSize>; +    std::unique_ptr<DSiBIOSImage> ARM9iBIOS = std::make_unique<DSiBIOSImage>(BrokenBIOS<DSiBIOSSize>); +    std::unique_ptr<DSiBIOSImage> ARM7iBIOS = std::make_unique<DSiBIOSImage>(BrokenBIOS<DSiBIOSSize>);      /// 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<ARM9BIOSImage>(bios_arm9_bin), +            std::make_unique<ARM7BIOSImage>(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<NDS> 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<NDS> 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<std::array<u8, ARM9BIOSSize>> LoadARM9BIOS() noexcept +std::unique_ptr<ARM9BIOSImage> LoadARM9BIOS() noexcept  {      if (!Config::ExternalBIOSEnable)      { -        return Config::ConsoleType == 0 ? std::make_optional(bios_arm9_bin) : std::nullopt; +        return Config::ConsoleType == 0 ? std::make_unique<ARM9BIOSImage>(bios_arm9_bin) : nullptr;      }      if (FileHandle* f = OpenLocalFile(Config::BIOS9Path, Read))      { -        std::array<u8, ARM9BIOSSize> bios {}; +        std::unique_ptr<ARM9BIOSImage> bios = std::make_unique<ARM9BIOSImage>();          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<std::array<u8, ARM7BIOSSize>> LoadARM7BIOS() noexcept +std::unique_ptr<ARM7BIOSImage> LoadARM7BIOS() noexcept  {      if (!Config::ExternalBIOSEnable)      { -        return Config::ConsoleType == 0 ? std::make_optional(bios_arm7_bin) : std::nullopt; +        return Config::ConsoleType == 0 ? std::make_unique<ARM7BIOSImage>(bios_arm7_bin) : nullptr;      }      if (FileHandle* f = OpenLocalFile(Config::BIOS7Path, Read))      { -        std::array<u8, ARM7BIOSSize> bios {}; -        FileRead(bios.data(), sizeof(bios), 1, f); +        std::unique_ptr<ARM7BIOSImage> bios = std::make_unique<ARM7BIOSImage>(); +        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<std::array<u8, DSiBIOSSize>> LoadDSiARM9BIOS() noexcept +std::unique_ptr<DSiBIOSImage> LoadDSiARM9BIOS() noexcept  {      if (FileHandle* f = OpenLocalFile(Config::DSiBIOS9Path, Read))      { -        std::array<u8, DSiBIOSSize> bios {}; -        FileRead(bios.data(), sizeof(bios), 1, f); +        std::unique_ptr<DSiBIOSImage> bios = std::make_unique<DSiBIOSImage>(); +        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<std::array<u8, DSiBIOSSize>> LoadDSiARM9BIOS() noexcept      }      Log(Warn, "ARM9i BIOS not found\n"); -    return std::nullopt; +    return nullptr;  } -std::optional<std::array<u8, DSiBIOSSize>> LoadDSiARM7BIOS() noexcept +std::unique_ptr<DSiBIOSImage> LoadDSiARM7BIOS() noexcept  {      if (FileHandle* f = OpenLocalFile(Config::DSiBIOS7Path, Read))      { -        std::array<u8, DSiBIOSSize> bios {}; -        FileRead(bios.data(), sizeof(bios), 1, f); +        std::unique_ptr<DSiBIOSImage> bios = std::make_unique<DSiBIOSImage>(); +        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<std::array<u8, DSiBIOSSize>> 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 <QMainWindow>  #include "MemConstants.h" + +#include <Args.h>  #include <optional>  #include <string>  #include <memory> @@ -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<std::array<u8, ARM9BIOSSize>> LoadARM9BIOS() noexcept; -std::optional<std::array<u8, ARM7BIOSSize>> LoadARM7BIOS() noexcept; -std::optional<std::array<u8, DSiBIOSSize>> LoadDSiARM9BIOS() noexcept; -std::optional<std::array<u8, DSiBIOSSize>> LoadDSiARM7BIOS() noexcept; +/// or nullptr if loading failed. +std::unique_ptr<ARM9BIOSImage> LoadARM9BIOS() noexcept; +std::unique_ptr<ARM7BIOSImage> LoadARM7BIOS() noexcept; +std::unique_ptr<DSiBIOSImage> LoadDSiARM9BIOS() noexcept; +std::unique_ptr<DSiBIOSImage> LoadDSiARM7BIOS() noexcept;  std::optional<FATStorageArgs> GetDSiSDCardArgs() noexcept;  std::optional<FATStorage> LoadDSiSDCard() noexcept;  std::optional<FATStorageArgs> GetDLDISDCardArgs() noexcept;  |