Made some changes from review comments:
- Made LoadKernelSystemMode return a pair consisting of a system mode and a result code (Could use review). - Deleted ErrorOpenGL error code in favor of just having ErrorVideoCore. - Made dialog messages more clear. - Compared archive ID in fs_user.cpp to ArchiveIdCode::NCCH as opposed to hex magic. - Cleaned up some other stuff.
This commit is contained in:
		
							parent
							
								
									1ecb322daa
								
							
						
					
					
						commit
						37bec598ea
					
				@ -40,7 +40,6 @@ void EmuThread::run() {
 | 
				
			|||||||
            Core::System::ResultStatus result = Core::System::GetInstance().RunLoop();
 | 
					            Core::System::ResultStatus result = Core::System::GetInstance().RunLoop();
 | 
				
			||||||
            if (result != Core::System::ResultStatus::Success) {
 | 
					            if (result != Core::System::ResultStatus::Success) {
 | 
				
			||||||
                emit ErrorThrown(result);
 | 
					                emit ErrorThrown(result);
 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            was_active = running || exec_step;
 | 
					            was_active = running || exec_step;
 | 
				
			||||||
 | 
				
			|||||||
@ -300,7 +300,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
 | 
				
			|||||||
    render_window->MakeCurrent();
 | 
					    render_window->MakeCurrent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!gladLoadGL()) {
 | 
					    if (!gladLoadGL()) {
 | 
				
			||||||
        QMessageBox::critical(this, tr("Error while starting Citra!"),
 | 
					        QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"),
 | 
				
			||||||
                              tr("Your GPU may not support OpenGL 3.3, or you do not"
 | 
					                              tr("Your GPU may not support OpenGL 3.3, or you do not"
 | 
				
			||||||
                                 "have the latest graphics driver."));
 | 
					                                 "have the latest graphics driver."));
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
@ -329,7 +329,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
 | 
				
			|||||||
            QMessageBox::critical(
 | 
					            QMessageBox::critical(
 | 
				
			||||||
                this, tr("Error while loading ROM!"),
 | 
					                this, tr("Error while loading ROM!"),
 | 
				
			||||||
                tr("The game that you are trying to load must be decrypted before being used with "
 | 
					                tr("The game that you are trying to load must be decrypted before being used with "
 | 
				
			||||||
                   "Citra.<br/><br/>"
 | 
					                   "Citra. A real 3DS is required.<br/><br/>"
 | 
				
			||||||
                   "For more information on dumping and decrypting games, please see the following "
 | 
					                   "For more information on dumping and decrypting games, please see the following "
 | 
				
			||||||
                   "wiki pages: <ul>"
 | 
					                   "wiki pages: <ul>"
 | 
				
			||||||
                   "<li><a href='https://citra-emu.org/wiki/Dumping-Game-Cartridges/'>Dumping Game "
 | 
					                   "<li><a href='https://citra-emu.org/wiki/Dumping-Game-Cartridges/'>Dumping Game "
 | 
				
			||||||
@ -344,10 +344,17 @@ bool GMainWindow::LoadROM(const QString& filename) {
 | 
				
			|||||||
                                  tr("The ROM format is not supported."));
 | 
					                                  tr("The ROM format is not supported."));
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case Core::System::ResultStatus::ErrorOpenGL:
 | 
					        case Core::System::ResultStatus::ErrorVideoCore:
 | 
				
			||||||
            QMessageBox::critical(this, tr("Error while loading OpenGL!"),
 | 
					            QMessageBox::critical(
 | 
				
			||||||
                                  tr("Your GPU may not support OpenGL 3.3, or you do not "
 | 
					                this, tr("An error occured in the video core."),
 | 
				
			||||||
                                     "have the latest graphics driver."));
 | 
					                tr("Citra has encountered an error while running the video core,  please see the "
 | 
				
			||||||
 | 
					                   "log for more details."
 | 
				
			||||||
 | 
					                   "For more information on accessing the log, please see the following page: "
 | 
				
			||||||
 | 
					                   "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How "
 | 
				
			||||||
 | 
					                   "to "
 | 
				
			||||||
 | 
					                   "Upload the Log File</a>."
 | 
				
			||||||
 | 
					                   "Ensure that you have the latest graphics drivers for your GPU."));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
@ -632,9 +639,6 @@ void GMainWindow::UpdateStatusBar() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GMainWindow::OnCoreError(Core::System::ResultStatus result) {
 | 
					void GMainWindow::OnCoreError(Core::System::ResultStatus result) {
 | 
				
			||||||
    // Waiting for the dialog to be closed before shutting down causes a segfault, maybe because of
 | 
					 | 
				
			||||||
    // the profiler
 | 
					 | 
				
			||||||
    ShutdownGame();
 | 
					 | 
				
			||||||
    switch (result) {
 | 
					    switch (result) {
 | 
				
			||||||
    case Core::System::ResultStatus::ErrorSystemFiles:
 | 
					    case Core::System::ResultStatus::ErrorSystemFiles:
 | 
				
			||||||
        QMessageBox::critical(
 | 
					        QMessageBox::critical(
 | 
				
			||||||
@ -664,13 +668,13 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result) {
 | 
				
			|||||||
            ".");
 | 
					            ".");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case Core::System::ResultStatus::ErrorUnknown:
 | 
					    default:
 | 
				
			||||||
        QMessageBox::critical(
 | 
					        QMessageBox::critical(
 | 
				
			||||||
            this, "Fatal Error",
 | 
					            this, "Fatal Error",
 | 
				
			||||||
            "Citra has encountered a fatal error, please see the log for more details.");
 | 
					            "Citra has encountered a fatal error, please see the log for more details. "
 | 
				
			||||||
        break;
 | 
					            "For more information on accessing the log, please see the following page: "
 | 
				
			||||||
 | 
					            "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How to "
 | 
				
			||||||
    default:
 | 
					            "Upload the Log File</a>.");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -679,9 +683,10 @@ bool GMainWindow::ConfirmClose() {
 | 
				
			|||||||
    if (emu_thread == nullptr || !UISettings::values.confirm_before_closing)
 | 
					    if (emu_thread == nullptr || !UISettings::values.confirm_before_closing)
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"),
 | 
					    auto answer =
 | 
				
			||||||
                                 QMessageBox::Yes | QMessageBox::No,
 | 
					        QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"),
 | 
				
			||||||
                                 QMessageBox::No) != QMessageBox::No;
 | 
					                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
 | 
				
			||||||
 | 
					    return answer != QMessageBox::No;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void GMainWindow::closeEvent(QCloseEvent* event) {
 | 
					void GMainWindow::closeEvent(QCloseEvent* event) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,9 @@
 | 
				
			|||||||
// Refer to the license.txt file included.
 | 
					// Refer to the license.txt file included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					#include <utility>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <boost/optional.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "audio_core/audio_core.h"
 | 
					#include "audio_core/audio_core.h"
 | 
				
			||||||
#include "common/logging/log.h"
 | 
					#include "common/logging/log.h"
 | 
				
			||||||
@ -26,6 +29,7 @@ namespace Core {
 | 
				
			|||||||
/*static*/ System System::s_instance;
 | 
					/*static*/ System System::s_instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
System::ResultStatus System::RunLoop(int tight_loop) {
 | 
					System::ResultStatus System::RunLoop(int tight_loop) {
 | 
				
			||||||
 | 
					    this->status = ResultStatus::Success;
 | 
				
			||||||
    if (!cpu_core) {
 | 
					    if (!cpu_core) {
 | 
				
			||||||
        return ResultStatus::ErrorNotInitialized;
 | 
					        return ResultStatus::ErrorNotInitialized;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -73,14 +77,14 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
 | 
				
			|||||||
        LOG_CRITICAL(Core, "Failed to obtain loader for %s!", filepath.c_str());
 | 
					        LOG_CRITICAL(Core, "Failed to obtain loader for %s!", filepath.c_str());
 | 
				
			||||||
        return ResultStatus::ErrorGetLoader;
 | 
					        return ResultStatus::ErrorGetLoader;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    boost::optional<u32> system_mode = boost::none;
 | 
					    std::pair<boost::optional<u32>, Loader::ResultStatus> system_mode =
 | 
				
			||||||
 | 
					        app_loader->LoadKernelSystemMode();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Loader::ResultStatus load_result{app_loader->LoadKernelSystemMode(system_mode)};
 | 
					    if (system_mode.second != Loader::ResultStatus::Success) {
 | 
				
			||||||
    if (!system_mode) {
 | 
					        LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", system_mode.second);
 | 
				
			||||||
        LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", load_result);
 | 
					 | 
				
			||||||
        System::Shutdown();
 | 
					        System::Shutdown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        switch (load_result) {
 | 
					        switch (system_mode.second) {
 | 
				
			||||||
        case Loader::ResultStatus::ErrorEncrypted:
 | 
					        case Loader::ResultStatus::ErrorEncrypted:
 | 
				
			||||||
            return ResultStatus::ErrorLoader_ErrorEncrypted;
 | 
					            return ResultStatus::ErrorLoader_ErrorEncrypted;
 | 
				
			||||||
        case Loader::ResultStatus::ErrorInvalidFormat:
 | 
					        case Loader::ResultStatus::ErrorInvalidFormat:
 | 
				
			||||||
@ -90,15 +94,15 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ResultStatus init_result{Init(emu_window, system_mode.get())};
 | 
					    ResultStatus init_result{Init(emu_window, system_mode.first.get())};
 | 
				
			||||||
    if (init_result != ResultStatus::Success) {
 | 
					    if (init_result != ResultStatus::Success) {
 | 
				
			||||||
        LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result);
 | 
					        LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result);
 | 
				
			||||||
        System::Shutdown();
 | 
					        System::Shutdown();
 | 
				
			||||||
        return init_result;
 | 
					        return init_result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    load_result = app_loader->Load();
 | 
					    Loader::ResultStatus load_result = app_loader->Load();
 | 
				
			||||||
    if (Loader::ResultStatus::Success != load_result) {
 | 
					    if (load_result != Loader::ResultStatus::Success) {
 | 
				
			||||||
        LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
 | 
					        LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
 | 
				
			||||||
        System::Shutdown();
 | 
					        System::Shutdown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -154,7 +158,7 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
 | 
				
			|||||||
    GDBStub::Init();
 | 
					    GDBStub::Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!VideoCore::Init(emu_window)) {
 | 
					    if (!VideoCore::Init(emu_window)) {
 | 
				
			||||||
        return ResultStatus::ErrorOpenGL;
 | 
					        return ResultStatus::ErrorVideoCore;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LOG_DEBUG(Core, "Initialized OK");
 | 
					    LOG_DEBUG(Core, "Initialized OK");
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,6 @@ public:
 | 
				
			|||||||
        ErrorSystemFiles,               ///< Error in finding system files
 | 
					        ErrorSystemFiles,               ///< Error in finding system files
 | 
				
			||||||
        ErrorSharedFont,                ///< Error in finding shared font
 | 
					        ErrorSharedFont,                ///< Error in finding shared font
 | 
				
			||||||
        ErrorVideoCore,                 ///< Error in the video core
 | 
					        ErrorVideoCore,                 ///< Error in the video core
 | 
				
			||||||
        ErrorOpenGL,                    ///< Error when initializing OpenGL
 | 
					 | 
				
			||||||
        ErrorUnknown                    ///< Any other error
 | 
					        ErrorUnknown                    ///< Any other error
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
 | 
				
			|||||||
    auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
 | 
					    auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!file->IsOpen()) {
 | 
					    if (!file->IsOpen()) {
 | 
				
			||||||
        return ResultCode(-1); // TODO(Subv): Find the right error code
 | 
					        return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
 | 
				
			||||||
 | 
					                          ErrorLevel::Status);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    auto size = file->GetSize();
 | 
					    auto size = file->GetSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -257,11 +257,9 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi
 | 
				
			|||||||
    LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code);
 | 
					    LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    auto itr = id_code_map.find(id_code);
 | 
					    auto itr = id_code_map.find(id_code);
 | 
				
			||||||
    if (itr == id_code_map.end()) {
 | 
					    if (itr == id_code_map.end())
 | 
				
			||||||
        // TODO: Verify error against hardware
 | 
					        return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
 | 
				
			||||||
        return ResultCode(ErrorDescription::NotFound, ErrorModule::FS, ErrorSummary::NotFound,
 | 
					                          ErrorLevel::Status);
 | 
				
			||||||
                          ErrorLevel::Permanent);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
 | 
					    CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -133,12 +133,11 @@ static void OpenFileDirectly(Service::Interface* self) {
 | 
				
			|||||||
        LOG_ERROR(Service_FS,
 | 
					        LOG_ERROR(Service_FS,
 | 
				
			||||||
                  "failed to get a handle for archive archive_id=0x%08X archive_path=%s",
 | 
					                  "failed to get a handle for archive archive_id=0x%08X archive_path=%s",
 | 
				
			||||||
                  static_cast<u32>(archive_id), archive_path.DebugStr().c_str());
 | 
					                  static_cast<u32>(archive_id), archive_path.DebugStr().c_str());
 | 
				
			||||||
        if (static_cast<u32>(archive_id) == 0x2345678A) {
 | 
					 | 
				
			||||||
            Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles);
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        cmd_buff[1] = archive_handle.Code().raw;
 | 
					        cmd_buff[1] = archive_handle.Code().raw;
 | 
				
			||||||
        cmd_buff[3] = 0;
 | 
					        cmd_buff[3] = 0;
 | 
				
			||||||
 | 
					        if (static_cast<FS::ArchiveIdCode>(archive_id) == ArchiveIdCode::NCCH) {
 | 
				
			||||||
 | 
					            Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SCOPE_EXIT({ CloseArchive(*archive_handle); });
 | 
					    SCOPE_EXIT({ CloseArchive(*archive_handle); });
 | 
				
			||||||
 | 
				
			|||||||
@ -8,8 +8,11 @@
 | 
				
			|||||||
#include <initializer_list>
 | 
					#include <initializer_list>
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <utility>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <boost/optional.hpp>
 | 
					#include <boost/optional.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
#include "common/file_util.h"
 | 
					#include "common/file_util.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -100,13 +103,11 @@ public:
 | 
				
			|||||||
     * Loads the system mode that this application needs.
 | 
					     * Loads the system mode that this application needs.
 | 
				
			||||||
     * This function defaults to 2 (96MB allocated to the application) if it can't read the
 | 
					     * This function defaults to 2 (96MB allocated to the application) if it can't read the
 | 
				
			||||||
     * information.
 | 
					     * information.
 | 
				
			||||||
     * @param boost::optional<u32> Reference to Boost optional to store system mode.
 | 
					     * @return A pair with the system mode (If found) and the result.
 | 
				
			||||||
     * @ return Result of operation.
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    virtual ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) {
 | 
					    virtual std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() {
 | 
				
			||||||
        // 96MB allocated to the application.
 | 
					        // 96MB allocated to the application.
 | 
				
			||||||
        system_mode = 2;
 | 
					        return std::make_pair(2, ResultStatus::Success);
 | 
				
			||||||
        return ResultStatus::Success;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -121,19 +121,16 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
 | 
				
			|||||||
    return FileType::Error;
 | 
					    return FileType::Error;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultStatus AppLoader_NCCH::LoadKernelSystemMode(boost::optional<u32>& system_mode) {
 | 
					std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() {
 | 
				
			||||||
    if (!is_loaded) {
 | 
					    if (!is_loaded) {
 | 
				
			||||||
        ResultStatus res = LoadExeFS();
 | 
					        ResultStatus res = LoadExeFS();
 | 
				
			||||||
        if (res != ResultStatus::Success) {
 | 
					        if (res != ResultStatus::Success) {
 | 
				
			||||||
            // Set the system mode as invalid.
 | 
					            return std::make_pair(boost::none, res);
 | 
				
			||||||
            system_mode = boost::none;
 | 
					 | 
				
			||||||
            // Return the error code.
 | 
					 | 
				
			||||||
            return res;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Set the system mode as the one from the exheader.
 | 
					    // Set the system mode as the one from the exheader.
 | 
				
			||||||
    system_mode = exheader_header.arm11_system_local_caps.system_mode.Value();
 | 
					    return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(),
 | 
				
			||||||
    return ResultStatus::Success;
 | 
					                          ResultStatus::Success);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ResultStatus AppLoader_NCCH::LoadExec() {
 | 
					ResultStatus AppLoader_NCCH::LoadExec() {
 | 
				
			||||||
 | 
				
			|||||||
@ -179,10 +179,9 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Loads the Exheader and returns the system mode for this application.
 | 
					     * Loads the Exheader and returns the system mode for this application.
 | 
				
			||||||
     * @param boost::optional<u32> Reference to Boost optional to store system mode.
 | 
					     * @return A pair with the system mode (If found) and the result.
 | 
				
			||||||
     * @return Result of operation.
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) override;
 | 
					    std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ResultStatus ReadCode(std::vector<u8>& buffer) override;
 | 
					    ResultStatus ReadCode(std::vector<u8>& buffer) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user