From 7ce051cfb3d21443cec0eedd6f709ee18e030552 Mon Sep 17 00:00:00 2001 From: SDK-Chan Date: Wed, 20 Aug 2025 17:16:13 +0200 Subject: [PATCH] [core] Unstub AliasRegionExtraSize (#260) This implementation is basically usable for up to 8GB of DRAM which you can set in the emulator. It should ensure that the alias or map region for the virtual address space is bigger when requested. 8GB DRAM is the size of Nintendos DRAM sticks in the developers kit. Going above 8GB DRAM while emulating a game is not recommended. That is why this implementation. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/260 Reviewed-by: Shinmegumi Co-authored-by: SDK-Chan Co-committed-by: SDK-Chan --- src/core/hle/kernel/k_page_table_base.h | 14 +++++++++++++ src/core/hle/kernel/k_process_page_table.h | 6 ++++++ src/core/hle/kernel/svc/svc_info.cpp | 23 +++++++++++++++------- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 748419f862..d0921356cf 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -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-License-Identifier: GPL-2.0-or-later @@ -715,6 +718,17 @@ 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 346d7ca083..6890a2d40e 100644 --- a/src/core/hle/kernel/k_process_page_table.h +++ b/src/core/hle/kernel/k_process_page_table.h @@ -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-License-Identifier: GPL-2.0-or-later @@ -410,6 +413,9 @@ public: size_t GetAliasRegionSize() const { return m_page_table.GetAliasRegionSize(); } + size_t GetAliasRegionExtraSize() const { + return m_page_table.CalculateAliasRegionExtraSize(); + } size_t GetStackRegionSize() const { return m_page_table.GetStackRegionSize(); } diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index 1814f5e90e..37f4eba69c 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.cpp @@ -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-License-Identifier: GPL-2.0-or-later @@ -37,8 +40,8 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::TotalNonSystemMemorySize: case InfoType::UsedNonSystemMemorySize: case InfoType::IsApplication: - case InfoType::FreeThreadCount: - case InfoType::AliasRegionExtraSize: { + case InfoType::FreeThreadCount: + case InfoType::AliasRegionExtraSize: { R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue); const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable(); @@ -61,7 +64,6 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::AliasRegionSize: *result = process->GetPageTable().GetAliasRegionSize(); R_SUCCEED(); - case InfoType::HeapRegionAddress: *result = GetInteger(process->GetPageTable().GetHeapRegionStart()); R_SUCCEED(); @@ -135,10 +137,17 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle } R_SUCCEED(); - case InfoType::AliasRegionExtraSize: - // TODO (jarrodnorwell): do this when KIP's NPDM header is finished - R_SUCCEED(); - + case InfoType::AliasRegionExtraSize: { + if (info_sub_id != 0) { + return ResultInvalidCombination; + } + + KProcess* current_process = GetCurrentProcessPointer(system.Kernel()); + *result = current_process->GetPageTable().GetAliasRegionExtraSize(); + + R_SUCCEED(); + } + default: break; }