diff options
author | gdkchan <gab.dark.100@gmail.com> | 2021-04-04 09:06:59 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-04 14:06:59 +0200 |
commit | 874540bb5c1c5737bc9b0bfdc96fe1cf12ff164d (patch) | |
tree | 68582881e7f4965d7e0938020a9f5dd1773f070a /Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs | |
parent | 3bc107d491745a0d1f18e48d8c6c0f74565ae633 (diff) |
Allow DRAM size to be increased from 4GB to 6GB (#2174)
* Allow DRAM size to be increased from 4GB to 6GB
* Add option on the UI
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs')
-rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs | 131 |
1 files changed, 41 insertions, 90 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs b/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs index bbb75f18..1949df31 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs @@ -5,7 +5,21 @@ namespace Ryujinx.HLE.HOS.Kernel.Common { static class KernelInit { - public static void InitializeResourceLimit(KResourceLimit resourceLimit) + private struct MemoryRegion + { + public ulong Address { get; } + public ulong Size { get; } + + public ulong EndAddress => Address + Size; + + public MemoryRegion(ulong address, ulong size) + { + Address = address; + Size = size; + } + } + + public static void InitializeResourceLimit(KResourceLimit resourceLimit, MemorySize size) { void EnsureSuccess(KernelResult result) { @@ -15,11 +29,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Common } } - int kernelMemoryCfg = 0; - - long ramSize = GetRamSize(kernelMemoryCfg); + ulong ramSize = KSystemControl.GetDramSize(size); - EnsureSuccess(resourceLimit.SetLimitValue(LimitableResource.Memory, ramSize)); + EnsureSuccess(resourceLimit.SetLimitValue(LimitableResource.Memory, (long)ramSize)); EnsureSuccess(resourceLimit.SetLimitValue(LimitableResource.Thread, 800)); EnsureSuccess(resourceLimit.SetLimitValue(LimitableResource.Event, 700)); EnsureSuccess(resourceLimit.SetLimitValue(LimitableResource.TransferMemory, 200)); @@ -32,106 +44,45 @@ namespace Ryujinx.HLE.HOS.Kernel.Common } } - public static KMemoryRegionManager[] GetMemoryRegions() + public static KMemoryRegionManager[] GetMemoryRegions(MemorySize size, MemoryArrange arrange) { - KMemoryArrange arrange = GetMemoryArrange(); - - return new KMemoryRegionManager[] - { - GetMemoryRegion(arrange.Application), - GetMemoryRegion(arrange.Applet), - GetMemoryRegion(arrange.Service), - GetMemoryRegion(arrange.NvServices) - }; - } - - private static KMemoryRegionManager GetMemoryRegion(KMemoryArrangeRegion region) - { - return new KMemoryRegionManager(region.Address, region.Size, region.EndAddr); - } - - private static KMemoryArrange GetMemoryArrange() - { - int mcEmemCfg = 0x1000; - - ulong ememApertureSize = (ulong)(mcEmemCfg & 0x3fff) << 20; - - int kernelMemoryCfg = 0; - - ulong ramSize = (ulong)GetRamSize(kernelMemoryCfg); + ulong poolEnd = KSystemControl.GetDramEndAddress(size); + ulong applicationPoolSize = KSystemControl.GetApplicationPoolSize(arrange); + ulong appletPoolSize = KSystemControl.GetAppletPoolSize(arrange); - ulong ramPart0; - ulong ramPart1; + MemoryRegion servicePool; + MemoryRegion nvServicesPool; + MemoryRegion appletPool; + MemoryRegion applicationPool; - if (ramSize * 2 > ememApertureSize) - { - ramPart0 = ememApertureSize / 2; - ramPart1 = ememApertureSize / 2; - } - else - { - ramPart0 = ememApertureSize; - ramPart1 = 0; - } - - int memoryArrange = 1; + ulong nvServicesPoolSize = KSystemControl.GetMinimumNonSecureSystemPoolSize(); - ulong applicationRgSize; + applicationPool = new MemoryRegion(poolEnd - applicationPoolSize, applicationPoolSize); - switch (memoryArrange) - { - case 2: applicationRgSize = 0x80000000; break; - case 0x11: - case 0x21: applicationRgSize = 0x133400000; break; - default: applicationRgSize = 0xcd500000; break; - } - - ulong appletRgSize; - - switch (memoryArrange) - { - case 2: appletRgSize = 0x61200000; break; - case 3: appletRgSize = 0x1c000000; break; - case 0x11: appletRgSize = 0x23200000; break; - case 0x12: - case 0x21: appletRgSize = 0x89100000; break; - default: appletRgSize = 0x1fb00000; break; - } + ulong nvServicesPoolEnd = applicationPool.Address - appletPoolSize; - KMemoryArrangeRegion serviceRg; - KMemoryArrangeRegion nvServicesRg; - KMemoryArrangeRegion appletRg; - KMemoryArrangeRegion applicationRg; - - const ulong nvServicesRgSize = 0x29ba000; - - ulong applicationRgEnd = DramMemoryMap.DramEnd; //- RamPart0; - - applicationRg = new KMemoryArrangeRegion(applicationRgEnd - applicationRgSize, applicationRgSize); - - ulong nvServicesRgEnd = applicationRg.Address - appletRgSize; - - nvServicesRg = new KMemoryArrangeRegion(nvServicesRgEnd - nvServicesRgSize, nvServicesRgSize); - appletRg = new KMemoryArrangeRegion(nvServicesRgEnd, appletRgSize); + nvServicesPool = new MemoryRegion(nvServicesPoolEnd - nvServicesPoolSize, nvServicesPoolSize); + appletPool = new MemoryRegion(nvServicesPoolEnd, appletPoolSize); // Note: There is an extra region used by the kernel, however // since we are doing HLE we are not going to use that memory, so give all // the remaining memory space to services. - ulong serviceRgSize = nvServicesRg.Address - DramMemoryMap.SlabHeapEnd; + ulong servicePoolSize = nvServicesPool.Address - DramMemoryMap.SlabHeapEnd; - serviceRg = new KMemoryArrangeRegion(DramMemoryMap.SlabHeapEnd, serviceRgSize); + servicePool = new MemoryRegion(DramMemoryMap.SlabHeapEnd, servicePoolSize); - return new KMemoryArrange(serviceRg, nvServicesRg, appletRg, applicationRg); + return new KMemoryRegionManager[] + { + GetMemoryRegion(applicationPool), + GetMemoryRegion(appletPool), + GetMemoryRegion(servicePool), + GetMemoryRegion(nvServicesPool) + }; } - private static long GetRamSize(int kernelMemoryCfg) + private static KMemoryRegionManager GetMemoryRegion(MemoryRegion region) { - switch ((kernelMemoryCfg >> 16) & 3) - { - case 1: return 0x180000000; - case 2: return 0x200000000; - default: return 0x100000000; - } + return new KMemoryRegionManager(region.Address, region.Size, region.EndAddress); } } }
\ No newline at end of file |