kernel: Manually specify aslr region start
This commit is contained in:
parent
5938a9582a
commit
f2a8409083
8 changed files with 25 additions and 18 deletions
|
@ -184,7 +184,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
|
||||||
KMemoryManager::Pool pool, KProcessAddress code_address,
|
KMemoryManager::Pool pool, KProcessAddress code_address,
|
||||||
size_t code_size, KSystemResource* system_resource,
|
size_t code_size, KSystemResource* system_resource,
|
||||||
KResourceLimit* resource_limit,
|
KResourceLimit* resource_limit,
|
||||||
Core::Memory::Memory& memory) {
|
Core::Memory::Memory& memory,
|
||||||
|
KProcessAddress aslr_space_start) {
|
||||||
// Calculate region extents.
|
// Calculate region extents.
|
||||||
const size_t as_width = GetAddressSpaceWidth(as_type);
|
const size_t as_width = GetAddressSpaceWidth(as_type);
|
||||||
const KProcessAddress start = 0;
|
const KProcessAddress start = 0;
|
||||||
|
@ -225,7 +226,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
|
||||||
heap_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Heap);
|
heap_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Heap);
|
||||||
stack_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Stack);
|
stack_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Stack);
|
||||||
kernel_map_region_size = GetSpaceSize(KAddressSpaceInfo::Type::MapSmall);
|
kernel_map_region_size = GetSpaceSize(KAddressSpaceInfo::Type::MapSmall);
|
||||||
m_code_region_start = GetSpaceStart(KAddressSpaceInfo::Type::Map39Bit);
|
m_code_region_start = m_address_space_start + aslr_space_start +
|
||||||
|
GetSpaceStart(KAddressSpaceInfo::Type::Map39Bit);
|
||||||
m_code_region_end = m_code_region_start + GetSpaceSize(KAddressSpaceInfo::Type::Map39Bit);
|
m_code_region_end = m_code_region_start + GetSpaceSize(KAddressSpaceInfo::Type::Map39Bit);
|
||||||
m_alias_code_region_start = m_code_region_start;
|
m_alias_code_region_start = m_code_region_start;
|
||||||
m_alias_code_region_end = m_code_region_end;
|
m_alias_code_region_end = m_code_region_end;
|
||||||
|
|
|
@ -235,7 +235,8 @@ public:
|
||||||
bool enable_device_address_space_merge, bool from_back,
|
bool enable_device_address_space_merge, bool from_back,
|
||||||
KMemoryManager::Pool pool, KProcessAddress code_address,
|
KMemoryManager::Pool pool, KProcessAddress code_address,
|
||||||
size_t code_size, KSystemResource* system_resource,
|
size_t code_size, KSystemResource* system_resource,
|
||||||
KResourceLimit* resource_limit, Core::Memory::Memory& memory);
|
KResourceLimit* resource_limit, Core::Memory::Memory& memory,
|
||||||
|
KProcessAddress aslr_space_start);
|
||||||
|
|
||||||
void Finalize();
|
void Finalize();
|
||||||
|
|
||||||
|
|
|
@ -300,7 +300,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa
|
||||||
False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
|
False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
|
||||||
R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool,
|
R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool,
|
||||||
params.code_address, params.code_num_pages * PageSize,
|
params.code_address, params.code_num_pages * PageSize,
|
||||||
m_system_resource, res_limit, this->GetMemory()));
|
m_system_resource, res_limit, this->GetMemory(), 0));
|
||||||
}
|
}
|
||||||
ON_RESULT_FAILURE_2 {
|
ON_RESULT_FAILURE_2 {
|
||||||
m_page_table.Finalize();
|
m_page_table.Finalize();
|
||||||
|
@ -332,7 +332,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa
|
||||||
|
|
||||||
Result KProcess::Initialize(const Svc::CreateProcessParameter& params,
|
Result KProcess::Initialize(const Svc::CreateProcessParameter& params,
|
||||||
std::span<const u32> user_caps, KResourceLimit* res_limit,
|
std::span<const u32> user_caps, KResourceLimit* res_limit,
|
||||||
KMemoryManager::Pool pool) {
|
KMemoryManager::Pool pool, KProcessAddress aslr_space_start) {
|
||||||
ASSERT(res_limit != nullptr);
|
ASSERT(res_limit != nullptr);
|
||||||
|
|
||||||
// Set members.
|
// Set members.
|
||||||
|
@ -393,7 +393,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params,
|
||||||
False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
|
False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
|
||||||
R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool,
|
R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool,
|
||||||
params.code_address, code_size, m_system_resource, res_limit,
|
params.code_address, code_size, m_system_resource, res_limit,
|
||||||
this->GetMemory()));
|
this->GetMemory(), aslr_space_start));
|
||||||
}
|
}
|
||||||
ON_RESULT_FAILURE_2 {
|
ON_RESULT_FAILURE_2 {
|
||||||
m_page_table.Finalize();
|
m_page_table.Finalize();
|
||||||
|
@ -1128,7 +1128,7 @@ KProcess::KProcess(KernelCore& kernel)
|
||||||
KProcess::~KProcess() = default;
|
KProcess::~KProcess() = default;
|
||||||
|
|
||||||
Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
||||||
bool is_hbl) {
|
KProcessAddress aslr_space_start, bool is_hbl) {
|
||||||
// Create a resource limit for the process.
|
// Create a resource limit for the process.
|
||||||
const auto physical_memory_size =
|
const auto physical_memory_size =
|
||||||
m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application);
|
m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application);
|
||||||
|
@ -1179,7 +1179,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
|
||||||
.name = {},
|
.name = {},
|
||||||
.version = {},
|
.version = {},
|
||||||
.program_id = metadata.GetTitleID(),
|
.program_id = metadata.GetTitleID(),
|
||||||
.code_address = code_address,
|
.code_address = code_address + GetInteger(aslr_space_start),
|
||||||
.code_num_pages = static_cast<s32>(code_size / PageSize),
|
.code_num_pages = static_cast<s32>(code_size / PageSize),
|
||||||
.flags = flag,
|
.flags = flag,
|
||||||
.reslimit = Svc::InvalidHandle,
|
.reslimit = Svc::InvalidHandle,
|
||||||
|
@ -1193,7 +1193,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
|
||||||
|
|
||||||
// Initialize for application process.
|
// Initialize for application process.
|
||||||
R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit,
|
R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit,
|
||||||
KMemoryManager::Pool::Application));
|
KMemoryManager::Pool::Application, aslr_space_start));
|
||||||
|
|
||||||
// Assign remaining properties.
|
// Assign remaining properties.
|
||||||
m_is_hbl = is_hbl;
|
m_is_hbl = is_hbl;
|
||||||
|
|
|
@ -150,7 +150,8 @@ public:
|
||||||
std::span<const u32> caps, KResourceLimit* res_limit,
|
std::span<const u32> caps, KResourceLimit* res_limit,
|
||||||
KMemoryManager::Pool pool, bool immortal);
|
KMemoryManager::Pool pool, bool immortal);
|
||||||
Result Initialize(const Svc::CreateProcessParameter& params, std::span<const u32> user_caps,
|
Result Initialize(const Svc::CreateProcessParameter& params, std::span<const u32> user_caps,
|
||||||
KResourceLimit* res_limit, KMemoryManager::Pool pool);
|
KResourceLimit* res_limit, KMemoryManager::Pool pool,
|
||||||
|
KProcessAddress aslr_space_start);
|
||||||
void Exit();
|
void Exit();
|
||||||
|
|
||||||
const char* GetName() const {
|
const char* GetName() const {
|
||||||
|
@ -479,7 +480,7 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
Result LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size,
|
||||||
bool is_hbl);
|
KProcessAddress aslr_space_start, bool is_hbl);
|
||||||
|
|
||||||
void LoadModule(CodeSet code_set, KProcessAddress base_addr);
|
void LoadModule(CodeSet code_set, KProcessAddress base_addr);
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,11 @@ public:
|
||||||
Result Initialize(Svc::CreateProcessFlag as_type, bool enable_aslr, bool enable_das_merge,
|
Result Initialize(Svc::CreateProcessFlag as_type, bool enable_aslr, bool enable_das_merge,
|
||||||
bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address,
|
bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address,
|
||||||
size_t code_size, KSystemResource* system_resource,
|
size_t code_size, KSystemResource* system_resource,
|
||||||
KResourceLimit* resource_limit, Core::Memory::Memory& memory) {
|
KResourceLimit* resource_limit, Core::Memory::Memory& memory,
|
||||||
R_RETURN(m_page_table.InitializeForProcess(as_type, enable_aslr, enable_das_merge,
|
KProcessAddress aslr_space_start) {
|
||||||
from_back, pool, code_address, code_size,
|
R_RETURN(m_page_table.InitializeForProcess(
|
||||||
system_resource, resource_limit, memory));
|
as_type, enable_aslr, enable_das_merge, from_back, pool, code_address, code_size,
|
||||||
|
system_resource, resource_limit, memory, aslr_space_start));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Finalize() {
|
void Finalize() {
|
||||||
|
|
|
@ -147,7 +147,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the process code layout
|
// Setup the process code layout
|
||||||
if (process.LoadFromMetadata(metadata, code_size, is_hbl).IsError()) {
|
if (process.LoadFromMetadata(metadata, code_size, 0, is_hbl).IsError()) {
|
||||||
return {ResultStatus::ErrorUnableToParseKernelMetadata, {}};
|
return {ResultStatus::ErrorUnableToParseKernelMetadata, {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,8 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process,
|
||||||
|
|
||||||
// Setup the process code layout
|
// Setup the process code layout
|
||||||
if (process
|
if (process
|
||||||
.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false)
|
.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0,
|
||||||
|
false)
|
||||||
.IsError()) {
|
.IsError()) {
|
||||||
return {ResultStatus::ErrorNotInitialized, {}};
|
return {ResultStatus::ErrorNotInitialized, {}};
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,7 +197,8 @@ static bool LoadNroImpl(Kernel::KProcess& process, const std::vector<u8>& data)
|
||||||
|
|
||||||
// Setup the process code layout
|
// Setup the process code layout
|
||||||
if (process
|
if (process
|
||||||
.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false)
|
.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0,
|
||||||
|
false)
|
||||||
.IsError()) {
|
.IsError()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue