aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/KernelContext.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-01-17 01:13:24 -0300
committerGitHub <noreply@github.com>2023-01-17 05:13:24 +0100
commit86fd0643c26433362a25acceb4fa1fcee07dd0b2 (patch)
tree8d12fb6b0629c195a0a3c1014f46cfe8f22cd3e6 /Ryujinx.HLE/HOS/Kernel/KernelContext.cs
parent43a83a401ea8101bf6d001fe6fe188e1c106245e (diff)
Implement support for page sizes > 4KB (#4252)1.1.568
* Implement support for page sizes > 4KB * Check and work around more alignment issues * Was not meant to change this * Use MemoryBlock.GetPageSize() value for signal handler code * Do not take the path for private allocations if host supports 4KB pages * Add Flags attribute on MemoryMapFlags * Fix dirty region size with 16kb pages Would accidentally report a size that was too high (generally 16k instead of 4k, uploading 4x as much data) Co-authored-by: riperiperi <rhy3756547@hotmail.com>
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/KernelContext.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/KernelContext.cs13
1 files changed, 12 insertions, 1 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/KernelContext.cs b/Ryujinx.HLE/HOS/Kernel/KernelContext.cs
index 6c58e197..ccc5c0f0 100644
--- a/Ryujinx.HLE/HOS/Kernel/KernelContext.cs
+++ b/Ryujinx.HLE/HOS/Kernel/KernelContext.cs
@@ -84,7 +84,7 @@ namespace Ryujinx.HLE.HOS.Kernel
KernelConstants.UserSlabHeapItemSize,
KernelConstants.UserSlabHeapSize);
- memory.Commit(KernelConstants.UserSlabHeapBase - DramMemoryMap.DramBase, KernelConstants.UserSlabHeapSize);
+ CommitMemory(KernelConstants.UserSlabHeapBase - DramMemoryMap.DramBase, KernelConstants.UserSlabHeapSize);
CriticalSection = new KCriticalSection(this);
Schedulers = new KScheduler[KScheduler.CpuCoresCount];
@@ -119,6 +119,17 @@ namespace Ryujinx.HLE.HOS.Kernel
new Thread(PreemptionThreadStart) { Name = "HLE.PreemptionThread" }.Start();
}
+ public void CommitMemory(ulong address, ulong size)
+ {
+ ulong alignment = MemoryBlock.GetPageSize();
+ ulong endAddress = address + size;
+
+ address &= ~(alignment - 1);
+ endAddress = (endAddress + (alignment - 1)) & ~(alignment - 1);
+
+ Memory.Commit(address, endAddress - address);
+ }
+
public ulong NewThreadUid()
{
return Interlocked.Increment(ref _threadUid) - 1;