diff --git a/stratosphere/loader/source/ldr_process_creation.cpp b/stratosphere/loader/source/ldr_process_creation.cpp index a353b645d..ddac6e006 100644 --- a/stratosphere/loader/source/ldr_process_creation.cpp +++ b/stratosphere/loader/source/ldr_process_creation.cpp @@ -174,7 +174,13 @@ Result ProcessCreation::CreateProcess(Handle *out_process_h, u64 index, char *nc /* Update the list of registered processes with the new process. */ svcGetProcessId(&process_id, process_h); - Registration::set_process_id_and_tid_min(index, process_id, npdm_info.aci0->title_id); + bool is_64_bit; + if (kernelAbove200()) { + is_64_bit = (((npdm_info.header->mmu_flags >> 1) & 5) | 2) == 3; + } else { + is_64_bit = (npdm_info.header->mmu_flags & 0xE) == 0x2; + } + Registration::set_process_id_tid_min_and_is_64_bit(index, process_id, npdm_info.aci0->title_id, is_64_bit); for (unsigned int i = 0; i < NSO_NUM_MAX; i++) { if (NsoUtils::IsNsoPresent(i)) { Registration::add_nso_info(index, nso_extents.nso_addresses[i], nso_extents.nso_sizes[i], NsoUtils::GetNsoBuildId(i)); diff --git a/stratosphere/loader/source/ldr_registration.cpp b/stratosphere/loader/source/ldr_registration.cpp index 509b85f85..706a752e2 100644 --- a/stratosphere/loader/source/ldr_registration.cpp +++ b/stratosphere/loader/source/ldr_registration.cpp @@ -75,7 +75,7 @@ Result Registration::get_registered_tid_sid(u64 index, Registration::TidSid *out return 0; } -void Registration::set_process_id_and_tid_min(u64 index, u64 process_id, u64 tid_min) { +void Registration::set_process_id_tid_min_and_is_64_bit(u64 index, u64 process_id, u64 tid_min, bool is_64_bit) { Registration::Process *target_process = get_process(index); if (target_process == NULL) { return; @@ -83,6 +83,7 @@ void Registration::set_process_id_and_tid_min(u64 index, u64 process_id, u64 tid target_process->process_id = process_id; target_process->title_id_min = tid_min; + target_process->is_64_bit = is_64_bit; } void Registration::add_nso_info(u64 index, u64 base_address, u64 size, const unsigned char *build_id) { diff --git a/stratosphere/loader/source/ldr_registration.hpp b/stratosphere/loader/source/ldr_registration.hpp index da95cde42..771c4bdb1 100644 --- a/stratosphere/loader/source/ldr_registration.hpp +++ b/stratosphere/loader/source/ldr_registration.hpp @@ -25,6 +25,7 @@ class Registration { struct Process { bool in_use; + bool is_64_bit; u64 index; u64 process_id; u64 title_id_min; @@ -44,7 +45,7 @@ class Registration { static Result get_registered_tid_sid(u64 index, Registration::TidSid *out); static bool register_tid_sid(const TidSid *tid_sid, u64 *out_index); static bool unregister_index(u64 index); - static void set_process_id_and_tid_min(u64 index, u64 process_id, u64 tid_min); + static void set_process_id_tid_min_and_is_64_bit(u64 index, u64 process_id, u64 tid_min, bool is_64_bit); static void add_nso_info(u64 index, u64 base_address, u64 size, const unsigned char *build_id); static Result get_nso_infos_for_process_id(NsoInfo *out, u32 max_out, u64 process_id, u32 *num_written); };