Difference between revisions of "Thread Local Region"
(Created page with "This is the 0x200-byte thread-local-storage, the base address is loaded via ARM threadid register tpidrro_el0. == Structure == {| class="wikitable" border="1" |- ! Offset !...") |
|||
(12 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
− | This is the 0x200-byte thread | + | 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". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 7: | Line 8: | ||
! Offset | ! Offset | ||
! Size | ! Size | ||
+ | ! Name | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x100 | | 0x100 | ||
− | | [[IPC_Marshalling|IPC]] command buffer | + | | MessageBuffer |
+ | | [[IPC_Marshalling|IPC]] command buffer. | ||
|- | |- | ||
| 0x100 | | 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 [[SVC#SynchronizePreemptionState|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 | | 0x1F8 | ||
| 0x8 | | 0x8 | ||
− | | | + | | ThreadType |
+ | | Pointer to [[#ThreadType|thread type]]. | ||
+ | |} | ||
+ | |||
+ | = Userland context = | ||
+ | == OsResourceManager == | ||
+ | This is "nn::os::detail::OsResourceManager". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Name | ||
+ | ! 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 | ||
+ | | [[#MemoryHeapManager|MemoryHeapManager]] | ||
+ | | | ||
+ | |- | ||
+ | | 0x3A0 | ||
+ | | 0x48 | ||
+ | | [[#VammManager|VammManager]] | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | === RngManager === | ||
+ | This is "nn::os::detail::RngManager". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Name | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x4 | ||
+ | | CriticalSection | ||
+ | | | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x10 | ||
+ | | Random | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | === AslrSpaceManager === | ||
+ | This is "nn::os::detail::AslrSpaceManager". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Name | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x20 | ||
+ | | [[#AddressSpaceAllocator|Allocator]] | ||
+ | | | ||
+ | |- | ||
+ | | 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 | ||
+ | | 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 | ||
+ | | | ||
+ | |} | ||
+ | |||
+ | == ThreadType == | ||
+ | This is "nn::os::ThreadType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! 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 | ||
+ | | | ||
|} | |} |
Latest revision as of 20: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 |