mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	kernel: Manually specify aslr region start
This commit is contained in:
		
							parent
							
								
									5938a9582a
								
							
						
					
					
						commit
						f2a8409083
					
				@ -184,7 +184,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
 | 
			
		||||
                                            KMemoryManager::Pool pool, KProcessAddress code_address,
 | 
			
		||||
                                            size_t code_size, KSystemResource* system_resource,
 | 
			
		||||
                                            KResourceLimit* resource_limit,
 | 
			
		||||
                                            Core::Memory::Memory& memory) {
 | 
			
		||||
                                            Core::Memory::Memory& memory,
 | 
			
		||||
                                            KProcessAddress aslr_space_start) {
 | 
			
		||||
    // Calculate region extents.
 | 
			
		||||
    const size_t as_width = GetAddressSpaceWidth(as_type);
 | 
			
		||||
    const KProcessAddress start = 0;
 | 
			
		||||
@ -225,7 +226,8 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
 | 
			
		||||
        heap_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Heap);
 | 
			
		||||
        stack_region_size = GetSpaceSize(KAddressSpaceInfo::Type::Stack);
 | 
			
		||||
        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_alias_code_region_start = m_code_region_start;
 | 
			
		||||
        m_alias_code_region_end = m_code_region_end;
 | 
			
		||||
 | 
			
		||||
@ -235,7 +235,8 @@ public:
 | 
			
		||||
                                bool enable_device_address_space_merge, bool from_back,
 | 
			
		||||
                                KMemoryManager::Pool pool, KProcessAddress code_address,
 | 
			
		||||
                                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();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -300,7 +300,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa
 | 
			
		||||
            False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
 | 
			
		||||
        R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool,
 | 
			
		||||
                                      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 {
 | 
			
		||||
        m_page_table.Finalize();
 | 
			
		||||
@ -332,7 +332,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa
 | 
			
		||||
 | 
			
		||||
Result KProcess::Initialize(const Svc::CreateProcessParameter& params,
 | 
			
		||||
                            std::span<const u32> user_caps, KResourceLimit* res_limit,
 | 
			
		||||
                            KMemoryManager::Pool pool) {
 | 
			
		||||
                            KMemoryManager::Pool pool, KProcessAddress aslr_space_start) {
 | 
			
		||||
    ASSERT(res_limit != nullptr);
 | 
			
		||||
 | 
			
		||||
    // Set members.
 | 
			
		||||
@ -393,7 +393,7 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params,
 | 
			
		||||
            False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge);
 | 
			
		||||
        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,
 | 
			
		||||
                                      this->GetMemory()));
 | 
			
		||||
                                      this->GetMemory(), aslr_space_start));
 | 
			
		||||
    }
 | 
			
		||||
    ON_RESULT_FAILURE_2 {
 | 
			
		||||
        m_page_table.Finalize();
 | 
			
		||||
@ -1128,7 +1128,7 @@ KProcess::KProcess(KernelCore& kernel)
 | 
			
		||||
KProcess::~KProcess() = default;
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
    const auto physical_memory_size =
 | 
			
		||||
        m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application);
 | 
			
		||||
@ -1179,7 +1179,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
 | 
			
		||||
        .name = {},
 | 
			
		||||
        .version = {},
 | 
			
		||||
        .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),
 | 
			
		||||
        .flags = flag,
 | 
			
		||||
        .reslimit = Svc::InvalidHandle,
 | 
			
		||||
@ -1193,7 +1193,7 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
 | 
			
		||||
 | 
			
		||||
    // Initialize for application process.
 | 
			
		||||
    R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit,
 | 
			
		||||
                           KMemoryManager::Pool::Application));
 | 
			
		||||
                           KMemoryManager::Pool::Application, aslr_space_start));
 | 
			
		||||
 | 
			
		||||
    // Assign remaining properties.
 | 
			
		||||
    m_is_hbl = is_hbl;
 | 
			
		||||
 | 
			
		||||
@ -150,7 +150,8 @@ public:
 | 
			
		||||
                      std::span<const u32> caps, KResourceLimit* res_limit,
 | 
			
		||||
                      KMemoryManager::Pool pool, bool immortal);
 | 
			
		||||
    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();
 | 
			
		||||
 | 
			
		||||
    const char* GetName() const {
 | 
			
		||||
@ -479,7 +480,7 @@ public:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,10 +23,11 @@ public:
 | 
			
		||||
    Result Initialize(Svc::CreateProcessFlag as_type, bool enable_aslr, bool enable_das_merge,
 | 
			
		||||
                      bool from_back, KMemoryManager::Pool pool, KProcessAddress code_address,
 | 
			
		||||
                      size_t code_size, KSystemResource* system_resource,
 | 
			
		||||
                      KResourceLimit* resource_limit, Core::Memory::Memory& memory) {
 | 
			
		||||
        R_RETURN(m_page_table.InitializeForProcess(as_type, enable_aslr, enable_das_merge,
 | 
			
		||||
                                                   from_back, pool, code_address, code_size,
 | 
			
		||||
                                                   system_resource, resource_limit, memory));
 | 
			
		||||
                      KResourceLimit* resource_limit, Core::Memory::Memory& memory,
 | 
			
		||||
                      KProcessAddress aslr_space_start) {
 | 
			
		||||
        R_RETURN(m_page_table.InitializeForProcess(
 | 
			
		||||
            as_type, enable_aslr, enable_das_merge, from_back, pool, code_address, code_size,
 | 
			
		||||
            system_resource, resource_limit, memory, aslr_space_start));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Finalize() {
 | 
			
		||||
 | 
			
		||||
@ -147,7 +147,7 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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, {}};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -91,7 +91,8 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process,
 | 
			
		||||
 | 
			
		||||
    // Setup the process code layout
 | 
			
		||||
    if (process
 | 
			
		||||
            .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false)
 | 
			
		||||
            .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0,
 | 
			
		||||
                              false)
 | 
			
		||||
            .IsError()) {
 | 
			
		||||
        return {ResultStatus::ErrorNotInitialized, {}};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -197,7 +197,8 @@ static bool LoadNroImpl(Kernel::KProcess& process, const std::vector<u8>& data)
 | 
			
		||||
 | 
			
		||||
    // Setup the process code layout
 | 
			
		||||
    if (process
 | 
			
		||||
            .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), false)
 | 
			
		||||
            .LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size(), 0,
 | 
			
		||||
                              false)
 | 
			
		||||
            .IsError()) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user