Thread Local Region: Difference between revisions
| No edit summary | No edit summary | ||
| Line 16: | Line 16: | ||
| | [[IPC_Marshalling|IPC]] command buffer. | | [[IPC_Marshalling|IPC]] command buffer. | ||
| |- | |- | ||
| |  | | 0x100 | ||
| | 0x2 | | 0x2 | ||
| | DisableCounter | | [8.0.0+] DisableCounter | ||
| | If userland sets this to non-zero, kernel will pin the thread and disallow calls to almost all SVCs. | | If userland sets this to non-zero, kernel will pin the thread and disallow calls to almost all SVCs. | ||
| |- | |- | ||
| |  | | 0x102 | ||
| | 0x2 | | 0x2 | ||
| | InterruptFlag | | [8.0.0+] InterruptFlag | ||
| | If a context switch would have occurred when user disable count was non-zero, kernel will set this to 1. This signifies that the user must call [[SVC#SynchronizePreemptionState|SynchronizePreemptionState]] to unpin itself and regain access other SVCs. | | If a context switch would have occurred when user disable count was non-zero, kernel will set this to 1. This signifies that the user must call [[SVC#SynchronizePreemptionState|SynchronizePreemptionState]] to unpin itself and regain access other SVCs. | ||
| |- | |- | ||
| | 0x104 | | 0x104 | ||
| |  | | 0x1 | ||
| |  | | [14.0.0+] CacheMaintenanceFlag | ||
| | | | | ||
| |- | |- | ||
| |  | | 0x105 | ||
| |  | | 0x7B | ||
| | Reserved | | Reserved | ||
| | | | | ||
| Line 69: | Line 69: | ||
| | 0x8 | | 0x8 | ||
| | ThreadType | | ThreadType | ||
| | Pointer to [[ | | Pointer to [[#ThreadType|thread type]]. | ||
| |} | |} | ||
| = Userland context = | = Userland context = | ||
| ==  | == OsResourceManager == | ||
| This is "nn::os::detail:: | This is "nn::os::detail::OsResourceManager". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 83: | Line 83: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x14 | ||
| | | | [[#RngManager|RngManager]] | ||
| |  | |  | ||
| |- | |||
| | 0x14 | |||
| | 0x4 | |||
| | Reserved | |||
| |  | |||
| |- | |||
| | 0x18 | |||
| | 0x28 | |||
| | [[#AslrSpaceManager|AslrSpaceManager]] | |||
| |  | |||
| |- | |||
| | 0x40 | |||
| | 0x28 | |||
| | [[#StackGuardManager|StackGuardManager]] | |||
| |  | |||
| |- | |||
| | 0x68 | |||
| | 0x1F0 | |||
| | [[#ThreadManager|ThreadManager]] | |||
| |  | |||
| |- | |||
| | 0x258 | |||
| | 0x110 | |||
| | [[#TlsManager|TlsManager]] | |||
| |  | |||
| |- | |||
| | 0x368 | |||
| | 0x1 | |||
| | [[#TickManager|TickManager]] | |||
| |   | |||
| |- | |- | ||
| |  | | 0x369 | ||
| |  | | 0x7 | ||
| | | | Reserved | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x370 | ||
| | 0x30 | | 0x30 | ||
| | | | [[#MemoryHeapManager|MemoryHeapManager]] | ||
| |  | |  | ||
| |- | |||
| | 0x3A0 | |||
| | 0x48 | |||
| | [[#VammManager|VammManager]] | |||
| |   | |||
| |} | |} | ||
| ==  | === RngManager === | ||
| This is "nn::os::detail:: | This is "nn::os::detail::RngManager". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 109: | Line 144: | ||
| ! Description | ! Description | ||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x4 | ||
| | | | CriticalSection | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x4 | ||
| | 0x10 | | 0x10 | ||
| | | | Random | ||
| |  | |   | ||
| |} | |||
| === AslrSpaceManager === | |||
| This is "nn::os::detail::AslrSpaceManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x20 | ||
| | | | [[#AddressSpaceAllocator|Allocator]] | ||
| |  | |   | ||
| |- | |- | ||
| | 0x20 | | 0x20 | ||
| |  | | 0x1 | ||
| | | | Impl | ||
| |  | |   | ||
| |- | |||
| | 0x21 | |||
| | 0x7 | |||
| | Reserved | |||
| |  | |||
| |} | |||
| === StackGuardManager === | |||
| This is "nn::os::detail::StackGuardManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x20 | ||
| | | | [[#AddressSpaceAllocator|Allocator]] | ||
| |   | |||
| |- | |- | ||
| |  | | 0x20 | ||
| |  | | 0x1 | ||
| | | | Impl | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x21 | ||
| |  | | 0x7 | ||
| | | | Reserved | ||
| |  | |   | ||
| |} | |||
| === ThreadManager === | |||
| This is "nn::os::detail::ThreadManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x1 | ||
| | | | Impl | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x1 | ||
| |  | | 0x7 | ||
| | | | Reserved | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x8 | ||
| |  | | 0x1C0 | ||
| | | | [[#ThreadType|MainThread]] | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x1C8 | ||
| |  | | 0x4 | ||
| | | | CriticalSection | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x1CC | ||
| |  | | 0x4 | ||
| | | | Reserved | ||
| |  | |   | ||
| |- | |- | ||
| | 0x1D0 | | 0x1D0 | ||
| | | | 0x10 | ||
| |  | | AllThreadsList | ||
| |  | |||
| |- | |||
| | 0x1E0 | |||
| | 0x8 | |||
| | TotalThreadStackSize | |||
| |  | |||
| |- | |||
| | 0x1E8 | |||
| | 0x4 | |||
| | NumCreatedThreads | |||
| |  | |||
| |- | |||
| | 0x1EC | |||
| | 0x4 | |||
| | Reserved | |||
| |  | |||
| |} | |||
| === TlsManager === | |||
| This is "nn::os::detail::TlsManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x4 | |||
| | NumUsedTlsSlots | |||
| |  | |||
| |- | |||
| | 0x4 | |||
| | 0x4 | |||
| | Reserved | |||
| |  | |||
| |- | |||
| | 0x8 | |||
| | 0x100 | |||
| | TlsDestructorArray | |||
| |  | |||
| |- | |||
| | 0x108 | |||
| | 0x4 | |||
| | TlsCriticalSection | |||
| |  | |||
| |- | |||
| | 0x10C | |||
| | 0x4 | |||
| | Reserved | |||
| |  | |||
| |} | |||
| === TickManager === | |||
| This is "nn::os::detail::TickManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x1 | |||
| | Impl | |||
| |  | |||
| |} | |||
| === MemoryHeapManager === | |||
| This is "nn::os::detail::MemoryHeapManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x8 | |||
| | HeapAddress | |||
| |  | |||
| |- | |||
| | 0x8 | |||
| | 0x8 | |||
| | HeapSize | |||
| |  | |||
| |- | |||
| | 0x10 | |||
| | 0x8 | |||
| | UsedHeapSize | |||
| |  | |||
| |- | |||
| | 0x18 | |||
| | 0x10 | |||
| | FreeMemoryList | |||
| |  | |||
| |- | |||
| | 0x28 | |||
| | 0x4 | |||
| | CriticalSection | |||
| |  | |||
| |- | |||
| | 0x2C | |||
| | 0x4 | |||
| | Impl | |||
| |  | |||
| |} | |||
| === VammManager === | |||
| This is "nn::os::detail::VammManager". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |||
| | 0x0 | |||
| | 0x8 | |||
| | ReservedRegionAddress | |||
| |  | |||
| |- | |||
| | 0x8 | |||
| | 0x8 | |||
| | ReservedRegionSize | |||
| |  | |||
| |- | |- | ||
| |  | | 0x10 | ||
| |  | | 0x30 | ||
| | | | ReaderWriterLock | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x40 | ||
| |  | | 0x8 | ||
| | | | RegionManager | ||
| |  | |   | ||
| |} | |||
| === AddressSpaceAllocator === | |||
| This is "nn::os::detail::AddressSpaceAllocator". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Name | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| |  | | 0x4 | ||
| | | | CriticalSection | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x4 | ||
| |  | | 0x4 | ||
| | | | Reserved | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x8 | ||
| |  | | 0x8 | ||
| | | | BeginPage | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x10 | ||
| |  | | 0x8 | ||
| | | | EndPage | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x18 | ||
| |  | | 0x8 | ||
| | | | GuardPageCount | ||
| |  | |   | ||
| |} | |} | ||
Latest revision as of 21:23, 5 September 2024
This is the 0x200-byte thread local region. Its base address is loaded via ARM threadid register tpidrro_el0. TLR for multiple threads are stored in the same page, with the first TLR normally located at page+0x200, because the first TLR spot is reserved for usermode exception handling. In threads created by sdk, tpidr_el0 is assigned to the ThreadPointer object from the thread local region.
Structure
This is "nn::svc::ThreadLocalRegion".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x100 | MessageBuffer | IPC command buffer. | 
| 0x100 | 0x2 | [8.0.0+] DisableCounter | If userland sets this to non-zero, kernel will pin the thread and disallow calls to almost all SVCs. | 
| 0x102 | 0x2 | [8.0.0+] InterruptFlag | If a context switch would have occurred when user disable count was non-zero, kernel will set this to 1. This signifies that the user must call SynchronizePreemptionState to unpin itself and regain access other SVCs. | 
| 0x104 | 0x1 | [14.0.0+] CacheMaintenanceFlag | |
| 0x105 | 0x7B | Reserved | |
| 0x180 | 0x50 | Tls | |
| 0x1D0 | 0x8 | LocalePtr | |
| 0x1D8 | 0x8 | ErrnoVal | |
| 0x1E0 | 0x8 | ThreadData | |
| 0x1E8 | 0x8 | EhGlobals | |
| 0x1F0 | 0x8 | ThreadPointer | |
| 0x1F8 | 0x8 | ThreadType | Pointer to thread type. | 
Userland context
OsResourceManager
This is "nn::os::detail::OsResourceManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x14 | RngManager | |
| 0x14 | 0x4 | Reserved | |
| 0x18 | 0x28 | AslrSpaceManager | |
| 0x40 | 0x28 | StackGuardManager | |
| 0x68 | 0x1F0 | ThreadManager | |
| 0x258 | 0x110 | TlsManager | |
| 0x368 | 0x1 | TickManager | |
| 0x369 | 0x7 | Reserved | |
| 0x370 | 0x30 | MemoryHeapManager | |
| 0x3A0 | 0x48 | VammManager | 
RngManager
This is "nn::os::detail::RngManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x4 | CriticalSection | |
| 0x4 | 0x10 | Random | 
AslrSpaceManager
This is "nn::os::detail::AslrSpaceManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x20 | Allocator | |
| 0x20 | 0x1 | Impl | |
| 0x21 | 0x7 | Reserved | 
StackGuardManager
This is "nn::os::detail::StackGuardManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x20 | Allocator | |
| 0x20 | 0x1 | Impl | |
| 0x21 | 0x7 | Reserved | 
ThreadManager
This is "nn::os::detail::ThreadManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x1 | Impl | |
| 0x1 | 0x7 | Reserved | |
| 0x8 | 0x1C0 | MainThread | |
| 0x1C8 | 0x4 | CriticalSection | |
| 0x1CC | 0x4 | Reserved | |
| 0x1D0 | 0x10 | AllThreadsList | |
| 0x1E0 | 0x8 | TotalThreadStackSize | |
| 0x1E8 | 0x4 | NumCreatedThreads | |
| 0x1EC | 0x4 | Reserved | 
TlsManager
This is "nn::os::detail::TlsManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x4 | NumUsedTlsSlots | |
| 0x4 | 0x4 | Reserved | |
| 0x8 | 0x100 | TlsDestructorArray | |
| 0x108 | 0x4 | TlsCriticalSection | |
| 0x10C | 0x4 | Reserved | 
TickManager
This is "nn::os::detail::TickManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x1 | Impl | 
MemoryHeapManager
This is "nn::os::detail::MemoryHeapManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x8 | HeapAddress | |
| 0x8 | 0x8 | HeapSize | |
| 0x10 | 0x8 | UsedHeapSize | |
| 0x18 | 0x10 | FreeMemoryList | |
| 0x28 | 0x4 | CriticalSection | |
| 0x2C | 0x4 | Impl | 
VammManager
This is "nn::os::detail::VammManager".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x8 | ReservedRegionAddress | |
| 0x8 | 0x8 | ReservedRegionSize | |
| 0x10 | 0x30 | ReaderWriterLock | |
| 0x40 | 0x8 | RegionManager | 
AddressSpaceAllocator
This is "nn::os::detail::AddressSpaceAllocator".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x0 | 0x4 | CriticalSection | |
| 0x4 | 0x4 | Reserved | |
| 0x8 | 0x8 | BeginPage | |
| 0x10 | 0x8 | EndPage | |
| 0x18 | 0x8 | GuardPageCount | 
ThreadType
This is "nn::os::ThreadType".
| Offset | Size | Name | Description | 
|---|---|---|---|
| 0x00 | 0x10 | AllThreadsListNode | |
| 0x10 | 0x10 | MultiWaitObjectList | |
| 0x20 | 0x20 | Reserved | |
| 0x40 | 0x01 | State | Thread status. | 
| 0x41 | 0x01 | StackIsAliased | |
| 0x42 | 0x01 | AutoRegistered | |
| 0x43 | 0x01 | SuspendCount | |
| 0x44 | 0x02 | BasePriority | Thread priority minus 0x1C. | 
| 0x46 | 0x02 | Version | |
| 0x48 | 0x08 | OriginalStack | Thread stack base address. | 
| 0x50 | 0x08 | Stack | Thread stack base address mirror. | 
| 0x58 | 0x08 | StackSize | Thread stack size. | 
| 0x60 | 0x08 | Argument | |
| 0x68 | 0x08 | ThreadFunction | |
| 0x70 | 0x08 | CurrentFiber | |
| 0x78 | 0x08 | InitialFiber | |
| 0x80 | 0x100 | TlsValueArray | TLS slots. | 
| 0x180 | 0x20 | ThreadNameBuffer | Thread name. | 
| 0x1A0 | 0x08 | NamePointer | Thread name address. | 
| 0x1A8 | 0x04 | CsThread | Critical Section Storage. | 
| 0x1AC | 0x04 | CvThread | Conditional Variable Storage. | 
| 0x1B0 | 0x04 | Handle | Thread handle. | 
| 0x1B4 | 0x04 | LockHistory | |
| 0x1B8 | 0x08 | ThreadId |