| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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;
- }
- }
- }
|