kern/loader/svc: adopt updated names

This commit is contained in:
hexkyz committed 2026-09-17 21:42:22 +01:00
1 parent 9b4e4a2190
commit ab1e8a3e32
22 files changed
+239 -240

No files matched your search

@@ -205,7 +205,7 @@ namespace ams::kern::arch::arm64 {
} }
NOINLINE void InitializeForKernel(void *table, KVirtualAddress start, KVirtualAddress end); NOINLINE void InitializeForKernel(void *table, KVirtualAddress start, KVirtualAddress end);
NOINLINE Result InitializeForProcess(ams::svc::CreateProcessFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index); NOINLINE Result InitializeForProcess(ams::svc::CreateProcessParameterFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index);
void Finalize(); void Finalize();
static void NoteUpdatedCallback(const void *pt) { static void NoteUpdatedCallback(const void *pt) {
@@ -28,7 +28,7 @@ namespace ams::kern::arch::arm64 {
m_page_table.ActivateProcess(process_index, id); m_page_table.ActivateProcess(process_index, id);
} }
Result Initialize(ams::svc::CreateProcessFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index) { Result Initialize(ams::svc::CreateProcessParameterFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index) {
R_RETURN(m_page_table.InitializeForProcess(flags, from_back, pool, code_address, code_size, system_resource, resource_limit, process_index)); R_RETURN(m_page_table.InitializeForProcess(flags, from_back, pool, code_address, code_size, system_resource, resource_limit, process_index));
} }
@@ -37,8 +37,8 @@ namespace ams::kern {
size_t m_size; size_t m_size;
Type m_type; Type m_type;
public: public:
static uintptr_t GetAddressSpaceStart(ams::svc::CreateProcessFlag flags, Type type, size_t code_size); static uintptr_t GetAddressSpaceStart(ams::svc::CreateProcessParameterFlag flags, Type type, size_t code_size);
static size_t GetAddressSpaceSize(ams::svc::CreateProcessFlag flags, Type type); static size_t GetAddressSpaceSize(ams::svc::CreateProcessParameterFlag flags, Type type);
static void SetAddressSpaceSize(size_t width, Type type, size_t size); static void SetAddressSpaceSize(size_t width, Type type, size_t size);
@@ -151,14 +151,14 @@ namespace ams::kern {
static constexpr u32 DefaultMemoryIgnoreAttr = KMemoryAttribute_IpcLocked | KMemoryAttribute_DeviceShared; static constexpr u32 DefaultMemoryIgnoreAttr = KMemoryAttribute_IpcLocked | KMemoryAttribute_DeviceShared;
static constexpr size_t GetAddressSpaceWidth(ams::svc::CreateProcessFlag as_type) { static constexpr size_t GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag as_type) {
switch (static_cast<ams::svc::CreateProcessFlag>(as_type & ams::svc::CreateProcessFlag_AddressSpaceMask)) { switch (static_cast<ams::svc::CreateProcessParameterFlag>(as_type & ams::svc::CreateProcessParameterFlag_AddressSpaceMask)) {
case ams::svc::CreateProcessFlag_AddressSpace64Bit: case ams::svc::CreateProcessParameterFlag_AddressSpace64Bit39:
return 39; return 39;
case ams::svc::CreateProcessFlag_AddressSpace64BitDeprecated: case ams::svc::CreateProcessParameterFlag_AddressSpace64Bit36:
return 36; return 36;
case ams::svc::CreateProcessFlag_AddressSpace32Bit: case ams::svc::CreateProcessParameterFlag_AddressSpace32Bit:
case ams::svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: case ams::svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved:
return 32; return 32;
MESOSPHERE_UNREACHABLE_DEFAULT_CASE(); MESOSPHERE_UNREACHABLE_DEFAULT_CASE();
} }
@@ -229,7 +229,7 @@ namespace ams::kern {
explicit KPageTableBase() { /* ... */ } explicit KPageTableBase() { /* ... */ }
NOINLINE void InitializeForKernel(void *table, KVirtualAddress start, KVirtualAddress end); NOINLINE void InitializeForKernel(void *table, KVirtualAddress start, KVirtualAddress end);
NOINLINE Result InitializeForProcess(ams::svc::CreateProcessFlag flags, bool from_back, void *table, KProcessAddress start, KProcessAddress end, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit); NOINLINE Result InitializeForProcess(ams::svc::CreateProcessParameterFlag flags, bool from_back, void *table, KProcessAddress start, KProcessAddress end, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit);
void Finalize(); void Finalize();
@@ -165,9 +165,9 @@ namespace ams::kern {
constexpr bool CheckThreadPriority(s32 prio) const { return ((1ul << prio) & this->GetPriorityMask()) != 0; } constexpr bool CheckThreadPriority(s32 prio) const { return ((1ul << prio) & this->GetPriorityMask()) != 0; }
constexpr u32 GetCreateProcessFlags() const { return m_flags; } constexpr u32 GetCreateProcessParameterFlags() const { return m_flags; }
constexpr bool Is64Bit() const { return m_flags & ams::svc::CreateProcessFlag_Is64Bit; } constexpr bool Is64Bit() const { return m_flags & ams::svc::CreateProcessParameterFlag_64Bit; }
constexpr KProcessAddress GetEntryPoint() const { return m_code_address; } constexpr KProcessAddress GetEntryPoint() const { return m_code_address; }
@@ -128,7 +128,7 @@ namespace ams::kern::arch::arm64 {
KPageTableBase::InitializeForKernel(table, start, end); KPageTableBase::InitializeForKernel(table, start, end);
} }
Result KPageTable::InitializeForProcess(ams::svc::CreateProcessFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index) { Result KPageTable::InitializeForProcess(ams::svc::CreateProcessParameterFlag flags, bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit, size_t process_index) {
/* Determine our ASID */ /* Determine our ASID */
m_asid = process_index + 1; m_asid = process_index + 1;
MESOSPHERE_ABORT_UNLESS(0 < m_asid && m_asid < util::size(s_ttbr0_entries)); MESOSPHERE_ABORT_UNLESS(0 < m_asid && m_asid < util::size(s_ttbr0_entries));
@@ -46,20 +46,20 @@ namespace ams::kern {
32, 36, 32, 39, 42 32, 36, 32, 39, 42
}; };
constexpr size_t GetAddressSpaceWidth(ams::svc::CreateProcessFlag flags) { constexpr size_t GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag flags) {
/* Convert the input flags to an array index. */ /* Convert the input flags to an array index. */
const size_t idx = (flags & ams::svc::CreateProcessFlag_AddressSpaceMask) >> ams::svc::CreateProcessFlag_AddressSpaceShift; const size_t idx = (flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask) >> ams::svc::CreateProcessParameterFlag_AddressSpaceShift;
MESOSPHERE_ABORT_UNLESS(idx < sizeof(FlagsToAddressSpaceWidthTable)); MESOSPHERE_ABORT_UNLESS(idx < sizeof(FlagsToAddressSpaceWidthTable));
/* Return the width. */ /* Return the width. */
return FlagsToAddressSpaceWidthTable[idx]; return FlagsToAddressSpaceWidthTable[idx];
} }
static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessFlag_AddressSpace32Bit) == 32); static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag_AddressSpace32Bit) == 32);
static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessFlag_AddressSpace64BitDeprecated) == 36); static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag_AddressSpace64Bit36) == 36);
static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessFlag_AddressSpace32BitWithoutAlias) == 32); static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved) == 32);
static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessFlag_AddressSpace64Bit) == 39); static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag_AddressSpace64Bit39) == 39);
static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessFlag_AddressSpace64Bit64KPage) == 42); static_assert(GetAddressSpaceWidth(ams::svc::CreateProcessParameterFlag_AddressSpace64Bit42) == 42);
KAddressSpaceInfo &GetAddressSpaceInfo(size_t width, KAddressSpaceInfo::Type type) { KAddressSpaceInfo &GetAddressSpaceInfo(size_t width, KAddressSpaceInfo::Type type) {
for (auto &info : AddressSpaceInfos) { for (auto &info : AddressSpaceInfos) {
@@ -72,14 +72,14 @@ namespace ams::kern {
} }
uintptr_t KAddressSpaceInfo::GetAddressSpaceStart(ams::svc::CreateProcessFlag flags, KAddressSpaceInfo::Type type, size_t code_size) { uintptr_t KAddressSpaceInfo::GetAddressSpaceStart(ams::svc::CreateProcessParameterFlag flags, KAddressSpaceInfo::Type type, size_t code_size) {
MESOSPHERE_UNUSED(code_size); MESOSPHERE_UNUSED(code_size);
return GetAddressSpaceInfo(GetAddressSpaceWidth(flags), type).GetAddress(); return GetAddressSpaceInfo(GetAddressSpaceWidth(flags), type).GetAddress();
} }
size_t KAddressSpaceInfo::GetAddressSpaceSize(ams::svc::CreateProcessFlag flags, KAddressSpaceInfo::Type type) { size_t KAddressSpaceInfo::GetAddressSpaceSize(ams::svc::CreateProcessParameterFlag flags, KAddressSpaceInfo::Type type) {
/* Extract the address space from the create process flags. */ /* Extract the address space from the create process flags. */
const auto as_flags = (flags & ams::svc::CreateProcessFlag_AddressSpaceMask); const auto as_flags = (flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask);
/* Get the address space width. */ /* Get the address space width. */
const auto as_width = GetAddressSpaceWidth(flags); const auto as_width = GetAddressSpaceWidth(flags);
@@ -88,7 +88,7 @@ namespace ams::kern {
size_t as_size = GetAddressSpaceInfo(as_width, type).GetSize(); size_t as_size = GetAddressSpaceInfo(as_width, type).GetSize();
/* If we're getting size for 32-bit without alias, adjust the sizes accordingly. */ /* If we're getting size for 32-bit without alias, adjust the sizes accordingly. */
if (as_flags == ams::svc::CreateProcessFlag_AddressSpace32BitWithoutAlias) { if (as_flags == ams::svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved) {
switch (type) { switch (type) {
/* The heap space receives space that would otherwise go to the alias space. */ /* The heap space receives space that would otherwise go to the alias space. */
case KAddressSpaceInfo::Type_Heap: case KAddressSpaceInfo::Type_Heap:
@@ -884,7 +884,7 @@ namespace ams::kern {
{ {
out->info.create_process.program_id = process->GetProgramId(); out->info.create_process.program_id = process->GetProgramId();
out->info.create_process.process_id = process->GetId(); out->info.create_process.process_id = process->GetId();
out->info.create_process.flags = process->GetCreateProcessFlags(); out->info.create_process.flags = process->GetCreateProcessParameterFlags();
out->info.create_process.user_exception_context_address = GetInteger(process->GetProcessLocalRegionAddress()); out->info.create_process.user_exception_context_address = GetInteger(process->GetProcessLocalRegionAddress());
std::memcpy(out->info.create_process.name, process->GetName(), sizeof(out->info.create_process.name)); std::memcpy(out->info.create_process.name, process->GetName(), sizeof(out->info.create_process.name));
@@ -214,19 +214,19 @@ namespace ams::kern {
/* Apply other flags. */ /* Apply other flags. */
if (this->Is64Bit()) { if (this->Is64Bit()) {
out->flags |= ams::svc::CreateProcessFlag_Is64Bit; out->flags |= ams::svc::CreateProcessParameterFlag_64Bit;
} }
if (this->Is64BitAddressSpace()) { if (this->Is64BitAddressSpace()) {
out->flags |= (GetTargetFirmware() >= TargetFirmware_2_0_0) ? ams::svc::CreateProcessFlag_AddressSpace64Bit : ams::svc::CreateProcessFlag_AddressSpace64BitDeprecated; out->flags |= (GetTargetFirmware() >= TargetFirmware_2_0_0) ? ams::svc::CreateProcessParameterFlag_AddressSpace64Bit39 : ams::svc::CreateProcessParameterFlag_AddressSpace64Bit36;
} else { } else {
out->flags |= ams::svc::CreateProcessFlag_AddressSpace32Bit; out->flags |= ams::svc::CreateProcessParameterFlag_AddressSpace32Bit;
} }
if (enable_aslr) { if (enable_aslr) {
out->flags |= ams::svc::CreateProcessFlag_EnableAslr; out->flags |= ams::svc::CreateProcessParameterFlag_EnableAslr;
} }
/* All initial processes should disable device address space merge. */ /* All initial processes should disable device address space merge. */
out->flags |= ams::svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; out->flags |= ams::svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge;
/* Set and check code address. */ /* Set and check code address. */
/* NOTE: Even though Nintendo passes a size to GetAddressSpaceStart at other call sites, they pass */ /* NOTE: Even though Nintendo passes a size to GetAddressSpaceStart at other call sites, they pass */
@@ -234,8 +234,8 @@ namespace ams::kern {
/* almost certainly a bug. */ /* almost certainly a bug. */
using ASType = KAddressSpaceInfo::Type; using ASType = KAddressSpaceInfo::Type;
const ASType as_type = this->Is64BitAddressSpace() ? ((GetTargetFirmware() >= TargetFirmware_2_0_0) ? KAddressSpaceInfo::Type_MapHuge : KAddressSpaceInfo::Type_MapSmall) : KAddressSpaceInfo::Type_MapSmall; const ASType as_type = this->Is64BitAddressSpace() ? ((GetTargetFirmware() >= TargetFirmware_2_0_0) ? KAddressSpaceInfo::Type_MapHuge : KAddressSpaceInfo::Type_MapSmall) : KAddressSpaceInfo::Type_MapSmall;
const uintptr_t map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessFlag>(out->flags), as_type, out->code_num_pages); const uintptr_t map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessParameterFlag>(out->flags), as_type, out->code_num_pages);
const size_t map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(out->flags), as_type); const size_t map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(out->flags), as_type);
const uintptr_t map_end = map_start + map_size; const uintptr_t map_end = map_start + map_size;
out->code_address = map_start + start_address; out->code_address = map_start + start_address;
MESOSPHERE_ABORT_UNLESS((out->code_address / PageSize) + out->code_num_pages <= (map_end / PageSize)); MESOSPHERE_ABORT_UNLESS((out->code_address / PageSize) + out->code_num_pages <= (map_end / PageSize));
@@ -133,7 +133,7 @@ namespace ams::kern {
MESOSPHERE_R_ABORT_UNLESS(m_memory_block_manager.Initialize(m_address_space_start, m_address_space_end, m_memory_block_slab_manager)); MESOSPHERE_R_ABORT_UNLESS(m_memory_block_manager.Initialize(m_address_space_start, m_address_space_end, m_memory_block_slab_manager));
} }
Result KPageTableBase::InitializeForProcess(ams::svc::CreateProcessFlag flags, bool from_back, void *table, KProcessAddress start, KProcessAddress end, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit) { Result KPageTableBase::InitializeForProcess(ams::svc::CreateProcessParameterFlag flags, bool from_back, void *table, KProcessAddress start, KProcessAddress end, KMemoryManager::Pool pool, KProcessAddress code_address, size_t code_size, KSystemResource *system_resource, KResourceLimit *resource_limit) {
/* Validate the region. */ /* Validate the region. */
MESOSPHERE_ABORT_UNLESS(start <= code_address); MESOSPHERE_ABORT_UNLESS(start <= code_address);
MESOSPHERE_ABORT_UNLESS(code_address < code_address + code_size); MESOSPHERE_ABORT_UNLESS(code_address < code_address + code_size);
@@ -179,8 +179,8 @@ namespace ams::kern {
after_process_code_start = process_code_end; after_process_code_start = process_code_end;
after_process_code_size = m_code_region_end - process_code_end; after_process_code_size = m_code_region_end - process_code_end;
/* If we have a 39-bit address space and should, enable extra size to the alias region. */ /* If we have a 39-bit address space and should, enable extra size for the address sanitizer. */
if (flags & ams::svc::CreateProcessFlag_EnableAliasRegionExtraSize) { if (flags & ams::svc::CreateProcessParameterFlag_EnableAddressSanitizer) {
/* Extra size is 1/8th of the address space. */ /* Extra size is 1/8th of the address space. */
m_alias_region_extra_size = (static_cast<size_t>(1) << address_space_width) / 8; m_alias_region_extra_size = (static_cast<size_t>(1) << address_space_width) / 8;
@@ -212,8 +212,8 @@ namespace ams::kern {
m_region_ends[RegionType_ShadowStack] = Null<KProcessAddress>; m_region_ends[RegionType_ShadowStack] = Null<KProcessAddress>;
/* Set other basic fields. */ /* Set other basic fields. */
m_enable_aslr = (flags & ams::svc::CreateProcessFlag_EnableAslr) != 0; m_enable_aslr = (flags & ams::svc::CreateProcessParameterFlag_EnableAslr) != 0;
m_enable_device_address_space_merge = (flags & ams::svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge) == 0; m_enable_device_address_space_merge = (flags & ams::svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge) == 0;
m_allowed_exec_device_mapping = false; m_allowed_exec_device_mapping = false;
m_address_space_start = start; m_address_space_start = start;
m_address_space_end = end; m_address_space_end = end;
@@ -240,7 +240,7 @@ namespace ams::kern {
region_layouts[num_regions++] = { .size = alias_region_size, .type = RegionType_Alias, .alloc_index = 0, }; region_layouts[num_regions++] = { .size = alias_region_size, .type = RegionType_Alias, .alloc_index = 0, };
region_layouts[num_regions++] = { .size = heap_region_size, .type = RegionType_Heap, .alloc_index = 0, }; region_layouts[num_regions++] = { .size = heap_region_size, .type = RegionType_Heap, .alloc_index = 0, };
if (flags & ams::svc::CreateProcessFlag_EnableShadowStack) { if (flags & ams::svc::CreateProcessParameterFlag_EnableShadowStack) {
region_layouts[num_regions++] = { .size = ams::svc::AddressShadowStackRegionSize, .type = RegionType_ShadowStack, .alloc_index = 0, }; region_layouts[num_regions++] = { .size = ams::svc::AddressShadowStackRegionSize, .type = RegionType_ShadowStack, .alloc_index = 0, };
} }
@@ -210,7 +210,7 @@ namespace ams::kern {
m_program_id = params.program_id; m_program_id = params.program_id;
m_code_address = params.code_address; m_code_address = params.code_address;
m_code_size = params.code_num_pages * PageSize; m_code_size = params.code_num_pages * PageSize;
m_is_application = (params.flags & ams::svc::CreateProcessFlag_IsApplication); m_is_application = (params.flags & ams::svc::CreateProcessParameterFlag_IsApplication);
m_is_jit_debug = false; m_is_jit_debug = false;
#if defined(MESOSPHERE_ENABLE_PROCESS_CREATION_TIME) #if defined(MESOSPHERE_ENABLE_PROCESS_CREATION_TIME)
@@ -226,7 +226,7 @@ namespace ams::kern {
} }
/* Set max memory. */ /* Set max memory. */
m_max_process_memory = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(m_flags), KAddressSpaceInfo::Type_Heap); m_max_process_memory = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(m_flags), KAddressSpaceInfo::Type_Heap);
/* Generate random entropy. */ /* Generate random entropy. */
KSystemControl::GenerateRandom(m_entropy, util::size(m_entropy)); KSystemControl::GenerateRandom(m_entropy, util::size(m_entropy));
@@ -279,7 +279,7 @@ namespace ams::kern {
m_system_resource = secure_resource; m_system_resource = secure_resource;
} else { } else {
/* Use the system-wide system resource. */ /* Use the system-wide system resource. */
const bool is_app = (params.flags & ams::svc::CreateProcessFlag_IsApplication); const bool is_app = (params.flags & ams::svc::CreateProcessParameterFlag_IsApplication);
m_system_resource = std::addressof(is_app ? Kernel::GetApplicationSystemResource() : Kernel::GetSystemSystemResource()); m_system_resource = std::addressof(is_app ? Kernel::GetApplicationSystemResource() : Kernel::GetSystemSystemResource());
m_is_default_application_system_resource = is_app; m_is_default_application_system_resource = is_app;
@@ -293,8 +293,8 @@ namespace ams::kern {
/* Setup page table. */ /* Setup page table. */
{ {
const bool from_back = (params.flags & ams::svc::CreateProcessFlag_EnableAslr) == 0; const bool from_back = (params.flags & ams::svc::CreateProcessParameterFlag_EnableAslr) == 0;
R_TRY(m_page_table.Initialize(static_cast<ams::svc::CreateProcessFlag>(params.flags), from_back, pool, params.code_address, params.code_num_pages * PageSize, m_system_resource, res_limit, this->GetSlabIndex())); R_TRY(m_page_table.Initialize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), from_back, pool, params.code_address, params.code_num_pages * PageSize, m_system_resource, res_limit, this->GetSlabIndex()));
} }
ON_RESULT_FAILURE_2 { m_page_table.Finalize(); }; ON_RESULT_FAILURE_2 { m_page_table.Finalize(); };
@@ -358,7 +358,7 @@ namespace ams::kern {
} else { } else {
/* Use the system-wide system resource. */ /* Use the system-wide system resource. */
const bool is_app = (params.flags & ams::svc::CreateProcessFlag_IsApplication); const bool is_app = (params.flags & ams::svc::CreateProcessParameterFlag_IsApplication);
m_system_resource = std::addressof(is_app ? Kernel::GetApplicationSystemResource() : Kernel::GetSystemSystemResource()); m_system_resource = std::addressof(is_app ? Kernel::GetApplicationSystemResource() : Kernel::GetSystemSystemResource());
m_is_default_application_system_resource = is_app; m_is_default_application_system_resource = is_app;
@@ -372,8 +372,8 @@ namespace ams::kern {
/* Setup page table. */ /* Setup page table. */
{ {
const bool from_back = (params.flags & ams::svc::CreateProcessFlag_EnableAslr) == 0; const bool from_back = (params.flags & ams::svc::CreateProcessParameterFlag_EnableAslr) == 0;
R_TRY(m_page_table.Initialize(static_cast<ams::svc::CreateProcessFlag>(params.flags), from_back, pool, params.code_address, code_size, m_system_resource, res_limit, this->GetSlabIndex())); R_TRY(m_page_table.Initialize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), from_back, pool, params.code_address, code_size, m_system_resource, res_limit, this->GetSlabIndex()));
} }
ON_RESULT_FAILURE_2 { m_page_table.Finalize(); }; ON_RESULT_FAILURE_2 { m_page_table.Finalize(); };
@@ -392,7 +392,7 @@ namespace ams::kern {
MESOSPHERE_ABORT_UNLESS(m_process_id <= ProcessIdMax); MESOSPHERE_ABORT_UNLESS(m_process_id <= ProcessIdMax);
/* If we should optimize memory allocations, do so. */ /* If we should optimize memory allocations, do so. */
if (m_system_resource->IsSecureResource() && (params.flags & ams::svc::CreateProcessFlag_OptimizeMemoryAllocation) != 0) { if (m_system_resource->IsSecureResource() && (params.flags & ams::svc::CreateProcessParameterFlag_OptimizeMemoryAllocation) != 0) {
R_TRY(Kernel::GetMemoryManager().InitializeOptimizedMemory(m_process_id, pool)); R_TRY(Kernel::GetMemoryManager().InitializeOptimizedMemory(m_process_id, pool));
} }
@@ -1192,7 +1192,7 @@ namespace ams::kern {
MESOSPHERE_ASSERT(this == GetCurrentProcessPointer()); MESOSPHERE_ASSERT(this == GetCurrentProcessPointer());
/* If we aren't allowed to enter jit debug, don't. */ /* If we aren't allowed to enter jit debug, don't. */
if ((m_flags & ams::svc::CreateProcessFlag_EnableDebug) == 0) { if ((m_flags & ams::svc::CreateProcessParameterFlag_EnableJitDebug) == 0) {
return false; return false;
} }
@@ -86,15 +86,15 @@ namespace ams::kern::svc {
R_RETURN(KProcess::GetProcessList(out_num_processes, out_process_ids, max_out_count)); R_RETURN(KProcess::GetProcessList(out_num_processes, out_process_ids, max_out_count));
} }
constexpr size_t GetProcessSlotT0Sz(ams::svc::CreateProcessFlag flags) { constexpr size_t GetProcessSlotT0Sz(ams::svc::CreateProcessParameterFlag flags) {
if ((flags & ams::svc::CreateProcessFlag_AddressSpaceMask) == ams::svc::CreateProcessFlag_AddressSpace64Bit64KPage) { if ((flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask) == ams::svc::CreateProcessParameterFlag_AddressSpace64Bit42) {
return (64 - 42); return (64 - 42);
} else { } else {
return (64 - 39); return (64 - 39);
} }
} }
KProcess *CreateProcessForAddressSpace(ams::svc::CreateProcessFlag flags) { KProcess *CreateProcessForAddressSpace(ams::svc::CreateProcessParameterFlag flags) {
/* Find a process slab slot whose root page table is meant for the requested address space. */ /* Find a process slab slot whose root page table is meant for the requested address space. */
const size_t desired_t0sz = GetProcessSlotT0Sz(flags); const size_t desired_t0sz = GetProcessSlotT0Sz(flags);
@@ -132,13 +132,13 @@ namespace ams::kern::svc {
} }
/* Validate that the parameter flags are valid. */ /* Validate that the parameter flags are valid. */
R_UNLESS((params.flags & ~ams::svc::CreateProcessFlag_All) == 0, svc::ResultInvalidEnumValue()); R_UNLESS((params.flags & ~ams::svc::CreateProcessParameterFlag_All) == 0, svc::ResultInvalidEnumValue());
/* The 64KB page size is not yet allowed. */ /* The 64KB page size is not yet allowed. */
R_UNLESS((params.flags & ams::svc::CreateProcessFlag_AddressSpaceMask) != ams::svc::CreateProcessFlag_AddressSpace64Bit64KPage, svc::ResultInvalidCombination()); R_UNLESS((params.flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask) != ams::svc::CreateProcessParameterFlag_AddressSpace64Bit42, svc::ResultInvalidCombination());
/* Validate that 64-bit process is okay. */ /* Validate that 64-bit process is okay. */
const bool is_64_bit = (params.flags & ams::svc::CreateProcessFlag_Is64Bit) != 0; const bool is_64_bit = (params.flags & ams::svc::CreateProcessParameterFlag_64Bit) != 0;
if constexpr (sizeof(void *) < sizeof(u64)) { if constexpr (sizeof(void *) < sizeof(u64)) {
R_UNLESS(!is_64_bit, svc::ResultInvalidCombination()); R_UNLESS(!is_64_bit, svc::ResultInvalidCombination());
} }
@@ -147,35 +147,35 @@ namespace ams::kern::svc {
uintptr_t map_start, map_end; uintptr_t map_start, map_end;
size_t map_size; size_t map_size;
const size_t code_size = params.code_num_pages * PageSize; const size_t code_size = params.code_num_pages * PageSize;
switch (params.flags & ams::svc::CreateProcessFlag_AddressSpaceMask) { switch (params.flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask) {
case ams::svc::CreateProcessFlag_AddressSpace32Bit: case ams::svc::CreateProcessParameterFlag_AddressSpace32Bit:
case ams::svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: case ams::svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved:
{ {
map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall, code_size); map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall, code_size);
map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall); map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall);
map_end = map_start + map_size; map_end = map_start + map_size;
} }
break; break;
case ams::svc::CreateProcessFlag_AddressSpace64BitDeprecated: case ams::svc::CreateProcessParameterFlag_AddressSpace64Bit36:
{ {
/* 64-bit address space requires 64-bit process. */ /* 64-bit address space requires 64-bit process. */
R_UNLESS(is_64_bit, svc::ResultInvalidCombination()); R_UNLESS(is_64_bit, svc::ResultInvalidCombination());
map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall, code_size); map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall, code_size);
map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall); map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapSmall);
map_end = map_start + map_size; map_end = map_start + map_size;
} }
break; break;
case ams::svc::CreateProcessFlag_AddressSpace64Bit: case ams::svc::CreateProcessParameterFlag_AddressSpace64Bit39:
case ams::svc::CreateProcessFlag_AddressSpace64Bit64KPage: case ams::svc::CreateProcessParameterFlag_AddressSpace64Bit42:
{ {
/* 64-bit address space requires 64-bit process. */ /* 64-bit address space requires 64-bit process. */
R_UNLESS(is_64_bit, svc::ResultInvalidCombination()); R_UNLESS(is_64_bit, svc::ResultInvalidCombination());
map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapHuge, code_size); map_start = KAddressSpaceInfo::GetAddressSpaceStart(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapHuge, code_size);
map_end = map_start + KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_MapHuge); map_end = map_start + KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_MapHuge);
map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessFlag>(params.flags), KAddressSpaceInfo::Type_Heap); map_size = KAddressSpaceInfo::GetAddressSpaceSize(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags), KAddressSpaceInfo::Type_Heap);
} }
break; break;
default: default:
@@ -184,11 +184,11 @@ namespace ams::kern::svc {
/* Validate the pool partition. */ /* Validate the pool partition. */
if (GetTargetFirmware() >= TargetFirmware_5_0_0) { if (GetTargetFirmware() >= TargetFirmware_5_0_0) {
switch (params.flags & ams::svc::CreateProcessFlag_PoolPartitionMask) { switch (params.flags & ams::svc::CreateProcessParameterFlag_PoolPartitionMask) {
case ams::svc::CreateProcessFlag_PoolPartitionApplication: case ams::svc::CreateProcessParameterFlag_PoolPartitionApplication:
case ams::svc::CreateProcessFlag_PoolPartitionApplet: case ams::svc::CreateProcessParameterFlag_PoolPartitionApplet:
case ams::svc::CreateProcessFlag_PoolPartitionSystem: case ams::svc::CreateProcessParameterFlag_PoolPartitionSystem:
case ams::svc::CreateProcessFlag_PoolPartitionSystemNonSecure: case ams::svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure:
break; break;
default: default:
R_THROW(svc::ResultInvalidEnumValue()); R_THROW(svc::ResultInvalidEnumValue());
@@ -204,10 +204,10 @@ namespace ams::kern::svc {
/* Check that the number of extra resource pages is >= 0. */ /* Check that the number of extra resource pages is >= 0. */
R_UNLESS(params.system_resource_num_pages >= 0, svc::ResultInvalidSize()); R_UNLESS(params.system_resource_num_pages >= 0, svc::ResultInvalidSize());
/* Validate that the alias region extra size is allowed, if enabled. */ /* Validate that the address sanitizer is allowed, if enabled. */
if (params.flags & ams::svc::CreateProcessFlag_EnableAliasRegionExtraSize) { if (params.flags & ams::svc::CreateProcessParameterFlag_EnableAddressSanitizer) {
/* Check that we have a 64-bit address space. */ /* Check that we have a 64-bit address space. */
R_UNLESS((params.flags & ams::svc::CreateProcessFlag_AddressSpaceMask) == ams::svc::CreateProcessFlag_AddressSpace64Bit, svc::ResultInvalidState()); R_UNLESS((params.flags & ams::svc::CreateProcessParameterFlag_AddressSpaceMask) == ams::svc::CreateProcessParameterFlag_AddressSpace64Bit39, svc::ResultInvalidState());
/* Check that the system resource page count is non-zero. */ /* Check that the system resource page count is non-zero. */
R_UNLESS(params.system_resource_num_pages > 0, svc::ResultInvalidState()); R_UNLESS(params.system_resource_num_pages > 0, svc::ResultInvalidState());
@@ -243,8 +243,8 @@ namespace ams::kern::svc {
R_UNLESS(total_pages < (kern::MainMemorySizeMax / PageSize), svc::ResultOutOfMemory()); R_UNLESS(total_pages < (kern::MainMemorySizeMax / PageSize), svc::ResultOutOfMemory());
/* Check that optimized memory allocation is used only for applications. */ /* Check that optimized memory allocation is used only for applications. */
const bool optimize_allocs = (params.flags & ams::svc::CreateProcessFlag_OptimizeMemoryAllocation) != 0; const bool optimize_allocs = (params.flags & ams::svc::CreateProcessParameterFlag_OptimizeMemoryAllocation) != 0;
const bool is_application = (params.flags & ams::svc::CreateProcessFlag_IsApplication) != 0; const bool is_application = (params.flags & ams::svc::CreateProcessParameterFlag_IsApplication) != 0;
R_UNLESS(!optimize_allocs || is_application, svc::ResultBusy()); R_UNLESS(!optimize_allocs || is_application, svc::ResultBusy());
/* Check that the user-provided capabilities are accessible and refer to valid regions. */ /* Check that the user-provided capabilities are accessible and refer to valid regions. */
@@ -254,7 +254,7 @@ namespace ams::kern::svc {
auto &handle_table = GetCurrentProcess().GetHandleTable(); auto &handle_table = GetCurrentProcess().GetHandleTable();
/* Create the new process, ensuring its page table slot matches the requested address space. */ /* Create the new process, ensuring its page table slot matches the requested address space. */
KProcess *process = CreateProcessForAddressSpace(static_cast<ams::svc::CreateProcessFlag>(params.flags)); KProcess *process = CreateProcessForAddressSpace(static_cast<ams::svc::CreateProcessParameterFlag>(params.flags));
R_UNLESS(process != nullptr, svc::ResultOutOfResource()); R_UNLESS(process != nullptr, svc::ResultOutOfResource());
/* Ensure that the only reference to the process is in the handle table when we're done. */ /* Ensure that the only reference to the process is in the handle table when we're done. */
@@ -270,19 +270,19 @@ namespace ams::kern::svc {
/* Get the pool for the process. */ /* Get the pool for the process. */
const auto pool = [](u32 flags) ALWAYS_INLINE_LAMBDA -> KMemoryManager::Pool { const auto pool = [](u32 flags) ALWAYS_INLINE_LAMBDA -> KMemoryManager::Pool {
if (GetTargetFirmware() >= TargetFirmware_5_0_0) { if (GetTargetFirmware() >= TargetFirmware_5_0_0) {
switch (flags & ams::svc::CreateProcessFlag_PoolPartitionMask) { switch (flags & ams::svc::CreateProcessParameterFlag_PoolPartitionMask) {
case ams::svc::CreateProcessFlag_PoolPartitionApplication: case ams::svc::CreateProcessParameterFlag_PoolPartitionApplication:
return KMemoryManager::Pool_Application; return KMemoryManager::Pool_Application;
case ams::svc::CreateProcessFlag_PoolPartitionApplet: case ams::svc::CreateProcessParameterFlag_PoolPartitionApplet:
return KMemoryManager::Pool_Applet; return KMemoryManager::Pool_Applet;
case ams::svc::CreateProcessFlag_PoolPartitionSystem: case ams::svc::CreateProcessParameterFlag_PoolPartitionSystem:
return KMemoryManager::Pool_System; return KMemoryManager::Pool_System;
case ams::svc::CreateProcessFlag_PoolPartitionSystemNonSecure: case ams::svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure:
default: default:
return KMemoryManager::Pool_SystemNonSecure; return KMemoryManager::Pool_SystemNonSecure;
} }
} else if (GetTargetFirmware() >= TargetFirmware_4_0_0) { } else if (GetTargetFirmware() >= TargetFirmware_4_0_0) {
if ((flags & ams::svc::CreateProcessFlag_DeprecatedUseSecureMemory) != 0) { if ((flags & ams::svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory) != 0) {
return KMemoryManager::Pool_Secure; return KMemoryManager::Pool_Secure;
} else { } else {
return static_cast<KMemoryManager::Pool>(KSystemControl::GetCreateProcessMemoryPool()); return static_cast<KMemoryManager::Pool>(KSystemControl::GetCreateProcessMemoryPool());
@@ -31,11 +31,11 @@ namespace ams::cfg {
OverrideStatusFlag_AddressSpaceMask = ((1u << 2) - 1) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpaceMask = ((1u << 2) - 1) << OverrideStatusFlag_AddressSpaceShift,
#if defined(ATMOSPHERE_OS_HORIZON) #if defined(ATMOSPHERE_OS_HORIZON)
OverrideStatusFlag_AddressSpace32Bit = (svc::CreateProcessFlag_AddressSpace32Bit >> svc::CreateProcessFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpace32Bit = (svc::CreateProcessParameterFlag_AddressSpace32Bit >> svc::CreateProcessParameterFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift,
OverrideStatusFlag_AddressSpace64BitDeprecated = (svc::CreateProcessFlag_AddressSpace64BitDeprecated >> svc::CreateProcessFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpace64Bit36 = (svc::CreateProcessParameterFlag_AddressSpace64Bit36 >> svc::CreateProcessParameterFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift,
OverrideStatusFlag_AddressSpace32BitWithoutAlias = (svc::CreateProcessFlag_AddressSpace32BitWithoutAlias >> svc::CreateProcessFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpace32BitNoReserved = (svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved >> svc::CreateProcessParameterFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift,
OverrideStatusFlag_AddressSpace64Bit = (svc::CreateProcessFlag_AddressSpace64Bit >> svc::CreateProcessFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpace64Bit39 = (svc::CreateProcessParameterFlag_AddressSpace64Bit39 >> svc::CreateProcessParameterFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift,
OverrideStatusFlag_AddressSpace64Bit64KPage = (svc::CreateProcessFlag_AddressSpace64Bit64KPage >> svc::CreateProcessFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift, OverrideStatusFlag_AddressSpace64Bit42 = (svc::CreateProcessParameterFlag_AddressSpace64Bit42 >> svc::CreateProcessParameterFlag_AddressSpaceShift) << OverrideStatusFlag_AddressSpaceShift,
#endif #endif
}; };
@@ -50,9 +50,9 @@ namespace ams::ldr {
ProgramInfoFlag_AllowDebug = (1 << 2), ProgramInfoFlag_AllowDebug = (1 << 2),
}; };
enum CreateProcessFlag { enum CreateProcessParameterFlag {
CreateProcessFlag_EnableDebug = (1 << 0), CreateProcessParameterFlag_EnableJitDebug = (1 << 0),
CreateProcessFlag_DisableAslr = (1 << 1), CreateProcessParameterFlag_DisableAslr = (1 << 1),
}; };
struct ProgramArguments { struct ProgramArguments {
@@ -194,10 +194,10 @@ namespace ams::ldr {
}; };
#if defined(ATMOSPHERE_OS_HORIZON) #if defined(ATMOSPHERE_OS_HORIZON)
static_assert(PoolPartition_Application == (svc::CreateProcessFlag_PoolPartitionApplication >> svc::CreateProcessFlag_PoolPartitionShift)); static_assert(PoolPartition_Application == (svc::CreateProcessParameterFlag_PoolPartitionApplication >> svc::CreateProcessParameterFlag_PoolPartitionShift));
static_assert(PoolPartition_Applet == (svc::CreateProcessFlag_PoolPartitionApplet >> svc::CreateProcessFlag_PoolPartitionShift)); static_assert(PoolPartition_Applet == (svc::CreateProcessParameterFlag_PoolPartitionApplet >> svc::CreateProcessParameterFlag_PoolPartitionShift));
static_assert(PoolPartition_System == (svc::CreateProcessFlag_PoolPartitionSystem >> svc::CreateProcessFlag_PoolPartitionShift)); static_assert(PoolPartition_System == (svc::CreateProcessParameterFlag_PoolPartitionSystem >> svc::CreateProcessParameterFlag_PoolPartitionShift));
static_assert(PoolPartition_SystemNonSecure == (svc::CreateProcessFlag_PoolPartitionSystemNonSecure >> svc::CreateProcessFlag_PoolPartitionShift)); static_assert(PoolPartition_SystemNonSecure == (svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure >> svc::CreateProcessParameterFlag_PoolPartitionShift));
#endif #endif
u8 signature[0x100]; u8 signature[0x100];
@@ -223,43 +223,43 @@ namespace ams::ldr {
struct Npdm { struct Npdm {
static constexpr u32 Magic = util::FourCC<'M','E','T','A'>::Code; static constexpr u32 Magic = util::FourCC<'M','E','T','A'>::Code;
enum MetaFlag { enum MetaFlag0 {
MetaFlag_Is64Bit = (1 << 0), MetaFlag0_Is64BitInstruction = (1 << 0),
MetaFlag_AddressSpaceTypeShift = 1, MetaFlag0_ProcessAddressSpaceShift = 1,
MetaFlag_AddressSpaceTypeMask = (7 << MetaFlag_AddressSpaceTypeShift), MetaFlag0_ProcessAddressSpaceMask = (7 << MetaFlag0_ProcessAddressSpaceShift),
MetaFlag_OptimizeMemoryAllocation = (1 << 4), MetaFlag0_OptimizeMemoryAllocation = (1 << 4),
MetaFlag_DisableDeviceAddressSpaceMerge = (1 << 5), MetaFlag0_DisableDeviceAddressSpaceMerge = (1 << 5),
MetaFlag_EnableAliasRegionExtraSize = (1 << 6), MetaFlag0_EnableAddressSanitizer = (1 << 6),
MetaFlag_PreventCodeReads = (1 << 7), MetaFlag0_PreventCodeReads = (1 << 7),
}; };
enum MetaFlag2 { enum MetaFlag1 {
MetaFlag2_EnableShadowStack = (1 << 0), MetaFlag1_EnableShadowStack = (1 << 0),
}; };
enum AddressSpaceType { enum ProcessAddressSpace {
AddressSpaceType_32Bit = 0, ProcessAddressSpace_32Bit = 0,
AddressSpaceType_64BitDeprecated = 1, ProcessAddressSpace_64Bit36 = 1,
AddressSpaceType_32BitWithoutAlias = 2, ProcessAddressSpace_32BitNoReserved = 2,
AddressSpaceType_64Bit = 3, ProcessAddressSpace_64Bit39 = 3,
AddressSpaceType_64Bit64KPage = 4, ProcessAddressSpace_64Bit42 = 4,
}; };
#if defined(ATMOSPHERE_OS_HORIZON) #if defined(ATMOSPHERE_OS_HORIZON)
static_assert(AddressSpaceType_32Bit == (svc::CreateProcessFlag_AddressSpace32Bit >> svc::CreateProcessFlag_AddressSpaceShift)); static_assert(ProcessAddressSpace_32Bit == (svc::CreateProcessParameterFlag_AddressSpace32Bit >> svc::CreateProcessParameterFlag_AddressSpaceShift));
static_assert(AddressSpaceType_64BitDeprecated == (svc::CreateProcessFlag_AddressSpace64BitDeprecated >> svc::CreateProcessFlag_AddressSpaceShift)); static_assert(ProcessAddressSpace_64Bit36 == (svc::CreateProcessParameterFlag_AddressSpace64Bit36 >> svc::CreateProcessParameterFlag_AddressSpaceShift));
static_assert(AddressSpaceType_32BitWithoutAlias == (svc::CreateProcessFlag_AddressSpace32BitWithoutAlias >> svc::CreateProcessFlag_AddressSpaceShift)); static_assert(ProcessAddressSpace_32BitNoReserved == (svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved >> svc::CreateProcessParameterFlag_AddressSpaceShift));
static_assert(AddressSpaceType_64Bit == (svc::CreateProcessFlag_AddressSpace64Bit >> svc::CreateProcessFlag_AddressSpaceShift)); static_assert(ProcessAddressSpace_64Bit39 == (svc::CreateProcessParameterFlag_AddressSpace64Bit39 >> svc::CreateProcessParameterFlag_AddressSpaceShift));
static_assert(AddressSpaceType_64Bit64KPage == (svc::CreateProcessFlag_AddressSpace64Bit64KPage >> svc::CreateProcessFlag_AddressSpaceShift)); static_assert(ProcessAddressSpace_64Bit42 == (svc::CreateProcessParameterFlag_AddressSpace64Bit42 >> svc::CreateProcessParameterFlag_AddressSpaceShift));
#endif #endif
u32 magic; u32 magic;
u32 signature_key_generation; u32 signature_key_generation;
u8 reserved_08[4]; u8 reserved_08[4];
u8 flags; u8 flags0;
u8 flags2; u8 flags1;
u8 main_thread_priority; u8 main_thread_priority;
u8 default_cpu_id; u8 default_cpu_id;
u8 reserved_10[4]; u8 reserved_10[4];
@@ -79,20 +79,20 @@ namespace ams::cfg {
InvalidProgramOverrideKey, InvalidProgramOverrideKey,
}, },
.program_as_flags = { .program_as_flags = {
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
impl::OverrideStatusFlag_AddressSpace64Bit, impl::OverrideStatusFlag_AddressSpace64Bit39,
}, },
.override_any_app_key = { .override_any_app_key = {
.key_combination = HidNpadButton_R, .key_combination = HidNpadButton_R,
.override_by_default = false, .override_by_default = false,
}, },
.override_any_app_as_flag = impl::OverrideStatusFlag_AddressSpace64Bit, .override_any_app_as_flag = impl::OverrideStatusFlag_AddressSpace64Bit39,
.override_any_app = true, .override_any_app = true,
}; };
@@ -152,11 +152,11 @@ namespace ams::cfg {
impl::OverrideStatusFlag ParseOverrideAddressSpace(const char *value) { impl::OverrideStatusFlag ParseOverrideAddressSpace(const char *value) {
if (strcasecmp(value, "39_bit") == 0 || strcasecmp(value, "39") == 0) { if (strcasecmp(value, "39_bit") == 0 || strcasecmp(value, "39") == 0) {
return impl::OverrideStatusFlag_AddressSpace64Bit; return impl::OverrideStatusFlag_AddressSpace64Bit39;
} else if (strcasecmp(value, "42_bit") == 0 || strcasecmp(value, "42") == 0) { } else if (strcasecmp(value, "42_bit") == 0 || strcasecmp(value, "42") == 0) {
return impl::OverrideStatusFlag_AddressSpace64Bit64KPage; return impl::OverrideStatusFlag_AddressSpace64Bit42;
} else if (strcasecmp(value, "36_bit") == 0 || strcasecmp(value, "36") == 0) { } else if (strcasecmp(value, "36_bit") == 0 || strcasecmp(value, "36") == 0) {
return impl::OverrideStatusFlag_AddressSpace64BitDeprecated; return impl::OverrideStatusFlag_AddressSpace64Bit36;
} else if (strcasecmp(value, "32_bit") == 0 || strcasecmp(value, "32") == 0) { } else if (strcasecmp(value, "32_bit") == 0 || strcasecmp(value, "32") == 0) {
return impl::OverrideStatusFlag_AddressSpace32Bit; return impl::OverrideStatusFlag_AddressSpace32Bit;
} else if (strcasecmp(value, "32_bit_without_alias") == 0 || } else if (strcasecmp(value, "32_bit_without_alias") == 0 ||
@@ -168,10 +168,10 @@ namespace ams::cfg {
strcasecmp(value, "32_without_map") == 0 || strcasecmp(value, "32_without_map") == 0 ||
strcasecmp(value, "32_no_map") == 0) strcasecmp(value, "32_no_map") == 0)
{ {
return impl::OverrideStatusFlag_AddressSpace32BitWithoutAlias; return impl::OverrideStatusFlag_AddressSpace32BitNoReserved;
} else { } else {
/* Default to 39-bit. */ /* Default to 39-bit. */
return impl::OverrideStatusFlag_AddressSpace64Bit; return impl::OverrideStatusFlag_AddressSpace64Bit39;
} }
} }
@@ -27,14 +27,14 @@ namespace ams::osdbg::impl {
using ThreadInfoImpl = ThreadInfoHorizonImpl; using ThreadInfoImpl = ThreadInfoHorizonImpl;
constexpr inline bool IsLp64(const ThreadInfo *info) { constexpr inline bool IsLp64(const ThreadInfo *info) {
const auto as = info->_debug_info_create_process.flags & svc::CreateProcessFlag_AddressSpaceMask; const auto as = info->_debug_info_create_process.flags & svc::CreateProcessParameterFlag_AddressSpaceMask;
return as == svc::CreateProcessFlag_AddressSpace64Bit return as == svc::CreateProcessParameterFlag_AddressSpace64Bit39
|| as == svc::CreateProcessFlag_AddressSpace64BitDeprecated || as == svc::CreateProcessParameterFlag_AddressSpace64Bit36
|| as == svc::CreateProcessFlag_AddressSpace64Bit64KPage; || as == svc::CreateProcessParameterFlag_AddressSpace64Bit42;
} }
constexpr inline bool Is64BitArch(const ThreadInfo *info) { constexpr inline bool Is64BitArch(const ThreadInfo *info) {
return (info->_debug_info_create_process.flags & svc::CreateProcessFlag_Is64Bit); return (info->_debug_info_create_process.flags & svc::CreateProcessParameterFlag_64Bit);
} }
} }
@@ -96,8 +96,7 @@ namespace ams::svc {
MemoryState_CodeOut = 0x15, MemoryState_CodeOut = 0x15,
MemoryState_Coverage = 0x16, MemoryState_Coverage = 0x16,
MemoryState_Insecure = 0x17, MemoryState_Insecure = 0x17,
MemoryState_Remote = 0x18, /* ... */
MemoryState_Protected = 0x19,
MemoryState_ShadowStack = 0x1A, MemoryState_ShadowStack = 0x1A,
}; };
@@ -413,62 +412,62 @@ namespace ams::svc {
ProcessActivity_Paused = 1, ProcessActivity_Paused = 1,
}; };
enum CreateProcessFlag : u32 { enum CreateProcessParameterFlag : u32 {
/* Is 64 bit? */ /* Is 64 bit? */
CreateProcessFlag_Is64Bit = (1 << 0), CreateProcessParameterFlag_64Bit = (1 << 0),
/* What kind of address space? */ /* What kind of address space? */
CreateProcessFlag_AddressSpaceShift = 1, CreateProcessParameterFlag_AddressSpaceShift = 1,
CreateProcessFlag_AddressSpaceMask = (7 << CreateProcessFlag_AddressSpaceShift), /* Should be 15 but Nintendo didn't make 64K isn't usable yet */ CreateProcessParameterFlag_AddressSpaceMask = (7 << CreateProcessParameterFlag_AddressSpaceShift), /* Should be 15 but Nintendo didn't make 64K usable yet */
CreateProcessFlag_AddressSpace32Bit = (0 << CreateProcessFlag_AddressSpaceShift), CreateProcessParameterFlag_AddressSpace32Bit = (0 << CreateProcessParameterFlag_AddressSpaceShift),
CreateProcessFlag_AddressSpace64BitDeprecated = (1 << CreateProcessFlag_AddressSpaceShift), CreateProcessParameterFlag_AddressSpace64Bit36 = (1 << CreateProcessParameterFlag_AddressSpaceShift),
CreateProcessFlag_AddressSpace32BitWithoutAlias = (2 << CreateProcessFlag_AddressSpaceShift), CreateProcessParameterFlag_AddressSpace32BitNoReserved = (2 << CreateProcessParameterFlag_AddressSpaceShift),
CreateProcessFlag_AddressSpace64Bit = (3 << CreateProcessFlag_AddressSpaceShift), CreateProcessParameterFlag_AddressSpace64Bit39 = (3 << CreateProcessParameterFlag_AddressSpaceShift),
CreateProcessFlag_AddressSpace64Bit64KPage = (4 << CreateProcessFlag_AddressSpaceShift), CreateProcessParameterFlag_AddressSpace64Bit42 = (4 << CreateProcessParameterFlag_AddressSpaceShift),
/* Should JIT debug be done on crash? */ /* Should JIT debug be done on crash? */
CreateProcessFlag_EnableDebug = (1 << 4), CreateProcessParameterFlag_EnableJitDebug = (1 << 4),
/* Should ASLR be enabled for the process? */ /* Should ASLR be enabled for the process? */
CreateProcessFlag_EnableAslr = (1 << 5), CreateProcessParameterFlag_EnableAslr = (1 << 5),
/* Is the process an application? */ /* Is the process an application? */
CreateProcessFlag_IsApplication = (1 << 6), CreateProcessParameterFlag_IsApplication = (1 << 6),
/* 4.x deprecated: Should use secure memory? */ /* 4.x deprecated: Should use secure memory? */
CreateProcessFlag_DeprecatedUseSecureMemory = (1 << 7), CreateProcessParameterFlag_DeprecatedUseSecureMemory = (1 << 7),
/* 5.x+ Pool partition type. */ /* 5.x+ Pool partition type. */
CreateProcessFlag_PoolPartitionShift = 7, CreateProcessParameterFlag_PoolPartitionShift = 7,
CreateProcessFlag_PoolPartitionMask = (0xF << CreateProcessFlag_PoolPartitionShift), CreateProcessParameterFlag_PoolPartitionMask = (0xF << CreateProcessParameterFlag_PoolPartitionShift),
CreateProcessFlag_PoolPartitionApplication = (0 << CreateProcessFlag_PoolPartitionShift), CreateProcessParameterFlag_PoolPartitionApplication = (0 << CreateProcessParameterFlag_PoolPartitionShift),
CreateProcessFlag_PoolPartitionApplet = (1 << CreateProcessFlag_PoolPartitionShift), CreateProcessParameterFlag_PoolPartitionApplet = (1 << CreateProcessParameterFlag_PoolPartitionShift),
CreateProcessFlag_PoolPartitionSystem = (2 << CreateProcessFlag_PoolPartitionShift), CreateProcessParameterFlag_PoolPartitionSystem = (2 << CreateProcessParameterFlag_PoolPartitionShift),
CreateProcessFlag_PoolPartitionSystemNonSecure = (3 << CreateProcessFlag_PoolPartitionShift), CreateProcessParameterFlag_PoolPartitionSystemNonSecure = (3 << CreateProcessParameterFlag_PoolPartitionShift),
/* 7.x+ Should memory allocation be optimized? This requires IsApplication. */ /* 7.x+ Should memory allocation be optimized? This requires IsApplication. */
CreateProcessFlag_OptimizeMemoryAllocation = (1 << 11), CreateProcessParameterFlag_OptimizeMemoryAllocation = (1 << 11),
/* 11.x+ DisableDeviceAddressSpaceMerge. */ /* 11.x+ DisableDeviceAddressSpaceMerge. */
CreateProcessFlag_DisableDeviceAddressSpaceMerge = (1 << 12), CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge = (1 << 12),
/* 18.x EnableAliasRegionExtraSize. */ /* 18.x EnableAddressSanitizer. */
CreateProcessFlag_EnableAliasRegionExtraSize = (1 << 13), CreateProcessParameterFlag_EnableAddressSanitizer = (1 << 13),
/* 23.x EnableShadowStack. */ /* 23.x EnableShadowStack. */
CreateProcessFlag_EnableShadowStack = (1 << 17), CreateProcessParameterFlag_EnableShadowStack = (1 << 17),
/* Mask of all flags. */ /* Mask of all flags. */
CreateProcessFlag_All = CreateProcessFlag_Is64Bit | CreateProcessParameterFlag_All = CreateProcessParameterFlag_64Bit |
CreateProcessFlag_AddressSpaceMask | CreateProcessParameterFlag_AddressSpaceMask |
CreateProcessFlag_EnableDebug | CreateProcessParameterFlag_EnableJitDebug |
CreateProcessFlag_EnableAslr | CreateProcessParameterFlag_EnableAslr |
CreateProcessFlag_IsApplication | CreateProcessParameterFlag_IsApplication |
CreateProcessFlag_PoolPartitionMask | CreateProcessParameterFlag_PoolPartitionMask |
CreateProcessFlag_OptimizeMemoryAllocation | CreateProcessParameterFlag_OptimizeMemoryAllocation |
CreateProcessFlag_DisableDeviceAddressSpaceMerge | CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge |
CreateProcessFlag_EnableAliasRegionExtraSize | CreateProcessParameterFlag_EnableAddressSanitizer |
CreateProcessFlag_EnableShadowStack, CreateProcessParameterFlag_EnableShadowStack,
}; };
/* Debug types. */ /* Debug types. */
@@ -67,11 +67,11 @@ namespace ams::creport {
} }
bool IsApplication() const { bool IsApplication() const {
return (m_process_info.flags & svc::CreateProcessFlag_IsApplication) != 0; return (m_process_info.flags & svc::CreateProcessParameterFlag_IsApplication) != 0;
} }
bool Is64Bit() const { bool Is64Bit() const {
return (m_process_info.flags & svc::CreateProcessFlag_Is64Bit) != 0; return (m_process_info.flags & svc::CreateProcessParameterFlag_64Bit) != 0;
} }
bool IsUserBreak() const { bool IsUserBreak() const {
@@ -88,8 +88,8 @@ namespace ams::dmnt {
m_create_process_info = d.info.create_process; m_create_process_info = d.info.create_process;
/* Cache our bools. */ /* Cache our bools. */
m_is_64_bit = (m_create_process_info.flags & svc::CreateProcessFlag_Is64Bit); m_is_64_bit = (m_create_process_info.flags & svc::CreateProcessParameterFlag_64Bit);
m_is_64_bit_address_space = (m_create_process_info.flags & svc::CreateProcessFlag_AddressSpaceMask) == svc::CreateProcessFlag_AddressSpace64Bit; m_is_64_bit_address_space = (m_create_process_info.flags & svc::CreateProcessParameterFlag_AddressSpaceMask) == svc::CreateProcessParameterFlag_AddressSpace64Bit39;
} }
break; break;
case svc::DebugEvent_CreateThread: case svc::DebugEvent_CreateThread:
@@ -522,8 +522,8 @@ namespace ams::dmnt {
m_create_process_info = out->info.create_process; m_create_process_info = out->info.create_process;
/* Cache our bools. */ /* Cache our bools. */
m_is_64_bit = (m_create_process_info.flags & svc::CreateProcessFlag_Is64Bit); m_is_64_bit = (m_create_process_info.flags & svc::CreateProcessParameterFlag_64Bit);
m_is_64_bit_address_space = (m_create_process_info.flags & svc::CreateProcessFlag_AddressSpaceMask) == svc::CreateProcessFlag_AddressSpace64Bit; m_is_64_bit_address_space = (m_create_process_info.flags & svc::CreateProcessParameterFlag_AddressSpaceMask) == svc::CreateProcessParameterFlag_AddressSpace64Bit39;
} }
break; break;
case svc::DebugEvent_CreateThread: case svc::DebugEvent_CreateThread:
+8 -8
View File
@@ -88,8 +88,8 @@ namespace ams::ldr {
R_UNLESS(npdm->magic == Npdm::Magic, ldr::ResultInvalidMeta()); R_UNLESS(npdm->magic == Npdm::Magic, ldr::ResultInvalidMeta());
/* Validate flags. */ /* Validate flags. */
constexpr u32 InvalidMetaFlagMask = 0x80000000; constexpr u32 InvalidMetaFlag0Mask = 0x80000000;
R_UNLESS(!(npdm->flags & InvalidMetaFlagMask), ldr::ResultInvalidMeta()); R_UNLESS(!(npdm->flags0 & InvalidMetaFlag0Mask), ldr::ResultInvalidMeta());
/* Validate Acid extents. */ /* Validate Acid extents. */
R_TRY(ValidateSubregion(sizeof(Npdm), size, npdm->acid_offset, npdm->acid_size, sizeof(Acid))); R_TRY(ValidateSubregion(sizeof(Npdm), size, npdm->acid_offset, npdm->acid_size, sizeof(Acid)));
@@ -262,15 +262,15 @@ namespace ams::ldr {
/* Perform address space override. */ /* Perform address space override. */
if (status.HasOverrideAddressSpace()) { if (status.HasOverrideAddressSpace()) {
/* Clear the existing address space. */ /* Clear the existing address space. */
meta->npdm->flags &= ~Npdm::MetaFlag_AddressSpaceTypeMask; meta->npdm->flags0 &= ~Npdm::MetaFlag0_ProcessAddressSpaceMask;
/* Set the new address space flag. */ /* Set the new address space flag. */
switch (status.GetOverrideAddressSpaceFlags()) { switch (status.GetOverrideAddressSpaceFlags()) {
case cfg::impl::OverrideStatusFlag_AddressSpace32Bit: meta->npdm->flags |= (Npdm::AddressSpaceType_32Bit) << Npdm::MetaFlag_AddressSpaceTypeShift; break; case cfg::impl::OverrideStatusFlag_AddressSpace32Bit: meta->npdm->flags0 |= (Npdm::ProcessAddressSpace_32Bit) << Npdm::MetaFlag0_ProcessAddressSpaceShift; break;
case cfg::impl::OverrideStatusFlag_AddressSpace64BitDeprecated: meta->npdm->flags |= (Npdm::AddressSpaceType_64BitDeprecated) << Npdm::MetaFlag_AddressSpaceTypeShift; break; case cfg::impl::OverrideStatusFlag_AddressSpace64Bit36: meta->npdm->flags0 |= (Npdm::ProcessAddressSpace_64Bit36) << Npdm::MetaFlag0_ProcessAddressSpaceShift; break;
case cfg::impl::OverrideStatusFlag_AddressSpace32BitWithoutAlias: meta->npdm->flags |= (Npdm::AddressSpaceType_32BitWithoutAlias) << Npdm::MetaFlag_AddressSpaceTypeShift; break; case cfg::impl::OverrideStatusFlag_AddressSpace32BitNoReserved: meta->npdm->flags0 |= (Npdm::ProcessAddressSpace_32BitNoReserved) << Npdm::MetaFlag0_ProcessAddressSpaceShift; break;
case cfg::impl::OverrideStatusFlag_AddressSpace64Bit: meta->npdm->flags |= (Npdm::AddressSpaceType_64Bit) << Npdm::MetaFlag_AddressSpaceTypeShift; break; case cfg::impl::OverrideStatusFlag_AddressSpace64Bit39: meta->npdm->flags0 |= (Npdm::ProcessAddressSpace_64Bit39) << Npdm::MetaFlag0_ProcessAddressSpaceShift; break;
case cfg::impl::OverrideStatusFlag_AddressSpace64Bit64KPage: meta->npdm->flags |= (Npdm::AddressSpaceType_64Bit64KPage) << Npdm::MetaFlag_AddressSpaceTypeShift; break; case cfg::impl::OverrideStatusFlag_AddressSpace64Bit42: meta->npdm->flags0 |= (Npdm::ProcessAddressSpace_64Bit42) << Npdm::MetaFlag0_ProcessAddressSpaceShift; break;
AMS_UNREACHABLE_DEFAULT_CASE(); AMS_UNREACHABLE_DEFAULT_CASE();
} }
} }
@@ -175,8 +175,8 @@ namespace ams::ldr {
return (MakeProgramInfoFlag(static_cast<const util::BitPack32 *>(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application; return (MakeProgramInfoFlag(static_cast<const util::BitPack32 *>(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)) & ProgramInfoFlag_ApplicationTypeMask) == ProgramInfoFlag_Application;
} }
Npdm::AddressSpaceType GetAddressSpaceType(const Meta *meta) { Npdm::ProcessAddressSpace GetProcessAddressSpace(const Meta *meta) {
return static_cast<Npdm::AddressSpaceType>((meta->npdm->flags & Npdm::MetaFlag_AddressSpaceTypeMask) >> Npdm::MetaFlag_AddressSpaceTypeShift); return static_cast<Npdm::ProcessAddressSpace>((meta->npdm->flags0 & Npdm::MetaFlag0_ProcessAddressSpaceMask) >> Npdm::MetaFlag0_ProcessAddressSpaceShift);
} }
Acid::PoolPartition GetPoolPartition(const Meta *meta) { Acid::PoolPartition GetPoolPartition(const Meta *meta) {
@@ -399,55 +399,55 @@ namespace ams::ldr {
R_SUCCEED(); R_SUCCEED();
} }
Result GetCreateProcessFlags(u32 *out, const Meta *meta, const u32 ldr_flags) { Result GetCreateProcessParameterFlags(u32 *out, const Meta *meta, const u32 ldr_flags) {
const u8 meta_flags = meta->npdm->flags; const u8 meta_flags = meta->npdm->flags0;
u32 flags = 0; u32 flags = 0;
/* Set Is64Bit. */ /* Set Is64Bit. */
if (meta_flags & Npdm::MetaFlag_Is64Bit) { if (meta_flags & Npdm::MetaFlag0_Is64BitInstruction) {
flags |= svc::CreateProcessFlag_Is64Bit; flags |= svc::CreateProcessParameterFlag_64Bit;
} }
/* Set AddressSpaceType. */ /* Set ProcessAddressSpace. */
switch (GetAddressSpaceType(meta)) { switch (GetProcessAddressSpace(meta)) {
case Npdm::AddressSpaceType_32Bit: case Npdm::ProcessAddressSpace_32Bit:
flags |= svc::CreateProcessFlag_AddressSpace32Bit; flags |= svc::CreateProcessParameterFlag_AddressSpace32Bit;
break; break;
case Npdm::AddressSpaceType_64BitDeprecated: case Npdm::ProcessAddressSpace_64Bit36:
flags |= svc::CreateProcessFlag_AddressSpace64BitDeprecated; flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit36;
break; break;
case Npdm::AddressSpaceType_32BitWithoutAlias: case Npdm::ProcessAddressSpace_32BitNoReserved:
flags |= svc::CreateProcessFlag_AddressSpace32BitWithoutAlias; flags |= svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved;
break; break;
case Npdm::AddressSpaceType_64Bit: case Npdm::ProcessAddressSpace_64Bit39:
flags |= svc::CreateProcessFlag_AddressSpace64Bit; flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit39;
break; break;
case Npdm::AddressSpaceType_64Bit64KPage: case Npdm::ProcessAddressSpace_64Bit42:
flags |= svc::CreateProcessFlag_AddressSpace64Bit64KPage; flags |= svc::CreateProcessParameterFlag_AddressSpace64Bit42;
break; break;
default: default:
R_THROW(ldr::ResultInvalidMeta()); R_THROW(ldr::ResultInvalidMeta());
} }
/* Set Enable Debug. */ /* Set Enable Debug. */
if (ldr_flags & CreateProcessFlag_EnableDebug) { if (ldr_flags & CreateProcessParameterFlag_EnableJitDebug) {
flags |= svc::CreateProcessFlag_EnableDebug; flags |= svc::CreateProcessParameterFlag_EnableJitDebug;
} }
/* Set Enable ASLR. */ /* Set Enable ASLR. */
if (!(ldr_flags & CreateProcessFlag_DisableAslr)) { if (!(ldr_flags & CreateProcessParameterFlag_DisableAslr)) {
flags |= svc::CreateProcessFlag_EnableAslr; flags |= svc::CreateProcessParameterFlag_EnableAslr;
} }
/* Set Is Application. */ /* Set Is Application. */
if (IsApplication(meta)) { if (IsApplication(meta)) {
flags |= svc::CreateProcessFlag_IsApplication; flags |= svc::CreateProcessParameterFlag_IsApplication;
/* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */ /* 7.0.0+: Set OptimizeMemoryAllocation if relevant. */
if (hos::GetVersion() >= hos::Version_7_0_0) { if (hos::GetVersion() >= hos::Version_7_0_0) {
if (meta_flags & Npdm::MetaFlag_OptimizeMemoryAllocation) { if (meta_flags & Npdm::MetaFlag0_OptimizeMemoryAllocation) {
flags |= svc::CreateProcessFlag_OptimizeMemoryAllocation; flags |= svc::CreateProcessParameterFlag_OptimizeMemoryAllocation;
} }
} }
} }
@@ -459,19 +459,19 @@ namespace ams::ldr {
switch (GetPoolPartition(meta)) { switch (GetPoolPartition(meta)) {
case Acid::PoolPartition_Application: case Acid::PoolPartition_Application:
if (IsApplet(meta)) { if (IsApplet(meta)) {
flags |= svc::CreateProcessFlag_PoolPartitionApplet; flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet;
} else { } else {
flags |= svc::CreateProcessFlag_PoolPartitionApplication; flags |= svc::CreateProcessParameterFlag_PoolPartitionApplication;
} }
break; break;
case Acid::PoolPartition_Applet: case Acid::PoolPartition_Applet:
flags |= svc::CreateProcessFlag_PoolPartitionApplet; flags |= svc::CreateProcessParameterFlag_PoolPartitionApplet;
break; break;
case Acid::PoolPartition_System: case Acid::PoolPartition_System:
flags |= svc::CreateProcessFlag_PoolPartitionSystem; flags |= svc::CreateProcessParameterFlag_PoolPartitionSystem;
break; break;
case Acid::PoolPartition_SystemNonSecure: case Acid::PoolPartition_SystemNonSecure:
flags |= svc::CreateProcessFlag_PoolPartitionSystemNonSecure; flags |= svc::CreateProcessParameterFlag_PoolPartitionSystemNonSecure;
break; break;
default: default:
R_THROW(ldr::ResultInvalidMeta()); R_THROW(ldr::ResultInvalidMeta());
@@ -479,18 +479,18 @@ namespace ams::ldr {
} else if (hos::GetVersion() >= hos::Version_4_0_0) { } else if (hos::GetVersion() >= hos::Version_4_0_0) {
/* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */ /* On 4.0.0+, the corresponding bit was simply "UseSecureMemory". */
if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) { if (meta->acid->flags & Acid::AcidFlag_DeprecatedUseSecureMemory) {
flags |= svc::CreateProcessFlag_DeprecatedUseSecureMemory; flags |= svc::CreateProcessParameterFlag_DeprecatedUseSecureMemory;
} }
} }
/* 11.0.0+/meso Set Disable DAS merge. */ /* 11.0.0+/meso Set Disable DAS merge. */
if (meta_flags & Npdm::MetaFlag_DisableDeviceAddressSpaceMerge) { if (meta_flags & Npdm::MetaFlag0_DisableDeviceAddressSpaceMerge) {
flags |= svc::CreateProcessFlag_DisableDeviceAddressSpaceMerge; flags |= svc::CreateProcessParameterFlag_DisableDeviceAddressSpaceMerge;
} }
/* 18.0.0+/meso Set Alias region extra size. */ /* 18.0.0+/meso Set Alias region extra size. */
if (meta_flags & Npdm::MetaFlag_EnableAliasRegionExtraSize) { if (meta_flags & Npdm::MetaFlag0_EnableAddressSanitizer) {
flags |= svc::CreateProcessFlag_EnableAliasRegionExtraSize; flags |= svc::CreateProcessParameterFlag_EnableAddressSanitizer;
} }
*out = flags; *out = flags;
@@ -508,7 +508,7 @@ namespace ams::ldr {
out->reslimit = resource_limit; out->reslimit = resource_limit;
/* Set flags. */ /* Set flags. */
R_TRY(GetCreateProcessFlags(std::addressof(out->flags), meta, flags)); R_TRY(GetCreateProcessParameterFlags(std::addressof(out->flags), meta, flags));
/* 3.0.0+ System Resource Size. */ /* 3.0.0+ System Resource Size. */
if (hos::GetVersion() >= hos::Version_3_0_0) { if (hos::GetVersion() >= hos::Version_3_0_0) {
@@ -518,7 +518,7 @@ namespace ams::ldr {
/* Validate system resource usage. */ /* Validate system resource usage. */
if (meta->npdm->system_resource_size) { if (meta->npdm->system_resource_size) {
/* Process must be 64-bit. */ /* Process must be 64-bit. */
R_UNLESS((out->flags & svc::CreateProcessFlag_AddressSpace64Bit), ldr::ResultInvalidMeta()); R_UNLESS((out->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit39), ldr::ResultInvalidMeta());
/* Process must be application or applet. */ /* Process must be application or applet. */
R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta()); R_UNLESS(IsApplication(meta) || IsApplet(meta), ldr::ResultInvalidMeta());
@@ -586,21 +586,21 @@ namespace ams::ldr {
uintptr_t aslr_start = 0; uintptr_t aslr_start = 0;
size_t aslr_size = 0; size_t aslr_size = 0;
if (hos::GetVersion() >= hos::Version_2_0_0) { if (hos::GetVersion() >= hos::Version_2_0_0) {
switch (out_param->flags & svc::CreateProcessFlag_AddressSpaceMask) { switch (out_param->flags & svc::CreateProcessParameterFlag_AddressSpaceMask) {
case svc::CreateProcessFlag_AddressSpace32Bit: case svc::CreateProcessParameterFlag_AddressSpace32Bit:
case svc::CreateProcessFlag_AddressSpace32BitWithoutAlias: case svc::CreateProcessParameterFlag_AddressSpace32BitNoReserved:
aslr_start = svc::AddressSmallMap32Start; aslr_start = svc::AddressSmallMap32Start;
aslr_size = svc::AddressSmallMap32Size; aslr_size = svc::AddressSmallMap32Size;
break; break;
case svc::CreateProcessFlag_AddressSpace64BitDeprecated: case svc::CreateProcessParameterFlag_AddressSpace64Bit36:
aslr_start = svc::AddressSmallMap36Start; aslr_start = svc::AddressSmallMap36Start;
aslr_size = svc::AddressSmallMap36Size; aslr_size = svc::AddressSmallMap36Size;
break; break;
case svc::CreateProcessFlag_AddressSpace64Bit: case svc::CreateProcessParameterFlag_AddressSpace64Bit39:
aslr_start = svc::AddressMap39Start; aslr_start = svc::AddressMap39Start;
aslr_size = svc::AddressMap39Size; aslr_size = svc::AddressMap39Size;
break; break;
case svc::CreateProcessFlag_AddressSpace64Bit64KPage: case svc::CreateProcessParameterFlag_AddressSpace64Bit42:
aslr_start = svc::AddressMap42Start; aslr_start = svc::AddressMap42Start;
aslr_size = svc::AddressMap42Size; aslr_size = svc::AddressMap42Size;
break; break;
@@ -608,7 +608,7 @@ namespace ams::ldr {
} }
} else { } else {
/* On 1.0.0, only 2 address space types existed. */ /* On 1.0.0, only 2 address space types existed. */
if (out_param->flags & svc::CreateProcessFlag_AddressSpace64BitDeprecated) { if (out_param->flags & svc::CreateProcessParameterFlag_AddressSpace64Bit36) {
aslr_start = svc::AddressSmallMap36Start; aslr_start = svc::AddressSmallMap36Start;
aslr_size = svc::AddressSmallMap36Size; aslr_size = svc::AddressSmallMap36Size;
} else { } else {
@@ -621,7 +621,7 @@ namespace ams::ldr {
/* Set Create Process output. */ /* Set Create Process output. */
uintptr_t aslr_slide = 0; uintptr_t aslr_slide = 0;
size_t free_size = (aslr_size - total_size); size_t free_size = (aslr_size - total_size);
if (out_param->flags & svc::CreateProcessFlag_EnableAslr) { if (out_param->flags & svc::CreateProcessParameterFlag_EnableAslr) {
aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize; aslr_slide = GenerateSecureRandom(free_size / os::MemoryBlockUnitSize) * os::MemoryBlockUnitSize;
} }
@@ -864,8 +864,8 @@ namespace ams::ldr {
os::ProcessId process_id = os::GetProcessId(info.process_handle); os::ProcessId process_id = os::GetProcessId(info.process_handle);
/* Register new process. */ /* Register new process. */
const auto as_type = GetAddressSpaceType(std::addressof(meta)); const auto as_type = GetProcessAddressSpace(std::addressof(meta));
RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::AddressSpaceType_64Bit || as_type == Npdm::AddressSpaceType_64BitDeprecated); RoManager::GetInstance().RegisterProcess(pin_id, process_id, meta.aci->program_id, as_type == Npdm::ProcessAddressSpace_64Bit39 || as_type == Npdm::ProcessAddressSpace_64Bit36);
/* Register all NSOs. */ /* Register all NSOs. */
for (int i = 0; i < ctx.nso_count; i++) { for (int i = 0; i < ctx.nso_count; i++) {
@@ -86,14 +86,14 @@ namespace ams::pm::impl {
R_ABORT_UNLESS(os::CreateSystemEvent(std::addressof(g_hook_to_create_application_process_event), os::EventClearMode_AutoClear, true)); R_ABORT_UNLESS(os::CreateSystemEvent(std::addressof(g_hook_to_create_application_process_event), os::EventClearMode_AutoClear, true));
} }
inline u32 GetLoaderCreateProcessFlags(u32 launch_flags) { inline u32 GetLoaderCreateProcessParameterFlags(u32 launch_flags) {
u32 ldr_flags = 0; u32 ldr_flags = 0;
if (ShouldSignalOnException(launch_flags) || (hos::GetVersion() >= hos::Version_2_0_0 && !ShouldStartSuspended(launch_flags))) { if (ShouldSignalOnException(launch_flags) || (hos::GetVersion() >= hos::Version_2_0_0 && !ShouldStartSuspended(launch_flags))) {
ldr_flags |= ldr::CreateProcessFlag_EnableDebug; ldr_flags |= ldr::CreateProcessParameterFlag_EnableJitDebug;
} }
if (ShouldDisableAslr(launch_flags)) { if (ShouldDisableAslr(launch_flags)) {
ldr_flags |= ldr::CreateProcessFlag_DisableAslr; ldr_flags |= ldr::CreateProcessParameterFlag_DisableAslr;
} }
return ldr_flags; return ldr_flags;
@@ -166,7 +166,7 @@ namespace ams::pm::impl {
WaitResourceAvailable(std::addressof(program_info)); WaitResourceAvailable(std::addressof(program_info));
/* Actually create the process. */ /* Actually create the process. */
R_TRY(ldr::pm::CreateProcess(std::addressof(process_handle), pin_id, GetLoaderCreateProcessFlags(flags), GetResourceLimitHandle(std::addressof(program_info)), attrs.program_attrs)); R_TRY(ldr::pm::CreateProcess(std::addressof(process_handle), pin_id, GetLoaderCreateProcessParameterFlags(flags), GetResourceLimitHandle(std::addressof(program_info)), attrs.program_attrs));
} }
/* Get the process id. */ /* Get the process id. */