KSharedMemory.cs 2.0 KB

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