summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Liam2023-11-17 21:58:29 +0200
committerGravatar t8952023-11-25 00:46:15 -0500
commitf2a840908380f876a1b5675e9cae281c8db77776 (patch)
tree2e8f48f0e20a3033104121c2fb7a8535e4bdc9de
parentcore: Respect memory permissions in Map (diff)
downloadyuzu-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.cpp6
-rw-r--r--src/core/hle/kernel/k_page_table_base.h3
-rw-r--r--src/core/hle/kernel/k_process.cpp12
-rw-r--r--src/core/hle/kernel/k_process.h5
-rw-r--r--src/core/hle/kernel/k_process_page_table.h9
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp2
-rw-r--r--src/core/loader/kip.cpp3
-rw-r--r--src/core/loader/nro.cpp3
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
333Result KProcess::Initialize(const Svc::CreateProcessParameter& params, 333Result 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)
1128KProcess::~KProcess() = default; 1128KProcess::~KProcess() = default;
1129 1129
1130Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, 1130Result 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
480public: 481public:
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 }