| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using Ryujinx.HLE.HOS.Kernel.Memory;
- namespace Ryujinx.HLE.HOS.Kernel.Process
- {
- class KTlsPageInfo
- {
- public const int TlsEntrySize = 0x200;
- public ulong PageVirtualAddress { get; }
- public ulong PagePhysicalAddress { get; }
- private readonly bool[] _isSlotFree;
- public KTlsPageInfo(ulong pageVirtualAddress, ulong pagePhysicalAddress)
- {
- PageVirtualAddress = pageVirtualAddress;
- PagePhysicalAddress = pagePhysicalAddress;
- _isSlotFree = new bool[KPageTableBase.PageSize / TlsEntrySize];
- for (int index = 0; index < _isSlotFree.Length; index++)
- {
- _isSlotFree[index] = true;
- }
- }
- public bool TryGetFreePage(out ulong address)
- {
- address = PageVirtualAddress;
- 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 - PageVirtualAddress) / TlsEntrySize] = true;
- }
- }
- }
|