diff --git a/src/core/core.cpp b/src/core/core.cpp index 11654d4da7..9f5507a654 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -92,6 +92,8 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file return ResultStatus::ErrorLoader_ErrorEncrypted; case Loader::ResultStatus::ErrorInvalidFormat: return ResultStatus::ErrorLoader_ErrorInvalidFormat; + case Loader::ResultStatus::ErrorUnsupportedArch: + return ResultStatus::ErrorUnsupportedArch; default: return ResultStatus::ErrorSystemMode; } @@ -115,6 +117,8 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file return ResultStatus::ErrorLoader_ErrorEncrypted; case Loader::ResultStatus::ErrorInvalidFormat: return ResultStatus::ErrorLoader_ErrorInvalidFormat; + case Loader::ResultStatus::ErrorUnsupportedArch: + return ResultStatus::ErrorUnsupportedArch; default: return ResultStatus::ErrorLoader; } diff --git a/src/core/core.h b/src/core/core.h index ade456cfc9..f497dc022b 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -44,6 +44,7 @@ public: ErrorSystemFiles, ///< Error in finding system files ErrorSharedFont, ///< Error in finding shared font ErrorVideoCore, ///< Error in the video core + ErrorUnsupportedArch, ///< Unsupported Architecture (32-Bit ROMs) ErrorUnknown ///< Any other error }; diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 8b4ee970fd..8696c28bd2 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -119,6 +119,11 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load( } metadata.Print(); + const FileSys::ProgramAddressSpaceType arch_bits{metadata.GetAddressSpaceType()}; + if (arch_bits == FileSys::ProgramAddressSpaceType::Is32Bit) { + return ResultStatus::ErrorUnsupportedArch; + } + // Load NSO modules VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index dd44ee9a6d..b1aabb1cb4 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -72,6 +72,7 @@ enum class ResultStatus { ErrorAlreadyLoaded, ErrorMemoryAllocationFailed, ErrorEncrypted, + ErrorUnsupportedArch, }; /// Interface for loading an application diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 793d9d7399..936a2759bc 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -357,7 +357,12 @@ bool GMainWindow::LoadROM(const QString& filename) { QMessageBox::critical(this, tr("Error while loading ROM!"), tr("The ROM format is not supported.")); break; - + case Core::System::ResultStatus::ErrorUnsupportedArch: + LOG_CRITICAL(Frontend, "Unsupported architecture detected!", + filename.toStdString().c_str()); + QMessageBox::critical(this, tr("Error while loading ROM!"), + tr("The ROM uses currently unusable 32-bit architecture")); + break; case Core::System::ResultStatus::ErrorSystemMode: LOG_CRITICAL(Frontend, "Failed to load ROM!"); QMessageBox::critical(this, tr("Error while loading ROM!"),