12 GiB heap support

The heap was limited to 6 GiB no matter the memory setting, causing memory configurations above 8 GiB to not actually affect the heap size.

Now when the memory config is set to [10 or] 12 GiB the heap also allocates 12 GiB.

The SetHeapSize SysCall will now allow heap sizes up to 12 GiB (technically slightly less).

Co-authored-by: KeatonTheBot <keaton@ryujinx.app>
This commit is contained in:
LotP 2025-10-15 15:37:13 -05:00 committed by KeatonTheBot
parent fc7932ad27
commit 4f101170f0
5 changed files with 27 additions and 5 deletions

View file

@ -29,6 +29,7 @@ namespace Ryujinx.HLE.HOS.Kernel
capabilities,
context.ResourceLimit,
MemoryRegion.Service,
context.Device.Configuration.MemoryConfiguration,
null,
customThreadStart);

View file

@ -103,6 +103,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ProcessCreationFlags flags,
bool fromBack,
MemoryRegion memRegion,
MemoryConfiguration memConfig,
ulong address,
ulong size,
ulong reservedSize,
@ -119,6 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
addrSpaceBase,
addrSpaceSize,
memRegion,
memConfig,
address,
size,
reservedSize,
@ -162,6 +164,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ulong addrSpaceStart,
ulong addrSpaceEnd,
MemoryRegion memRegion,
MemoryConfiguration memConfig,
ulong address,
ulong size,
ulong reservedSize,
@ -197,7 +200,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
case ProcessCreationFlags.AddressSpace64BitDeprecated:
aliasRegion.Size = 0x180000000;
heapRegion.Size = 0x180000000;
heapRegion.Size = memConfig switch {
MemoryConfiguration.MemoryConfiguration10GiB
or MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u,
_ => 0x180000000u
};
stackRegion.Size = 0;
tlsIoRegion.Size = 0;
CodeRegionStart = 0x8000000;
@ -228,7 +235,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
int addressSpaceWidth = (int)ulong.Log2(reservedAddressSpaceSize);
aliasRegion.Size = reservedAddressSpaceSize >= 0x1800000000 ? 0x1000000000 : 1UL << (addressSpaceWidth - 3);
heapRegion.Size = 0x180000000;
heapRegion.Size = memConfig switch {
MemoryConfiguration.MemoryConfiguration10GiB
or MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u,
_ => 0x180000000u
};
stackRegion.Size = 1UL << (addressSpaceWidth - 8);
tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3);
CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);
@ -242,7 +253,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
else
{
aliasRegion.Size = 0x1000000000;
heapRegion.Size = 0x180000000;
heapRegion.Size = memConfig switch {
MemoryConfiguration.MemoryConfiguration10GiB
or MemoryConfiguration.MemoryConfiguration12GiB => 0x300000000u,
_ => 0x180000000u
};
stackRegion.Size = 0x80000000;
tlsIoRegion.Size = 0x1000000000;
CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);

View file

@ -118,6 +118,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
KPageList pageList,
KResourceLimit resourceLimit,
MemoryRegion memRegion,
MemoryConfiguration memConfig,
IProcessContextFactory contextFactory,
ThreadStart customThreadStart = null)
{
@ -147,6 +148,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
creationInfo.Flags,
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
memRegion,
memConfig,
codeAddress,
codeSize,
Context.ReservedSize,
@ -184,6 +186,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ReadOnlySpan<uint> capabilities,
KResourceLimit resourceLimit,
MemoryRegion memRegion,
MemoryConfiguration memConfig,
IProcessContextFactory contextFactory,
ThreadStart customThreadStart = null,
ulong entrypointOffset = 0UL)
@ -248,6 +251,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
creationInfo.Flags,
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
memRegion,
memConfig,
codeAddress,
codeSize,
Context.ReservedSize,

View file

@ -137,6 +137,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
capabilities,
resourceLimit,
memRegion,
_context.Device.Configuration.MemoryConfiguration,
contextFactory,
customThreadStart);
@ -880,7 +881,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
[Svc(1)]
public Result SetHeapSize([PointerSized] out ulong address, [PointerSized] ulong size)
{
if ((size & 0xfffffffe001fffff) != 0)
if ((size & 0xfffffffd001fffff) != 0)
{
address = 0;

View file

@ -190,7 +190,7 @@ namespace Ryujinx.HLE.Loaders.Processes
codeAddress,
codeSize);
result = process.InitializeKip(creationInfo, kip.Capabilities, pageList, context.ResourceLimit, memoryRegion, processContextFactory);
result = process.InitializeKip(creationInfo, kip.Capabilities, pageList, context.ResourceLimit, memoryRegion, context.Device.Configuration.MemoryConfiguration, processContextFactory);
if (result != Result.Success)
{
Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\".");
@ -401,6 +401,7 @@ namespace Ryujinx.HLE.Loaders.Processes
MemoryMarshal.Cast<byte, uint>(npdm.KernelCapabilityData),
resourceLimit,
memoryRegion,
context.Device.Configuration.MemoryConfiguration,
processContextFactory,
entrypointOffset: nsoPatch[0]?.Size ?? 0UL);