mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-28 16:31:21 -08:00
00579927e4
* Initial implementation of KProcess * Some improvements to the memory manager, implement back guest stack trace printing * Better GetInfo implementation, improve checking in some places with information from process capabilities * Allow the cpu to read/write from the correct memory locations for accesses crossing a page boundary * Change long -> ulong for address/size on memory related methods to avoid unnecessary casts * Attempt at implementing ldr:ro with new KProcess * Allow BSS with size 0 on ldr:ro * Add checking for memory block slab heap usage, return errors if full, exit gracefully * Use KMemoryBlockSize const from KMemoryManager * Allow all methods to read from non-contiguous locations * Fix for TransactParcelAuto * Address PR feedback, additionally fix some small issues related to the KIP loader and implement SVCs GetProcessId, GetProcessList, GetSystemInfo, CreatePort and ManageNamedPort * Fix wrong check for source pages count from page list on MapPhysicalMemory * Fix some issues with UnloadNro on ldr:ro
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;
|
|
}
|
|
}
|
|
} |