Ryujinx/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs
TSRBerry 2989c163a8
editorconfig: Set default encoding to UTF-8 (#5793)
* editorconfig: Add default charset

* Change file encoding from UTF-8-BOM to UTF-8
2023-12-04 14:17:13 +01:00

65 lines
1.9 KiB
C#

using Ryujinx.HLE.HOS.Kernel.Common;
using System;
namespace Ryujinx.HLE.HOS.Kernel.Memory
{
class KMemoryManager
{
public KMemoryRegionManager[] MemoryRegions { get; }
public KMemoryManager(MemorySize size, MemoryArrange arrange)
{
MemoryRegions = KernelInit.GetMemoryRegions(size, arrange);
}
private KMemoryRegionManager GetMemoryRegion(ulong address)
{
for (int i = 0; i < MemoryRegions.Length; i++)
{
var region = MemoryRegions[i];
if (address >= region.Address && address < region.EndAddr)
{
return region;
}
}
return null;
}
public void IncrementPagesReferenceCount(ulong address, ulong pagesCount)
{
IncrementOrDecrementPagesReferenceCount(address, pagesCount, true);
}
public void DecrementPagesReferenceCount(ulong address, ulong pagesCount)
{
IncrementOrDecrementPagesReferenceCount(address, pagesCount, false);
}
private void IncrementOrDecrementPagesReferenceCount(ulong address, ulong pagesCount, bool increment)
{
while (pagesCount != 0)
{
var region = GetMemoryRegion(address);
ulong countToProcess = Math.Min(pagesCount, region.GetPageOffsetFromEnd(address));
lock (region)
{
if (increment)
{
region.IncrementPagesReferenceCount(address, countToProcess);
}
else
{
region.DecrementPagesReferenceCount(address, countToProcess);
}
}
pagesCount -= countToProcess;
address += countToProcess * KPageTableBase.PageSize;
}
}
}
}