aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs55
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