mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-10-01 12:30:00 +02:00
73 lines
1.6 KiB
C#
73 lines
1.6 KiB
C#
|
namespace Ryujinx.HLE.HOS.Kernel
|
||
|
{
|
||
|
class KTlsPageInfo
|
||
|
{
|
||
|
public const int TlsEntrySize = 0x200;
|
||
|
|
||
|
public ulong PageAddr { get; private set; }
|
||
|
|
||
|
private bool[] IsSlotFree;
|
||
|
|
||
|
public KTlsPageInfo(ulong PageAddress)
|
||
|
{
|
||
|
this.PageAddr = PageAddress;
|
||
|
|
||
|
IsSlotFree = new bool[KMemoryManager.PageSize / TlsEntrySize];
|
||
|
|
||
|
for (int Index = 0; Index < IsSlotFree.Length; Index++)
|
||
|
{
|
||
|
IsSlotFree[Index] = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool TryGetFreePage(out ulong Address)
|
||
|
{
|
||
|
Address = PageAddr;
|
||
|
|
||
|
for (int Index = 0; Index < IsSlotFree.Length; Index++)
|
||
|
{
|
||
|
if (IsSlotFree[Index])
|
||
|
{
|
||
|
IsSlotFree[Index] = false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
Address += TlsEntrySize;
|
||
|
}
|
||
|
|
||
|
Address = 0;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool IsFull()
|
||
|
{
|
||
|
bool HasFree = false;
|
||
|
|
||
|
for (int Index = 0; Index < IsSlotFree.Length; Index++)
|
||
|
{
|
||
|
HasFree |= IsSlotFree[Index];
|
||
|
}
|
||
|
|
||
|
return !HasFree;
|
||
|
}
|
||
|
|
||
|
public bool IsEmpty()
|
||
|
{
|
||
|
bool AllFree = true;
|
||
|
|
||
|
for (int Index = 0; Index < IsSlotFree.Length; Index++)
|
||
|
{
|
||
|
AllFree &= IsSlotFree[Index];
|
||
|
}
|
||
|
|
||
|
return AllFree;
|
||
|
}
|
||
|
|
||
|
public void FreeTlsSlot(ulong Address)
|
||
|
{
|
||
|
IsSlotFree[(Address - PageAddr) / TlsEntrySize] = true;
|
||
|
}
|
||
|
}
|
||
|
}
|