KPageList.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace Ryujinx.HLE.HOS.Kernel.Memory
  5. {
  6. class KPageList : IEnumerable<KPageNode>
  7. {
  8. public LinkedList<KPageNode> Nodes { get; }
  9. public KPageList()
  10. {
  11. Nodes = new LinkedList<KPageNode>();
  12. }
  13. public KernelResult AddRange(ulong address, ulong pagesCount)
  14. {
  15. if (pagesCount != 0)
  16. {
  17. if (Nodes.Last != null)
  18. {
  19. KPageNode lastNode = Nodes.Last.Value;
  20. if (lastNode.Address + lastNode.PagesCount * KPageTableBase.PageSize == address)
  21. {
  22. address = lastNode.Address;
  23. pagesCount += lastNode.PagesCount;
  24. Nodes.RemoveLast();
  25. }
  26. }
  27. Nodes.AddLast(new KPageNode(address, pagesCount));
  28. }
  29. return KernelResult.Success;
  30. }
  31. public ulong GetPagesCount()
  32. {
  33. ulong sum = 0;
  34. foreach (KPageNode node in Nodes)
  35. {
  36. sum += node.PagesCount;
  37. }
  38. return sum;
  39. }
  40. public bool IsEqual(KPageList other)
  41. {
  42. LinkedListNode<KPageNode> thisNode = Nodes.First;
  43. LinkedListNode<KPageNode> otherNode = other.Nodes.First;
  44. while (thisNode != null && otherNode != null)
  45. {
  46. if (thisNode.Value.Address != otherNode.Value.Address ||
  47. thisNode.Value.PagesCount != otherNode.Value.PagesCount)
  48. {
  49. return false;
  50. }
  51. thisNode = thisNode.Next;
  52. otherNode = otherNode.Next;
  53. }
  54. return thisNode == null && otherNode == null;
  55. }
  56. public void IncrementPagesReferenceCount(KMemoryManager manager)
  57. {
  58. foreach (var node in this)
  59. {
  60. manager.IncrementPagesReferenceCount(node.Address, node.PagesCount);
  61. }
  62. }
  63. public void DecrementPagesReferenceCount(KMemoryManager manager)
  64. {
  65. foreach (var node in this)
  66. {
  67. manager.DecrementPagesReferenceCount(node.Address, node.PagesCount);
  68. }
  69. }
  70. public IEnumerator<KPageNode> GetEnumerator()
  71. {
  72. return Nodes.GetEnumerator();
  73. }
  74. IEnumerator IEnumerable.GetEnumerator()
  75. {
  76. return GetEnumerator();
  77. }
  78. }
  79. }