| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- using Ryujinx.Common;
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- namespace Ryujinx.HLE.HOS.Kernel.Memory
- {
- class KSharedMemory
- {
- private KPageList _pageList;
- private long _ownerPid;
- private MemoryPermission _ownerPermission;
- private MemoryPermission _userPermission;
- public KSharedMemory(
- KPageList pageList,
- long ownerPid,
- MemoryPermission ownerPermission,
- MemoryPermission userPermission)
- {
- _pageList = pageList;
- _ownerPid = ownerPid;
- _ownerPermission = ownerPermission;
- _userPermission = userPermission;
- }
- public KernelResult MapIntoProcess(
- KMemoryManager memoryManager,
- ulong address,
- ulong size,
- KProcess process,
- MemoryPermission permission)
- {
- ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
- if (_pageList.GetPagesCount() != pagesCountRounded)
- {
- return KernelResult.InvalidSize;
- }
- MemoryPermission expectedPermission = process.Pid == _ownerPid
- ? _ownerPermission
- : _userPermission;
- if (permission != expectedPermission)
- {
- return KernelResult.InvalidPermission;
- }
- return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission);
- }
- public KernelResult UnmapFromProcess(
- KMemoryManager memoryManager,
- ulong address,
- ulong size,
- KProcess process)
- {
- ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
- if (_pageList.GetPagesCount() != pagesCountRounded)
- {
- return KernelResult.InvalidSize;
- }
- return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
- }
- }
- }
|