diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs index ca0e3421..61c883d8 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs @@ -6,7 +6,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { class KSharedMemory : KAutoObject { - private readonly KPageList _pageList; + private readonly SharedMemoryStorage _storage; private readonly long _ownerPid; @@ -14,28 +14,29 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory private readonly KMemoryPermission _userPermission; public KSharedMemory( - KernelContext context, - KPageList pageList, - long ownerPid, + KernelContext context, + SharedMemoryStorage storage, + long ownerPid, KMemoryPermission ownerPermission, KMemoryPermission userPermission) : base(context) { - _pageList = pageList; - _ownerPid = ownerPid; + _storage = storage; + _ownerPid = ownerPid; _ownerPermission = ownerPermission; - _userPermission = userPermission; + _userPermission = userPermission; } public KernelResult MapIntoProcess( - KMemoryManager memoryManager, - ulong address, - ulong size, - KProcess process, + KPageTableBase memoryManager, + ulong address, + ulong size, + KProcess process, KMemoryPermission permission) { - ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize); + ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize); - if (_pageList.GetPagesCount() != pagesCountRounded) + var pageList = _storage.GetPageList(); + if (pageList.GetPagesCount() != pagesCountRounded) { return KernelResult.InvalidSize; } @@ -49,23 +50,35 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.InvalidPermission; } - return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission); + KernelResult result = memoryManager.MapPages(address, pageList, MemoryState.SharedMemory, permission); + + if (result == KernelResult.Success && !memoryManager.SupportsMemoryAliasing) + { + _storage.Borrow(process, address); + } + + return result; } public KernelResult UnmapFromProcess( - KMemoryManager memoryManager, - ulong address, - ulong size, - KProcess process) + KPageTableBase memoryManager, + ulong address, + ulong size, + KProcess process) { - ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize); + ulong pagesCountRounded = BitUtils.DivRoundUp(size, KPageTableBase.PageSize); + + var pageList = _storage.GetPageList(); + ulong pagesCount = pageList.GetPagesCount(); - if (_pageList.GetPagesCount() != pagesCountRounded) + if (pagesCount != pagesCountRounded) { return KernelResult.InvalidSize; } - return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory); + var ranges = _storage.GetRanges(); + + return memoryManager.UnmapPages(address, pagesCount, ranges, MemoryState.SharedMemory); } } }
\ No newline at end of file |
