aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/qt_sdl
diff options
context:
space:
mode:
authorJesse Talavera <jesse@jesse.tg>2024-03-13 09:55:20 -0400
committerGitHub <noreply@github.com>2024-03-13 14:55:20 +0100
commit31a7f53282040c7df93204d647de470390b96c4b (patch)
tree0c8fcb6ab0b7c70e90e462169e209a805c25027a /src/frontend/qt_sdl
parentea1755bed0378a2f3783e78c5e63c266583218ce (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
Diffstat (limited to 'src/frontend/qt_sdl')
-rw-r--r--src/frontend/qt_sdl/EmuThread.cpp8
-rw-r--r--src/frontend/qt_sdl/ROMManager.cpp40
-rw-r--r--src/frontend/qt_sdl/ROMManager.h12
3 files changed, 31 insertions, 29 deletions
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;