diff options
author | Liam <byteslice@airmail.cc> | 2024-02-09 17:36:40 +0100 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2024-02-10 18:38:19 +0100 |
commit | 4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd (patch) | |
tree | 3a748b507a6af9cfc2dfb63ca0cd6a1662472661 /src/core/hle/service/am | |
parent | am: fix focus states and display of indirect keyboard (diff) | |
download | yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar.gz yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar.bz2 yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar.lz yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar.xz yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.tar.zst yuzu-4677fd3f64dd51c7419e0268df9fe10f8f6ce0fd.zip |
Diffstat (limited to 'src/core/hle/service/am')
-rw-r--r-- | src/core/hle/service/am/library_applet_creator.cpp | 10 | ||||
-rw-r--r-- | src/core/hle/service/am/process.cpp | 23 | ||||
-rw-r--r-- | src/core/hle/service/am/process.h | 2 |
3 files changed, 28 insertions, 7 deletions
diff --git a/src/core/hle/service/am/library_applet_creator.cpp b/src/core/hle/service/am/library_applet_creator.cpp index c48ed29bc..00d5a0705 100644 --- a/src/core/hle/service/am/library_applet_creator.cpp +++ b/src/core/hle/service/am/library_applet_creator.cpp @@ -102,8 +102,16 @@ std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system, return {}; } + // TODO: enable other versions of applets + enum : u8 { + Firmware1400 = 14, + Firmware1500 = 15, + Firmware1600 = 16, + Firmware1700 = 17, + }; + auto process = std::make_unique<Process>(system); - if (!process->Initialize(program_id)) { + if (!process->Initialize(program_id, Firmware1400, Firmware1700)) { // Couldn't initialize the guest process return {}; } diff --git a/src/core/hle/service/am/process.cpp b/src/core/hle/service/am/process.cpp index 16b685f86..992c50713 100644 --- a/src/core/hle/service/am/process.cpp +++ b/src/core/hle/service/am/process.cpp @@ -3,6 +3,7 @@ #include "common/scope_exit.h" +#include "core/file_sys/content_archive.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/registered_cache.h" #include "core/hle/kernel/k_process.h" @@ -20,7 +21,7 @@ Process::~Process() { this->Finalize(); } -bool Process::Initialize(u64 program_id) { +bool Process::Initialize(u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation) { // First, ensure we are not holding another process. this->Finalize(); @@ -29,21 +30,33 @@ bool Process::Initialize(u64 program_id) { // Attempt to load program NCA. const FileSys::RegisteredCache* bis_system{}; - FileSys::VirtualFile nca{}; + FileSys::VirtualFile nca_raw{}; // Get the program NCA from built-in storage. bis_system = fsc.GetSystemNANDContents(); if (bis_system) { - nca = bis_system->GetEntryRaw(program_id, FileSys::ContentRecordType::Program); + nca_raw = bis_system->GetEntryRaw(program_id, FileSys::ContentRecordType::Program); } // Ensure we retrieved a program NCA. - if (!nca) { + if (!nca_raw) { return false; } + // Ensure we have a suitable version. + if (minimum_key_generation > 0) { + FileSys::NCA nca(nca_raw); + if (nca.GetStatus() == Loader::ResultStatus::Success && + (nca.GetKeyGeneration() < minimum_key_generation || + nca.GetKeyGeneration() > maximum_key_generation)) { + LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id, + nca.GetKeyGeneration()); + return false; + } + } + // Get the appropriate loader to parse this NCA. - auto app_loader = Loader::GetLoader(m_system, nca, program_id, 0); + auto app_loader = Loader::GetLoader(m_system, nca_raw, program_id, 0); // Ensure we have a loader which can parse the NCA. if (!app_loader) { diff --git a/src/core/hle/service/am/process.h b/src/core/hle/service/am/process.h index 4b908ade4..4b8102fb6 100644 --- a/src/core/hle/service/am/process.h +++ b/src/core/hle/service/am/process.h @@ -21,7 +21,7 @@ public: explicit Process(Core::System& system); ~Process(); - bool Initialize(u64 program_id); + bool Initialize(u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation); void Finalize(); bool Run(); |