mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	am: use applet program loading for tested versions
This commit is contained in:
		
							parent
							
								
									b206ea5cfe
								
							
						
					
					
						commit
						4677fd3f64
					
				| @ -172,6 +172,10 @@ u32 NCA::GetSDKVersion() const { | ||||
|     return reader->GetSdkAddonVersion(); | ||||
| } | ||||
| 
 | ||||
| u8 NCA::GetKeyGeneration() const { | ||||
|     return reader->GetKeyGeneration(); | ||||
| } | ||||
| 
 | ||||
| bool NCA::IsUpdate() const { | ||||
|     return is_update; | ||||
| } | ||||
|  | ||||
| @ -77,6 +77,7 @@ public: | ||||
|     u64 GetTitleId() const; | ||||
|     RightsId GetRightsId() const; | ||||
|     u32 GetSDKVersion() const; | ||||
|     u8 GetKeyGeneration() const; | ||||
|     bool IsUpdate() const; | ||||
| 
 | ||||
|     VirtualFile GetRomFS() const; | ||||
|  | ||||
| @ -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 {}; | ||||
|     } | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user