Loader: Support loading FsStorageId_None content from SD.

This commit is contained in:
Michael Scire 2018-07-27 19:53:20 -07:00
parent 5a63f4e304
commit b365065a2d
3 changed files with 25 additions and 13 deletions

View file

@ -44,6 +44,7 @@ Result ContentManagement::MountCode(u64 tid, FsStorageId sid) {
fsdevMountDevice("code", g_CodeFileSystem); fsdevMountDevice("code", g_CodeFileSystem);
fsldrExit();
return rc; return rc;
} }

View file

@ -102,9 +102,11 @@ Result ProcessCreation::CreateProcess(Handle *out_process_h, u64 index, char *nc
} }
/* Mount the title's exefs. */ /* Mount the title's exefs. */
rc = ContentManagement::MountCodeForTidSid(&target_process->tid_sid); if (target_process->tid_sid.storage_id != FsStorageId_None) {
if (R_FAILED(rc)) { rc = ContentManagement::MountCodeForTidSid(&target_process->tid_sid);
return rc; if (R_FAILED(rc)) {
return rc;
}
} }
/* Load the process's NPDM. */ /* Load the process's NPDM. */
@ -191,7 +193,7 @@ Result ProcessCreation::CreateProcess(Handle *out_process_h, u64 index, char *nc
rc = 0; rc = 0;
CREATE_PROCESS_END: CREATE_PROCESS_END:
if (R_SUCCEEDED(rc)) { if (R_SUCCEEDED(rc) && target_process->tid_sid.storage_id != FsStorageId_None) {
rc = ContentManagement::UnmountCode(); rc = ContentManagement::UnmountCode();
} else { } else {
ContentManagement::UnmountCode(); ContentManagement::UnmountCode();

View file

@ -42,11 +42,14 @@ std::tuple<Result, MovedHandle> ProcessManagerService::create_process(u64 flags,
return {rc, MovedHandle{process_h}}; return {rc, MovedHandle{process_h}};
} }
rc = ContentManagement::ResolveContentPathForTidSid(nca_path, &tid_sid); if (tid_sid.storage_id != FsStorageId_None) {
if (R_FAILED(rc)) { rc = ContentManagement::ResolveContentPathForTidSid(nca_path, &tid_sid);
return {rc, MovedHandle{process_h}}; if (R_FAILED(rc)) {
return {rc, MovedHandle{process_h}};
}
} }
launch_item = LaunchQueue::get_item(tid_sid.title_id); launch_item = LaunchQueue::get_item(tid_sid.title_id);
rc = ProcessCreation::CreateProcess(&process_h, index, nca_path, launch_item, flags, reslimit_h.handle); rc = ProcessCreation::CreateProcess(&process_h, index, nca_path, launch_item, flags, reslimit_h.handle);
@ -70,7 +73,7 @@ std::tuple<Result> ProcessManagerService::get_program_info(Registration::TidSid
return {rc}; return {rc};
} }
if (tid_sid.title_id != out_program_info.pointer->title_id) { if (tid_sid.storage_id != FsStorageId_None && tid_sid.title_id != out_program_info.pointer->title_id) {
rc = ContentManagement::ResolveContentPathForTidSid(nca_path, &tid_sid); rc = ContentManagement::ResolveContentPathForTidSid(nca_path, &tid_sid);
if (R_FAILED(rc)) { if (R_FAILED(rc)) {
return {rc}; return {rc};
@ -109,17 +112,23 @@ Result ProcessManagerService::populate_program_info_buffer(ProcessManagerService
NpdmUtils::NpdmInfo info; NpdmUtils::NpdmInfo info;
Result rc; Result rc;
rc = ContentManagement::MountCodeForTidSid(tid_sid); if (tid_sid->storage_id != FsStorageId_None) {
if (R_FAILED(rc)) { rc = ContentManagement::MountCodeForTidSid(tid_sid);
return rc; if (R_FAILED(rc)) {
return rc;
}
} }
rc = NpdmUtils::LoadNpdm(tid_sid->title_id, &info); rc = NpdmUtils::LoadNpdm(tid_sid->title_id, &info);
if (tid_sid->storage_id != FsStorageId_None) {
ContentManagement::UnmountCode();
}
if (R_FAILED(rc)) { if (R_FAILED(rc)) {
return rc; return rc;
} }
ContentManagement::UnmountCode();
out->main_thread_priority = info.header->main_thread_prio; out->main_thread_priority = info.header->main_thread_prio;
out->default_cpu_id = info.header->default_cpuid; out->default_cpu_id = info.header->default_cpuid;