diff options
| author | 2023-11-17 21:58:29 +0200 | |
|---|---|---|
| committer | 2023-11-25 00:46:15 -0500 | |
| commit | f2a840908380f876a1b5675e9cae281c8db77776 (patch) | |
| tree | 2e8f48f0e20a3033104121c2fb7a8535e4bdc9de | |
| parent | core: Respect memory permissions in Map (diff) | |
| download | yuzu-f2a840908380f876a1b5675e9cae281c8db77776.tar.gz yuzu-f2a840908380f876a1b5675e9cae281c8db77776.tar.xz yuzu-f2a840908380f876a1b5675e9cae281c8db77776.zip | |
kernel: Manually specify aslr region start
| -rw-r--r-- | src/core/hle/kernel/k_page_table_base.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table_base.h | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.h | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process_page_table.h | 9 | ||||
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 2 | ||||
| -rw-r--r-- | src/core/loader/kip.cpp | 3 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 3 |
8 files changed, 25 insertions, 18 deletions
diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index dc6524146..f2ffc39c1 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp | |||
| @@ -184,7 +184,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool | |||
| 184 | KMemoryManager::Pool pool, KProcessAddress code_address, | 184 | KMemoryManager::Pool pool, KProcessAddress code_address, |
| 185 | size_t code_size, KSystemResource* system_resource, | 185 | size_t code_size, KSystemResource* system_resource, |
| 186 | KResourceLimit* resource_limit, | 186 | KResourceLimit* resource_limit, |
| 187 | Core::Memory::Memory& memory) { | 187 | Core::Memory::Memory& memory, |
| 188 | KProcessAddress aslr_space_start) { | ||
| 188 | // Calculate region extents. | 189 | // Calculate region extents. |
| 189 | const size_t as_width = GetAddressSpaceWidth(as_type); | 190 | const size_t as_width = GetAddressSpaceWidth(as_type); |
| 190 | const KProcessAddress start = 0; | 191 | const KProcessAddress start = 0; |
| @@ -225,7 +226,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool | |||
| 225 | heap_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Heap); | 226 | heap_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Heap); |
| 226 | stack_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Stack); | 227 | stack_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Stack); |
| 227 | kernel_map_region_size = GetSpaceSize(KAddressSpaceInfo::Type::MapSmall); | 228 | kernel_map_region_size = GetSpaceSize(KAddressSpaceInfo::Type::MapSmall); |
| 228 | m_code_region_start = GetSpaceStart(KAddressSpaceInfo::Type::Map39Bit); | 229 | m_code_region_start = m_address_space_start + aslr_space_start + |
| 230 | GetSpaceStart(KAddressSpaceInfo::Type::Map39Bit); | ||
| 229 | m_code_region_end = m_code_region_start + GetSpaceSize(KAddressSpaceInfo::Type::Map39Bit); | 231 | m_code_region_end = m_code_region_start + GetSpaceSize(KAddressSpaceInfo::Type::Map39Bit); |
| 230 | m_alias_code_region_start = m_code_region_start; | 232 | m_alias_code_region_start = m_code_region_start; |
| 231 | m_alias_code_region_end = m_code_region_end; | 233 | m_alias_code_region_end = m_code_region_end; |
diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index ee2c41e67..556d230b3 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h | |||
| @@ -235,7 +235,8 @@ public: | |||
| 235 | bool enable_device_address_space_merge, bool from_back, | 235 | bool enable_device_address_space_merge, bool from_back, |
| 236 | KMemoryManager::Pool pool, KProcessAddress code_address, | 236 | KMemoryManager::Pool pool, KProcessAddress code_address, |
| 237 | size_t code_size, KSystemResource* system_resource, | 237 | size_t code_size, KSystemResource* system_resource, |
| 238 | KResourceLimit* resource_limit, Core::Memory::Memory& memory); | 238 | KResourceLimit* resource_limit, Core::Memory::Memory& memory, |
| 239 | KProcessAddress aslr_space_start); | ||
| 239 | 240 | ||
| 240 | void Finalize(); | 241 | void Finalize(); |
| 241 | 242 | ||
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 3cfb414e5..c6a200320 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp | |||
| @@ -300,7 +300,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa | |||
| 300 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); | 300 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); |
| 301 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, | 301 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, |
| 302 | params.code_address, params.code_num_pages * PageSize, | 302 | params.code_address, params.code_num_pages * PageSize, |
| 303 | m_system_resource, res_limit, this->GetMemory())); | 303 | m_system_resource, res_limit, this->GetMemory(), 0)); |
| 304 | } | 304 | } |
| 305 | ON_RESULT_FAILURE_2 { | 305 | ON_RESULT_FAILURE_2 { |
| 306 | m_page_table.Finalize(); | 306 | m_page_table.Finalize(); |
| @@ -332,7 +332,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa | |||
| 332 | 332 | ||
| 333 | Result KProcess::Initialize(const Svc::CreateProcessParameter& params, | 333 | Result KProcess::Initialize(const Svc::CreateProcessParameter& params, |
| 334 | std::span<const u32> user_caps, KResourceLimit* res_limit, | 334 | std::span<const u32> user_caps, KResourceLimit* res_limit, |
| 335 | KMemoryManager::Pool pool) { | 335 | KMemoryManager::Pool pool, KProcessAddress aslr_space_start) { |
| 336 | ASSERT(res_limit != nullptr); | 336 | ASSERT(res_limit != nullptr); |
| 337 | 337 | ||
| 338 | // Set members. | 338 | // Set members. |
| @@ -393,7 +393,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, | |||
| 393 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); | 393 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); |
| 394 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, | 394 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, |
| 395 | params.code_address, code_size, m_system_resource, res_limit, | 395 | params.code_address, code_size, m_system_resource, res_limit, |
| 396 | this->GetMemory())); | 396 | this->GetMemory(), aslr_space_start)); |
| 397 | } | 397 | } |
| 398 | ON_RESULT_FAILURE_2 { | 398 | ON_RESULT_FAILURE_2 { |
| 399 | m_page_table.Finalize(); | 399 | m_page_table.Finalize(); |
| @@ -1128,7 +1128,7 @@ KProcess::KProcess(KernelCore& kernel) | |||
| 1128 | KProcess::~KProcess() = default; | 1128 | KProcess::~KProcess() = default; |
| 1129 | 1129 | ||
| 1130 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, | 1130 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, |
| 1131 | bool is_hbl) { | 1131 | KProcessAddress aslr_space_start, bool is_hbl) { |
| 1132 | // Create a resource limit for the process. | 1132 | // Create a resource limit for the process. |
| 1133 | const auto physical_memory_size = | 1133 | const auto physical_memory_size = |
| 1134 | m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application); | 1134 | m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application); |
| @@ -1179,7 +1179,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | |||
| 1179 | .name = {}, | 1179 | .name = {}, |
| 1180 | .version = {}, | 1180 | .version = {}, |
| 1181 | .program_id = metadata.GetTitleID(), | 1181 | .program_id = metadata.GetTitleID(), |
| 1182 | .code_address = code_address, | 1182 | .code_address = code_address + GetInteger(aslr_space_start), |
| 1183 | .code_num_pages = static_cast<s32>(code_size / PageSize), | 1183 | .code_num_pages = static_cast<s32>(code_size / PageSize), |
| 1184 | .flags = flag, | 1184 | .flags = flag, |
| 1185 | .reslimit = Svc::InvalidHandle, | 1185 | .reslimit = Svc::InvalidHandle, |
| @@ -1193,7 +1193,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | |||
| 1193 | 1193 | ||
| 1194 | // Initialize for application process. | 1194 | // Initialize for application process. |
| 1195 | R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit, | 1195 | R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit, |
| 1196 | KMemoryManager::Pool::Application)); | 1196 | KMemoryManager::Pool::Application, aslr_space_start)); |
| 1197 | 1197 | ||
| 1198 | // Assign remaining properties. | 1198 | // Assign remaining properties. |
| 1199 | m_is_hbl = is_hbl; | 1199 | m_is_hbl = is_hbl; |
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index 8339465fd..54b8e0a59 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h | |||
| @@ -150,7 +150,8 @@ public: | |||
| 150 | std::span<const u32> caps, KResourceLimit* res_limit, | 150 | std::span<const u32> caps, KResourceLimit* res_limit, |
| 151 | KMemoryManager::Pool pool, bool immortal); | 151 | KMemoryManager::Pool pool, bool immortal); |
| 152 | Result Initialize(const Svc::CreateProcessParameter& params, std::span<const u32> user_caps, | 152 | Result Initialize(const Svc::CreateProcessParameter& params, std::span<const u32> user_caps, |
| 153 | KResourceLimit* res_limit, KMemoryManager::Pool pool); | 153 | KResourceLimit* res_limit, KMemoryManager::Pool pool, |
| 154 | KProcessAddress aslr_space_start); | ||
| 154 | void Exit(); | 155 | void Exit(); |
| 155 | 156 | ||
| 156 | const char* GetName() const { | 157 | const char* GetName() const { |
| @@ -479,7 +480,7 @@ public: | |||
| 479 | 480 | ||
| 480 | public: | 481 | public: |
| 481 | Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, | 482 | Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, |
| 482 | bool is_hbl); | 483 | KProcessAddress aslr_space_start, bool is_hbl); |
| 483 | 484 | ||
| 484 | void LoadModule(CodeSet code_set, KProcessAddress base_addr); | 485 | void LoadModule(CodeSet code_set, KProcessAddress base_addr); |
| 485 | 486 | ||
diff --git a/src/core/hle/kernel/k_process_page_table.h b/src/core/hle/kernel/k_process_page_table.h index b7ae5abd0..9e40f68bc 100644 --- a/src/core/hle/kernel/k_process_page_table.h +++ b/src/core/hle/kernel/k_process_page_table.h | |||
| @@ -23,10 +23,11 @@ public: | |||
| 23 | Result Initialize(Svc::CreateProcessFlag as_type, bool enable_aslr, bool enable_das_merge, | 23 | Result Initialize(Svc::CreateProcessFlag as_type, bool enable_aslr, bool enable_das_merge, |
| 24 | bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, | 24 | bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address, |
| 25 | size_t code_size, KSystemResource* system_resource, | 25 | size_t code_size, KSystemResource* system_resource, |
| 26 | KResourceLimit* resource_limit, Core::Memory::Memory& memory) { | 26 | KResourceLimit* resource_limit, Core::Memory::Memory& memory, |
| 27 | R_RETURN(m_page_table.InitializeForProcess(as_type, enable_aslr, enable_das_merge, | 27 | KProcessAddress aslr_space_start) { |
| 28 | from_back, pool, code_address, code_size, | 28 | R_RETURN(m_page_table.InitializeForProcess( |
| 29 | system_resource, resource_limit, memory)); | 29 | as_type, enable_aslr, enable_das_merge, from_back, pool, code_address, code_size, |
| 30 | system_resource, resource_limit, memory, aslr_space_start)); | ||
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | void Finalize() { | 33 | void Finalize() { |
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 5c36b71e5..48c0edaea 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp | |||
| @@ -147,7 +147,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect | |||
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | // Setup the process code layout | 149 | // Setup the process code layout |
| 150 | if (process.LoadFromMetadata(metadata, code_size, is_hbl).IsError()) { | 150 | if (process.LoadFromMetadata(metadata, code_size, 0, is_hbl).IsError()) { |
| 151 | return {ResultStatus::ErrorUnableToParseKernelMetadata, {}}; | 151 | return {ResultStatus::ErrorUnableToParseKernelMetadata, {}}; |
| 152 | } | 152 | } |
| 153 | 153 | ||
diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index bf56a08b4..cd6982921 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp | |||
| @@ -91,7 +91,8 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process, | |||
| 91 | 91 | ||
| 92 | // Setup the process code layout | 92 | // Setup the process code layout |
| 93 | if (process | 93 | if (process |
| 94 | .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false) | 94 | .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0, |
| 95 | false) | ||
| 95 | .IsError()) { | 96 | .IsError()) { |
| 96 | return {ResultStatus::ErrorNotInitialized, {}}; | 97 | return {ResultStatus::ErrorNotInitialized, {}}; |
| 97 | } | 98 | } |
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 69f1a54ed..dfed296a5 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -197,7 +197,8 @@ static bool LoadNroImpl(Kernel::KProcess& process, const std::vector<u8>& data) | |||
| 197 | 197 | ||
| 198 | // Setup the process code layout | 198 | // Setup the process code layout |
| 199 | if (process | 199 | if (process |
| 200 | .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false) | 200 | .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0, |
| 201 | false) | ||
| 201 | .IsError()) { | 202 | .IsError()) { |
| 202 | return false; | 203 | return false; |
| 203 | } | 204 | } |