[core] Finalize AliasRegionExtraSize #291

Merged
CamilleLaVey merged 4 commits from finalize-aliasRegionExtraSize into master 2025-08-21 21:08:44 +02:00
4 changed files with 35 additions and 14 deletions

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -290,6 +293,23 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
alloc_start = process_code_end; alloc_start = process_code_end;
alloc_size = GetInteger(end) - GetInteger(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)
!= Svc::CreateProcessFlag{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 = const size_t needed_size =
(alias_region_size + heap_region_size + stack_region_size + kernel_map_region_size); (alias_region_size + heap_region_size + stack_region_size + kernel_map_region_size);
R_UNLESS(alloc_size >= needed_size, ResultOutOfMemory); R_UNLESS(alloc_size >= needed_size, ResultOutOfMemory);

View file

@ -211,6 +211,7 @@ private:
size_t m_mapped_unsafe_physical_memory{}; size_t m_mapped_unsafe_physical_memory{};
size_t m_mapped_insecure_memory{}; size_t m_mapped_insecure_memory{};
size_t m_mapped_ipc_server_memory{}; size_t m_mapped_ipc_server_memory{};
size_t m_alias_region_extra_size{};
mutable KLightLock m_general_lock; mutable KLightLock m_general_lock;
mutable KLightLock m_map_physical_memory_lock; mutable KLightLock m_map_physical_memory_lock;
KLightLock m_device_map_lock; KLightLock m_device_map_lock;
@ -698,6 +699,10 @@ public:
return m_alias_code_region_end - m_alias_code_region_start; 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 { size_t GetNormalMemorySize() const {
// Lock the table. // Lock the table.
KScopedLightLock lk(m_general_lock); KScopedLightLock lk(m_general_lock);
@ -718,17 +723,6 @@ public:
return m_address_space_width; 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: public:
// Linear mapped // Linear mapped
static u8* GetLinearMappedVirtualPointer(KernelCore& kernel, KPhysicalAddress addr) { static u8* GetLinearMappedVirtualPointer(KernelCore& kernel, KPhysicalAddress addr) {

View file

@ -414,7 +414,7 @@ public:
return m_page_table.GetAliasRegionSize(); return m_page_table.GetAliasRegionSize();
} }
size_t GetAliasRegionExtraSize() const { size_t GetAliasRegionExtraSize() const {
return m_page_table.CalculateAliasRegionExtraSize(); return m_page_table.GetAliasRegionExtraSize();
} }
size_t GetStackRegionSize() const { size_t GetStackRegionSize() const {
return m_page_table.GetStackRegionSize(); return m_page_table.GetStackRegionSize();

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -153,7 +156,7 @@ enum class InfoType : u32 {
ThreadTickCount = 25, ThreadTickCount = 25,
IsSvcPermitted = 26, IsSvcPermitted = 26,
IoRegionHint = 27, IoRegionHint = 27,
AliasRegionExtraSize = 28, AliasRegionExtraSize = 28,
MesosphereMeta = 65000, MesosphereMeta = 65000,
MesosphereCurrentProcess = 65001, MesosphereCurrentProcess = 65001,
@ -643,9 +646,13 @@ enum class CreateProcessFlag : u32 {
// 11.x+ DisableDeviceAddressSpaceMerge. // 11.x+ DisableDeviceAddressSpaceMerge.
DisableDeviceAddressSpaceMerge = (1 << 12), DisableDeviceAddressSpaceMerge = (1 << 12),
// 18.x+ Add extra size to the already available AliasRegionSize
EnableAliasRegionExtraSize = (1 << 13),
// Mask of all flags. // Mask of all flags.
All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication | All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication |
PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge, PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge |
EnableAliasRegionExtraSize,
}; };
DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag); DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag);