| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- using Ryujinx.Common;
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- using Ryujinx.Horizon.Common;
- namespace Ryujinx.HLE.HOS.Kernel.Memory
- {
- class KSharedMemory : KAutoObject
- {
- private readonly KPageList _pageList;
- private readonly ulong _ownerPid;
- private readonly KMemoryPermission _ownerPermission;
- private readonly KMemoryPermission _userPermission;
- public KSharedMemory(
- KernelContext context,
- SharedMemoryStorage storage,
- ulong ownerPid,
- KMemoryPermission ownerPermission,
- KMemoryPermission userPermission) : base(context)
- {
- _pageList = storage.GetPageList();
- _ownerPid = ownerPid;
- _ownerPermission = ownerPermission;
- _userPermission = userPermission;
- }
- public Result MapIntoProcess(
- KPageTableBase memoryManager,
- ulong address,
- ulong size,
- KProcess process,
- KMemoryPermission permission)
- {
- if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize))
- {
- return KernelResult.InvalidSize;
- }
- KMemoryPermission expectedPermission = process.Pid == _ownerPid
- ? _ownerPermission
- : _userPermission;
- if (permission != expectedPermission)
- {
- return KernelResult.InvalidPermission;
- }
- return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission);
- }
- public Result UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process)
- {
- if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize))
- {
- return KernelResult.InvalidSize;
- }
- return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
- }
- }
- }
|