KSharedMemory.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Ryujinx.Common;
  2. namespace Ryujinx.HLE.HOS.Kernel
  3. {
  4. class KSharedMemory
  5. {
  6. private KPageList PageList;
  7. private long OwnerPid;
  8. private MemoryPermission OwnerPermission;
  9. private MemoryPermission UserPermission;
  10. public KSharedMemory(
  11. KPageList PageList,
  12. long OwnerPid,
  13. MemoryPermission OwnerPermission,
  14. MemoryPermission UserPermission)
  15. {
  16. this.PageList = PageList;
  17. this.OwnerPid = OwnerPid;
  18. this.OwnerPermission = OwnerPermission;
  19. this.UserPermission = UserPermission;
  20. }
  21. public KernelResult MapIntoProcess(
  22. KMemoryManager MemoryManager,
  23. ulong Address,
  24. ulong Size,
  25. KProcess Process,
  26. MemoryPermission Permission)
  27. {
  28. ulong PagesCountRounded = BitUtils.DivRoundUp(Size, KMemoryManager.PageSize);
  29. if (PageList.GetPagesCount() != PagesCountRounded)
  30. {
  31. return KernelResult.InvalidSize;
  32. }
  33. MemoryPermission ExpectedPermission = Process.Pid == OwnerPid
  34. ? OwnerPermission
  35. : UserPermission;
  36. if (Permission != ExpectedPermission)
  37. {
  38. return KernelResult.InvalidPermission;
  39. }
  40. return MemoryManager.MapPages(Address, PageList, MemoryState.SharedMemory, Permission);
  41. }
  42. public KernelResult UnmapFromProcess(
  43. KMemoryManager MemoryManager,
  44. ulong Address,
  45. ulong Size,
  46. KProcess Process)
  47. {
  48. ulong PagesCountRounded = BitUtils.DivRoundUp(Size, KMemoryManager.PageSize);
  49. if (PageList.GetPagesCount() != PagesCountRounded)
  50. {
  51. return KernelResult.InvalidSize;
  52. }
  53. return MemoryManager.UnmapPages(Address, PageList, MemoryState.SharedMemory);
  54. }
  55. }
  56. }