12 GiB heap support (ryubing/ryujinx!166)

See merge request ryubing/ryujinx!166
This commit is contained in:
LotP
2025-10-15 15:37:13 -05:00
parent 2434c55266
commit 1d409f7127
5 changed files with 15 additions and 5 deletions

View File

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

View File

@@ -102,6 +102,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ProcessCreationFlags flags, ProcessCreationFlags flags,
bool fromBack, bool fromBack,
MemoryRegion memRegion, MemoryRegion memRegion,
MemoryConfiguration memConfig,
ulong address, ulong address,
ulong size, ulong size,
KMemoryBlockSlabManager slabManager) KMemoryBlockSlabManager slabManager)
@@ -117,6 +118,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
addrSpaceBase, addrSpaceBase,
addrSpaceSize, addrSpaceSize,
memRegion, memRegion,
memConfig,
address, address,
size, size,
slabManager); slabManager);
@@ -159,6 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
ulong addrSpaceStart, ulong addrSpaceStart,
ulong addrSpaceEnd, ulong addrSpaceEnd,
MemoryRegion memRegion, MemoryRegion memRegion,
MemoryConfiguration memConfig,
ulong address, ulong address,
ulong size, ulong size,
KMemoryBlockSlabManager slabManager) KMemoryBlockSlabManager slabManager)
@@ -193,7 +196,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
case ProcessCreationFlags.AddressSpace64BitDeprecated: case ProcessCreationFlags.AddressSpace64BitDeprecated:
aliasRegion.Size = 0x180000000; aliasRegion.Size = 0x180000000;
heapRegion.Size = 0x180000000; heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u;
stackRegion.Size = 0; stackRegion.Size = 0;
tlsIoRegion.Size = 0; tlsIoRegion.Size = 0;
CodeRegionStart = 0x8000000; CodeRegionStart = 0x8000000;
@@ -223,7 +226,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize); int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize);
aliasRegion.Size = 1UL << (addressSpaceWidth - 3); aliasRegion.Size = 1UL << (addressSpaceWidth - 3);
heapRegion.Size = 0x180000000; heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u;
stackRegion.Size = 1UL << (addressSpaceWidth - 8); stackRegion.Size = 1UL << (addressSpaceWidth - 8);
tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3); tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3);
CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment); CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);
@@ -237,7 +240,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
else else
{ {
aliasRegion.Size = 0x1000000000; aliasRegion.Size = 0x1000000000;
heapRegion.Size = 0x180000000; heapRegion.Size = memConfig == MemoryConfiguration.MemoryConfiguration12GiB ? 0x300000000u : 0x180000000u;
stackRegion.Size = 0x80000000; stackRegion.Size = 0x80000000;
tlsIoRegion.Size = 0x1000000000; tlsIoRegion.Size = 0x1000000000;
CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment); CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);

View File

@@ -124,6 +124,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
KPageList pageList, KPageList pageList,
KResourceLimit resourceLimit, KResourceLimit resourceLimit,
MemoryRegion memRegion, MemoryRegion memRegion,
MemoryConfiguration memConfig,
IProcessContextFactory contextFactory, IProcessContextFactory contextFactory,
ThreadStart customThreadStart = null) ThreadStart customThreadStart = null)
{ {
@@ -153,6 +154,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
creationInfo.Flags, creationInfo.Flags,
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr), !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
memRegion, memRegion,
memConfig,
codeAddress, codeAddress,
codeSize, codeSize,
slabManager); slabManager);
@@ -189,6 +191,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
ReadOnlySpan<uint> capabilities, ReadOnlySpan<uint> capabilities,
KResourceLimit resourceLimit, KResourceLimit resourceLimit,
MemoryRegion memRegion, MemoryRegion memRegion,
MemoryConfiguration memConfig,
IProcessContextFactory contextFactory, IProcessContextFactory contextFactory,
ThreadStart customThreadStart = null) ThreadStart customThreadStart = null)
{ {
@@ -252,6 +255,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
creationInfo.Flags, creationInfo.Flags,
!creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr), !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
memRegion, memRegion,
memConfig,
codeAddress, codeAddress,
codeSize, codeSize,
slabManager); slabManager);

View File

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

View File

@@ -189,7 +189,7 @@ namespace Ryujinx.HLE.Loaders.Processes
codeAddress, codeAddress,
codeSize); 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) if (result != Result.Success)
{ {
Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); 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), MemoryMarshal.Cast<byte, uint>(npdm.KernelCapabilityData),
resourceLimit, resourceLimit,
memoryRegion, memoryRegion,
context.Device.Configuration.MemoryConfiguration,
processContextFactory); processContextFactory);
if (result != Result.Success) if (result != Result.Success)