From 358050cfc6cb88b5bfd3997f1e3f1e135ae808e6 Mon Sep 17 00:00:00 2001
From: N00byKing <N00byKing@users.noreply.github.com>
Date: Fri, 6 Apr 2018 17:06:32 +0200
Subject: [PATCH] core, main.h: Abort on 32Bit ROMs (#309)

* core, main.h: Abort on 32Bit ROMs

* main.cpp: Fix Grammar
---
 src/core/core.cpp                               | 4 ++++
 src/core/core.h                                 | 1 +
 src/core/loader/deconstructed_rom_directory.cpp | 5 +++++
 src/core/loader/loader.h                        | 1 +
 src/yuzu/main.cpp                               | 7 ++++++-
 5 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/core/core.cpp b/src/core/core.cpp
index 11654d4da..9f5507a65 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 ade456cfc..f497dc022 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 8b4ee970f..8696c28bd 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 dd44ee9a6..b1aabb1cb 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 793d9d739..936a2759b 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!"),