| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- using Ryujinx.Common;
- using Ryujinx.HLE.HOS.Kernel.Common;
- using Ryujinx.HLE.HOS.Kernel.Process;
- 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 KernelResult 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 KernelResult 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);
- }
- }
- }
|