diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-01-17 01:13:24 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-17 05:13:24 +0100 |
commit | 86fd0643c26433362a25acceb4fa1fcee07dd0b2 (patch) | |
tree | 8d12fb6b0629c195a0a3c1014f46cfe8f22cd3e6 /Ryujinx.HLE/HOS/Kernel/KernelContext.cs | |
parent | 43a83a401ea8101bf6d001fe6fe188e1c106245e (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.cs | 13 |
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; |