KTransferMemory.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.HLE.HOS.Kernel.Process;
  3. using System;
  4. namespace Ryujinx.HLE.HOS.Kernel.Memory
  5. {
  6. class KTransferMemory : KAutoObject
  7. {
  8. private KProcess _creator;
  9. private readonly KPageList _pageList;
  10. public ulong Address { get; private set; }
  11. public ulong Size => _pageList.GetPagesCount() * KMemoryManager.PageSize;
  12. public MemoryPermission Permission { get; private set; }
  13. private bool _hasBeenInitialized;
  14. private bool _isMapped;
  15. public KTransferMemory(KernelContext context) : base(context)
  16. {
  17. _pageList = new KPageList();
  18. }
  19. public KernelResult Initialize(ulong address, ulong size, MemoryPermission permission)
  20. {
  21. KProcess creator = KernelContext.Scheduler.GetCurrentProcess();
  22. _creator = creator;
  23. KernelResult result = creator.MemoryManager.BorrowTransferMemory(_pageList, address, size, permission);
  24. if (result != KernelResult.Success)
  25. {
  26. return result;
  27. }
  28. creator.IncrementReferenceCount();
  29. Permission = permission;
  30. Address = address;
  31. _hasBeenInitialized = true;
  32. _isMapped = false;
  33. return result;
  34. }
  35. protected override void Destroy()
  36. {
  37. if (_hasBeenInitialized)
  38. {
  39. if (!_isMapped && _creator.MemoryManager.UnborrowTransferMemory(Address, Size, _pageList) != KernelResult.Success)
  40. {
  41. throw new InvalidOperationException("Unexpected failure restoring transfer memory attributes.");
  42. }
  43. _creator.ResourceLimit?.Release(LimitableResource.TransferMemory, 1);
  44. _creator.DecrementReferenceCount();
  45. }
  46. }
  47. }
  48. }