mirror of
https://git.ryujinx.app/projects/Kenji-NX.git
synced 2026-09-20 17:51:13 +02:00
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:
committed by
KeatonTheBot
co-authored by
KeatonTheBot
parent
f5822c16af
commit
42727fca07
@@ -29,6 +29,7 @@ namespace Ryujinx.HLE.HOS.Kernel
|
||||
capabilities,
|
||||
context.ResourceLimit,
|
||||
MemoryRegion.Service,
|
||||
context.Device.Configuration.MemoryConfiguration,
|
||||
null,
|
||||
customThreadStart);
|
||||
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
ProcessCreationFlags flags,
|
||||
bool fromBack,
|
||||
MemoryRegion memRegion,
|
||||
MemoryConfiguration memConfig,
|
||||
ulong address,
|
||||
ulong size,
|
||||
KMemoryBlockSlabManager slabManager)
|
||||
@@ -117,6 +118,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
addrSpaceBase,
|
||||
addrSpaceSize,
|
||||
memRegion,
|
||||
memConfig,
|
||||
address,
|
||||
size,
|
||||
slabManager);
|
||||
@@ -159,6 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
ulong addrSpaceStart,
|
||||
ulong addrSpaceEnd,
|
||||
MemoryRegion memRegion,
|
||||
MemoryConfiguration memConfig,
|
||||
ulong address,
|
||||
ulong size,
|
||||
KMemoryBlockSlabManager slabManager)
|
||||
@@ -193,7 +196,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;
|
||||
@@ -223,7 +230,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
|
||||
int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize);
|
||||
|
||||
aliasRegion.Size = 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);
|
||||
@@ -237,7 +248,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);
|
||||
|
||||
@@ -124,6 +124,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||
KPageList pageList,
|
||||
KResourceLimit resourceLimit,
|
||||
MemoryRegion memRegion,
|
||||
MemoryConfiguration memConfig,
|
||||
IProcessContextFactory contextFactory,
|
||||
ThreadStart customThreadStart = null)
|
||||
{
|
||||
@@ -153,6 +154,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||
creationInfo.Flags,
|
||||
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
|
||||
memRegion,
|
||||
memConfig,
|
||||
codeAddress,
|
||||
codeSize,
|
||||
slabManager);
|
||||
@@ -189,6 +191,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||
ReadOnlySpan<uint> capabilities,
|
||||
KResourceLimit resourceLimit,
|
||||
MemoryRegion memRegion,
|
||||
MemoryConfiguration memConfig,
|
||||
IProcessContextFactory contextFactory,
|
||||
ThreadStart customThreadStart = null)
|
||||
{
|
||||
@@ -252,6 +255,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||
creationInfo.Flags,
|
||||
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
|
||||
memRegion,
|
||||
memConfig,
|
||||
codeAddress,
|
||||
codeSize,
|
||||
slabManager);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -189,7 +189,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}\".");
|
||||
@@ -389,6 +389,7 @@ namespace Ryujinx.HLE.Loaders.Processes
|
||||
MemoryMarshal.Cast<byte, uint>(npdm.KernelCapabilityData),
|
||||
resourceLimit,
|
||||
memoryRegion,
|
||||
context.Device.Configuration.MemoryConfiguration,
|
||||
processContextFactory);
|
||||
|
||||
if (result != Result.Success)
|
||||
|
||||
Reference in New Issue
Block a user