From ddf69464149d0e750249b0e83f8fe4fe018d2b2d Mon Sep 17 00:00:00 2001 From: SDK Chan Date: Thu, 21 Aug 2025 12:30:20 +0000 Subject: [PATCH] [core] Finalize AliasRegionExtraSize --- src/core/hle/kernel/k_page_table_base.cpp | 17 +++++++++++++++++ src/core/hle/kernel/k_page_table_base.h | 16 +++++----------- src/core/hle/kernel/k_process_page_table.h | 2 +- src/core/hle/kernel/svc_types.h | 8 ++++++-- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 19cdf4f3ac..ea4d3d67ad 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -290,6 +290,23 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool alloc_start = process_code_end; alloc_size = GetInteger(end) - GetInteger(process_code_end); } + + // FW 18+: Apply extra region size calculations for already available region size + const auto as_mask = Svc::CreateProcessFlag::AddressSpaceMask; + const bool is_64bit_as = (as_type & as_mask) == Svc::CreateProcessFlag::AddressSpace64Bit; + + if (is_64bit_as && (as_type & Svc::CreateProcessFlag::EnableAliasRegionExtraSize) + != static_cast(0) && alias_region_size) { + const size_t address_space_size = (GetInteger(end) - GetInteger(start)); + + // Same as address_space_size/8 but faster due to bit shifting operation + const size_t alias_region_extra_size = address_space_size >> 3; + alias_region_size += alias_region_extra_size; + + // Store for later processing + m_alias_region_extra_size = alias_region_extra_size; + } + const size_t needed_size = (alias_region_size + heap_region_size + stack_region_size + kernel_map_region_size); R_UNLESS(alloc_size >= needed_size, ResultOutOfMemory); diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index d0921356cf..fc5d3876c7 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -211,6 +211,7 @@ private: size_t m_mapped_unsafe_physical_memory{}; size_t m_mapped_insecure_memory{}; size_t m_mapped_ipc_server_memory{}; + size_t m_alias_region_extra_size{}; mutable KLightLock m_general_lock; mutable KLightLock m_map_physical_memory_lock; KLightLock m_device_map_lock; @@ -698,6 +699,10 @@ public: return m_alias_code_region_end - m_alias_code_region_start; } + size_t GetAliasRegionExtraSize() const { + return m_alias_region_extra_size; + } + size_t GetNormalMemorySize() const { // Lock the table. KScopedLightLock lk(m_general_lock); @@ -718,17 +723,6 @@ public: return m_address_space_width; } - size_t CalculateAliasRegionExtraSize() const { - const size_t baseline = 64ull << 30; // Mostly appropriate for DRAM values <= 8GB - const size_t region = GetAliasRegionSize(); - - if (region > baseline) { - return region - baseline; - } - - return 0; - } - public: // Linear mapped static u8* GetLinearMappedVirtualPointer(KernelCore& kernel, KPhysicalAddress addr) { diff --git a/src/core/hle/kernel/k_process_page_table.h b/src/core/hle/kernel/k_process_page_table.h index 6890a2d40e..0601f9f6d8 100644 --- a/src/core/hle/kernel/k_process_page_table.h +++ b/src/core/hle/kernel/k_process_page_table.h @@ -414,7 +414,7 @@ public: return m_page_table.GetAliasRegionSize(); } size_t GetAliasRegionExtraSize() const { - return m_page_table.CalculateAliasRegionExtraSize(); + return m_page_table.GetAliasRegionExtraSize(); } size_t GetStackRegionSize() const { return m_page_table.GetStackRegionSize(); diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h index d02548ba73..5e573df5da 100644 --- a/src/core/hle/kernel/svc_types.h +++ b/src/core/hle/kernel/svc_types.h @@ -153,7 +153,7 @@ enum class InfoType : u32 { ThreadTickCount = 25, IsSvcPermitted = 26, IoRegionHint = 27, - AliasRegionExtraSize = 28, + AliasRegionExtraSize = 28, MesosphereMeta = 65000, MesosphereCurrentProcess = 65001, @@ -643,9 +643,13 @@ enum class CreateProcessFlag : u32 { // 11.x+ DisableDeviceAddressSpaceMerge. DisableDeviceAddressSpaceMerge = (1 << 12), + // 18.x+ Add extra size to the already available AliasRegionSize + EnableAliasRegionExtraSize = (1 << 13), + // Mask of all flags. All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication | - PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge, + PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge | + EnableAliasRegionExtraSize, }; DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag);