KSharedMemory.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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
  7. {
  8. private KPageList _pageList;
  9. private long _ownerPid;
  10. private MemoryPermission _ownerPermission;
  11. private MemoryPermission _userPermission;
  12. public KSharedMemory(
  13. KPageList pageList,
  14. long ownerPid,
  15. MemoryPermission ownerPermission,
  16. MemoryPermission userPermission)
  17. {
  18. _pageList = pageList;
  19. _ownerPid = ownerPid;
  20. _ownerPermission = ownerPermission;
  21. _userPermission = userPermission;
  22. }
  23. public KernelResult MapIntoProcess(
  24. KMemoryManager memoryManager,
  25. ulong address,
  26. ulong size,
  27. KProcess process,
  28. MemoryPermission permission)
  29. {
  30. ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
  31. if (_pageList.GetPagesCount() != pagesCountRounded)
  32. {
  33. return KernelResult.InvalidSize;
  34. }
  35. MemoryPermission 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(
  45. KMemoryManager memoryManager,
  46. ulong address,
  47. ulong size,
  48. KProcess process)
  49. {
  50. ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
  51. if (_pageList.GetPagesCount() != pagesCountRounded)
  52. {
  53. return KernelResult.InvalidSize;
  54. }
  55. return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
  56. }
  57. }
  58. }