kern/loader/svc: adopt updated names
This commit is contained in:
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:
|
||||||
|
|||||||
@@ -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. */
|
||||||
|
|||||||
Reference in new issue
Block a user