From 74011bbb458a7d3fb61fb464f79626d228d17ca7 Mon Sep 17 00:00:00 2001 From: KeatonTheBot Date: Thu, 25 Dec 2025 02:20:33 -0600 Subject: [PATCH] Heap adjustments/fixes * Restore 6 GiB heap for 4 GiB DRAM selection * Limit heap to 8 GiB for games that crash or won't load with extended heaps --- .../HOS/Kernel/Memory/KPageTableBase.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index e39ba09ae..080aa3c88 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -8,6 +8,7 @@ using System; using System.Buffers; using System.Collections.Generic; using System.Diagnostics; +using static Ryujinx.Graphics.Gpu.GraphicsConfig; namespace Ryujinx.HLE.HOS.Kernel.Memory { @@ -183,6 +184,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory AliasRegionExtraSize = 0; + // Limit heap for games that crash or won't load with extended heaps + bool isHeapLimited = TitleId is "0100965017338000" or "010038b015560000"; + switch (flags & ProcessCreationFlags.AddressSpaceMask) { case ProcessCreationFlags.AddressSpace32Bit: @@ -201,11 +205,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory case ProcessCreationFlags.AddressSpace64BitDeprecated: aliasRegion.Size = 0x180000000; heapRegion.Size = memConfig switch { - MemoryConfiguration.MemoryConfiguration6GiB => 0x180000000u, MemoryConfiguration.MemoryConfiguration8GiB => 0x200000000u, - MemoryConfiguration.MemoryConfiguration10GiB => 0x280000000u, - MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u, - _ => 0x100000000u + MemoryConfiguration.MemoryConfiguration10GiB when !isHeapLimited => 0x280000000u, + MemoryConfiguration.MemoryConfiguration12GiB when !isHeapLimited => 0x300000000u, + _ => 0x180000000u }; stackRegion.Size = 0; tlsIoRegion.Size = 0; @@ -238,11 +241,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory aliasRegion.Size = reservedAddressSpaceSize >= 0x1800000000 ? 0x1000000000 : 1UL << (addressSpaceWidth - 3); heapRegion.Size = memConfig switch { - MemoryConfiguration.MemoryConfiguration6GiB => 0x180000000u, MemoryConfiguration.MemoryConfiguration8GiB => 0x200000000u, - MemoryConfiguration.MemoryConfiguration10GiB => 0x280000000u, - MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u, - _ => 0x100000000u + MemoryConfiguration.MemoryConfiguration10GiB when !isHeapLimited => 0x280000000u, + MemoryConfiguration.MemoryConfiguration12GiB when !isHeapLimited => 0x300000000u, + _ => 0x180000000u }; stackRegion.Size = 1UL << (addressSpaceWidth - 8); tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3); @@ -258,11 +260,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { aliasRegion.Size = 0x1000000000; heapRegion.Size = memConfig switch { - MemoryConfiguration.MemoryConfiguration6GiB => 0x180000000u, MemoryConfiguration.MemoryConfiguration8GiB => 0x200000000u, - MemoryConfiguration.MemoryConfiguration10GiB => 0x280000000u, - MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u, - _ => 0x100000000u + MemoryConfiguration.MemoryConfiguration10GiB when !isHeapLimited => 0x280000000u, + MemoryConfiguration.MemoryConfiguration12GiB when !isHeapLimited => 0x300000000u, + _ => 0x180000000u }; stackRegion.Size = 0x80000000; tlsIoRegion.Size = 0x1000000000;