| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using Ryujinx.HLE.HOS.Kernel.Memory;
- namespace Ryujinx.HLE.HOS.Kernel.Process
- {
- class KTlsPageInfo
- {
- public const int TlsEntrySize = 0x200;
- public ulong PageAddr { get; private set; }
- private bool[] _isSlotFree;
- public KTlsPageInfo(ulong pageAddress)
- {
- 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;
- }
- }
- }
|