|
|
|
@ -28,9 +28,6 @@ namespace Kernel { |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
// TODO: Remove this workaround when proper ASLR is implemented for all address spaces.
|
|
|
|
constexpr u64 CodeStartOffset = 0x500000UL; |
|
|
|
|
|
|
|
Result TerminateChildren(KernelCore& kernel, KProcess* process, |
|
|
|
const KThread* thread_to_not_terminate) { |
|
|
|
// Request that all children threads terminate.
|
|
|
|
@ -1157,7 +1154,7 @@ KProcess::KProcess(KernelCore& kernel) |
|
|
|
KProcess::~KProcess() = default; |
|
|
|
|
|
|
|
Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, |
|
|
|
KProcessAddress aslr_space_start, bool is_hbl) { |
|
|
|
KProcessAddress aslr_space_start, size_t aslr_space_offset, bool is_hbl) { |
|
|
|
// Create a resource limit for the process.
|
|
|
|
const auto pool = static_cast<KMemoryManager::Pool>(metadata.GetPoolPartition()); |
|
|
|
const auto physical_memory_size = m_kernel.MemoryManager().GetSize(pool); |
|
|
|
@ -1187,25 +1184,24 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: |
|
|
|
// Set the address space type and code address.
|
|
|
|
switch (metadata.GetAddressSpaceType()) { |
|
|
|
case FileSys::ProgramAddressSpaceType::Is39Bit: |
|
|
|
flag |= Svc::CreateProcessFlag::AddressSpace64Bit; |
|
|
|
|
|
|
|
// For 39-bit processes, the ASLR region starts at 0x800'0000 and is ~512GiB large.
|
|
|
|
// However, some (buggy) programs/libraries like skyline incorrectly depend on the
|
|
|
|
// existence of ASLR pages before the entry point, so we will adjust the load address
|
|
|
|
// to point to about 2GiB into the ASLR region.
|
|
|
|
code_address = 0x8000'0000; |
|
|
|
flag |= Svc::CreateProcessFlag::AddressSpace64Bit; |
|
|
|
code_address = 0x8000'0000 + aslr_space_offset; |
|
|
|
break; |
|
|
|
case FileSys::ProgramAddressSpaceType::Is36Bit: |
|
|
|
flag |= Svc::CreateProcessFlag::AddressSpace64BitDeprecated; |
|
|
|
code_address = 0x800'0000; |
|
|
|
code_address = 0x800'0000 + aslr_space_offset; |
|
|
|
break; |
|
|
|
case FileSys::ProgramAddressSpaceType::Is32Bit: |
|
|
|
flag |= Svc::CreateProcessFlag::AddressSpace32Bit; |
|
|
|
code_address = 0x20'0000 + CodeStartOffset; |
|
|
|
code_address = 0x20'0000 + aslr_space_offset; |
|
|
|
break; |
|
|
|
case FileSys::ProgramAddressSpaceType::Is32BitNoMap: |
|
|
|
flag |= Svc::CreateProcessFlag::AddressSpace32BitWithoutAlias; |
|
|
|
code_address = 0x20'0000 + CodeStartOffset; |
|
|
|
code_address = 0x20'0000 + aslr_space_offset; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
|