KSharedMemory.cs 2.2 KB

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