KSharedMemory.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Ryujinx.Common;
  2. using Ryujinx.HLE.HOS.Kernel.Common;
  3. using Ryujinx.HLE.HOS.Kernel.Process;
  4. namespace Ryujinx.HLE.HOS.Kernel.Memory
  5. {
  6. class KSharedMemory : KAutoObject
  7. {
  8. private readonly KPageList _pageList;
  9. private readonly ulong _ownerPid;
  10. private readonly KMemoryPermission _ownerPermission;
  11. private readonly KMemoryPermission _userPermission;
  12. public KSharedMemory(
  13. KernelContext context,
  14. SharedMemoryStorage storage,
  15. ulong ownerPid,
  16. KMemoryPermission ownerPermission,
  17. KMemoryPermission userPermission) : base(context)
  18. {
  19. _pageList = storage.GetPageList();
  20. _ownerPid = ownerPid;
  21. _ownerPermission = ownerPermission;
  22. _userPermission = userPermission;
  23. }
  24. public KernelResult MapIntoProcess(
  25. KPageTableBase memoryManager,
  26. ulong address,
  27. ulong size,
  28. KProcess process,
  29. KMemoryPermission permission)
  30. {
  31. if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize))
  32. {
  33. return KernelResult.InvalidSize;
  34. }
  35. KMemoryPermission expectedPermission = process.Pid == _ownerPid
  36. ? _ownerPermission
  37. : _userPermission;
  38. if (permission != expectedPermission)
  39. {
  40. return KernelResult.InvalidPermission;
  41. }
  42. return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission);
  43. }
  44. public KernelResult UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process)
  45. {
  46. if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize))
  47. {
  48. return KernelResult.InvalidSize;
  49. }
  50. return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
  51. }
  52. }
  53. }