Line 1: |
Line 1: |
− | This is the 0x200-byte TLS (thread local storage). It's base address is loaded via ARM threadid register tpidrro_el0. TLS for multiple threads are stored in the same page, with the first TLS normally located at page+0x200, because the first TLS spot is reserved for usermode exception handling. | + | This is the 0x200-byte thread local region. It's 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. |
| | | |
| = Structure = | | = Structure = |
| + | This is "nn::svc::ThreadLocalRegion". |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
| ! Offset | | ! Offset |
| ! Size | | ! Size |
| + | ! Name |
| ! Description | | ! Description |
− | ! Notes
| |
| |- | | |- |
| | 0x0 | | | 0x0 |
| | 0x100 | | | 0x100 |
| + | | MessageBuffer |
| | [[IPC_Marshalling|IPC]] command buffer. | | | [[IPC_Marshalling|IPC]] command buffer. |
− | |
| |
| |- | | |- |
| | [8.0.0+] 0x100 | | | [8.0.0+] 0x100 |
| | 0x2 | | | 0x2 |
− | | User Disable Count | + | | 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. |
| |- | | |- |
| | [8.0.0+] 0x102 | | | [8.0.0+] 0x102 |
| | 0x2 | | | 0x2 |
− | | Interrupt Flag | + | | 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 |
− | | 0xF4 | + | | 0x4 |
− | | Unknown. | + | | Reserved |
| + | | |
| + | |- |
| + | | 0x108 |
| + | | 0x78 |
| + | | Reserved |
| + | | |
| + | |- |
| + | | 0x180 |
| + | | 0x50 |
| + | | Tls |
| + | | |
| + | |- |
| + | | 0x1D0 |
| + | | 0x8 |
| + | | LocalePtr |
| + | | |
| + | |- |
| + | | 0x1D8 |
| + | | 0x8 |
| + | | ErrnoVal |
| + | | |
| + | |- |
| + | | 0x1E0 |
| + | | 0x8 |
| + | | ThreadData |
| + | | |
| + | |- |
| + | | 0x1E8 |
| + | | 0x8 |
| + | | EhGlobals |
| + | | |
| + | |- |
| + | | 0x1F0 |
| + | | 0x8 |
| + | | ThreadPointer |
| | | | | |
| |- | | |- |
| | 0x1F8 | | | 0x1F8 |
| | 0x8 | | | 0x8 |
− | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]]. | + | | ThreadType |
− | |
| + | | Pointer to [[Thread_Local_Region#ThreadType|thread type]]. |
| |} | | |} |
| | | |
| = Userland context = | | = Userland context = |
− | == Boot paramter == | + | == OsBootParamter == |
| This is "nn::os::detail::g_OsBootParamter". | | This is "nn::os::detail::g_OsBootParamter". |
| | | |
Line 43: |
Line 80: |
| ! Offset | | ! Offset |
| ! Size | | ! Size |
| + | ! Name |
| ! Description | | ! Description |
| |- | | |- |
| | 0x00 | | | 0x00 |
| | 0x04 | | | 0x04 |
| + | | |
| | Main thread handle. | | | Main thread handle. |
| |- | | |- |
| | 0x04 | | | 0x04 |
| | 0x04 | | | 0x04 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x08 | | | 0x08 |
| | 0x30 | | | 0x30 |
| + | | |
| | Empty. | | | Empty. |
| |} | | |} |
| | | |
− | == Resource manager storage == | + | == OsResourceManagerStorage == |
| This is "nn::os::detail::g_OsResourceManagerStorage". | | This is "nn::os::detail::g_OsResourceManagerStorage". |
| | | |
Line 65: |
Line 106: |
| ! Offset | | ! Offset |
| ! Size | | ! Size |
| + | ! Name |
| ! Description | | ! Description |
| |- | | |- |
| | 0x00 | | | 0x00 |
| | 0x04 | | | 0x04 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x04 | | | 0x04 |
| | 0x10 | | | 0x10 |
| + | | |
| | Process PRNG. | | | Process PRNG. |
| |- | | |- |
| | 0x14 | | | 0x14 |
| | 0x04 | | | 0x04 |
| + | | |
| | Padding. | | | Padding. |
| |- | | |- |
| | 0x18 | | | 0x18 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always set to 0. | | | Always set to 0. |
| |- | | |- |
| | 0x20 | | | 0x20 |
| | 0x08 | | | 0x08 |
− | | [[SVC#svcGetInfo|AddressSpaceStart]] right shifted by 0x0C. | + | | |
| + | | [[SVC#GetInfo|AddressSpaceStart]] right shifted by 0x0C. |
| |- | | |- |
| | 0x28 | | | 0x28 |
| | 0x08 | | | 0x08 |
− | | AddressSpaceEnd ([[SVC#svcGetInfo|AddressSpaceStart]] + [[SVC#svcGetInfo|AddressSpaceSize]]) right shifted by 0x0C and aligned to AddressSpaceAlign. | + | | |
| + | | AddressSpaceEnd ([[SVC#GetInfo|AddressSpaceStart]] + [[SVC#GetInfo|AddressSpaceSize]]) right shifted by 0x0C and aligned to AddressSpaceAlign. |
| |- | | |- |
| | 0x30 | | | 0x30 |
| | 0x08 | | | 0x08 |
| + | | |
| | AddressSpaceAlign right shifted by 0x0C. | | | AddressSpaceAlign right shifted by 0x0C. |
| |- | | |- |
| | 0x38 | | | 0x38 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x40 | | | 0x40 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always set to 0. | | | Always set to 0. |
| |- | | |- |
| | 0x48 | | | 0x48 |
| | 0x08 | | | 0x08 |
− | | [[SVC#svcGetInfo|MapRegionBased]] right shifted by 0x0C. | + | | |
| + | | [[SVC#GetInfo|MapRegionBased]] right shifted by 0x0C. |
| |- | | |- |
| | 0x50 | | | 0x50 |
| | 0x08 | | | 0x08 |
− | | MapRegionEnd ([[SVC#svcGetInfo|MapRegionBased]] + [[SVC#svcGetInfo|MapRegionSize]]) right shifted by 0x0C and aligned to MapRegionAlign. | + | | |
| + | | MapRegionEnd ([[SVC#GetInfo|MapRegionBased]] + [[SVC#GetInfo|MapRegionSize]]) right shifted by 0x0C and aligned to MapRegionAlign. |
| |- | | |- |
| | 0x58 | | | 0x58 |
| | 0x08 | | | 0x08 |
| + | | |
| | MapRegionAlign right shifted by 0x0C. | | | MapRegionAlign right shifted by 0x0C. |
| |- | | |- |
| | 0x60 | | | 0x60 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x68 | | | 0x68 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x70 | | | 0x70 |
| | 0x1D0 | | | 0x1D0 |
− | | Main [[Thread_Local_Storage#Thread_context|thread context]]. | + | | |
| + | | Main [[Thread_Local_Region#ThreadType|thread type]]. |
| |- | | |- |
| | 0x240 | | | 0x240 |
| | 0x08 | | | 0x08 |
− | | Pointer to main [[Thread_Local_Storage#Thread_context|thread context]]. | + | | |
| + | | Pointer to main [[Thread_Local_Region#ThreadType|thread type]]. |
| |- | | |- |
| | 0x248 | | | 0x248 |
| | 0x08 | | | 0x08 |
| + | | |
| | Unknown. | | | Unknown. |
| |- | | |- |
| | 0x250 | | | 0x250 |
| | 0x08 | | | 0x08 |
| + | | |
| | Unknown. | | | Unknown. |
| |- | | |- |
| | 0x258 | | | 0x258 |
| | 0x130 | | | 0x130 |
| + | | |
| | Always empty? | | | Always empty? |
| |- | | |- |
| | 0x388 | | | 0x388 |
| | 0x08 | | | 0x08 |
− | | Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388. | + | | |
| + | | Pointer to [[Thread_Local_Region#OsResourceManagerStorage|resource manager storage]] + 0x388. |
| |- | | |- |
| | 0x390 | | | 0x390 |
| | 0x08 | | | 0x08 |
− | | Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388. | + | | |
| + | | Pointer to [[Thread_Local_Region#OsResourceManagerStorage|resource manager storage]] + 0x388. |
| |- | | |- |
| | 0x398 | | | 0x398 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always 0. | | | Always 0. |
| |- | | |- |
| | 0x3A0 | | | 0x3A0 |
| | 0x08 | | | 0x08 |
| + | | |
| | Always 0. | | | Always 0. |
| |} | | |} |
| | | |
− | == Thread context == | + | == ThreadType == |
− | This structure is used for describing each thread's context. In the main thread's case, this structure comes from the [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]]. | + | This is "nn::os::ThreadType". |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 167: |
Line 232: |
| ! Offset | | ! Offset |
| ! Size | | ! Size |
| + | ! Name |
| ! Description | | ! Description |
| |- | | |- |
| | 0x00 | | | 0x00 |
− | | 0x08 | + | | 0x10 |
− | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x1C8. | + | | AllThreadsListNode |
− | |-
| + | | |
− | | 0x08
| |
− | | 0x08
| |
− | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] | |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | 0x08 | + | | 0x10 |
− | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10.
| + | | MultiWaitObjectList |
− | |- | + | | |
− | | 0x18 | |
− | | 0x08
| |
− | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10.
| |
| |- | | |- |
| | 0x20 | | | 0x20 |
| | 0x20 | | | 0x20 |
− | | Empty. | + | | Reserved |
| + | | |
| |- | | |- |
| | 0x40 | | | 0x40 |
− | | 0x04 | + | | 0x01 |
| + | | State |
| | Thread status. | | | Thread status. |
| + | |- |
| + | | 0x41 |
| + | | 0x01 |
| + | | StackIsAliased |
| + | | |
| + | |- |
| + | | 0x42 |
| + | | 0x01 |
| + | | AutoRegistered |
| + | | |
| + | |- |
| + | | 0x43 |
| + | | 0x01 |
| + | | SuspendCount |
| + | | |
| |- | | |- |
| | 0x44 | | | 0x44 |
− | | 0x04 | + | | 0x02 |
| + | | BasePriority |
| | Thread priority minus 0x1C. | | | Thread priority minus 0x1C. |
| + | |- |
| + | | 0x46 |
| + | | 0x02 |
| + | | Version |
| + | | |
| |- | | |- |
| | 0x48 | | | 0x48 |
| | 0x08 | | | 0x08 |
| + | | OriginalStack |
| | Thread stack base address. | | | Thread stack base address. |
| |- | | |- |
| | 0x50 | | | 0x50 |
| | 0x08 | | | 0x08 |
| + | | Stack |
| | Thread stack base address mirror. | | | Thread stack base address mirror. |
| |- | | |- |
| | 0x58 | | | 0x58 |
| | 0x08 | | | 0x08 |
| + | | StackSize |
| | Thread stack size. | | | Thread stack size. |
| |- | | |- |
| | 0x60 | | | 0x60 |
| | 0x08 | | | 0x08 |
− | | Thread stub pointer. | + | | Argument |
| + | | |
| |- | | |- |
| | 0x68 | | | 0x68 |
| | 0x08 | | | 0x08 |
− | | Thread ID. | + | | ThreadFunction |
| + | | |
| |- | | |- |
| | 0x70 | | | 0x70 |
| | 0x08 | | | 0x08 |
− | | Always 0? | + | | CurrentFiber |
| + | | |
| |- | | |- |
| | 0x78 | | | 0x78 |
| | 0x08 | | | 0x08 |
− | | Always 0? | + | | InitialFiber |
| + | | |
| |- | | |- |
| | 0x80 | | | 0x80 |
− | | 0x08
| |
− | | Always 0?
| |
− | |-
| |
− | | 0x88
| |
| | 0x100 | | | 0x100 |
| + | | TlsValueArray |
| | TLS slots. | | | TLS slots. |
| |- | | |- |
− | | 0x188 | + | | 0x180 |
| | 0x20 | | | 0x20 |
| + | | ThreadNameBuffer |
| | Thread name. | | | Thread name. |
| |- | | |- |
− | | 0x1A8 | + | | 0x1A0 |
| | 0x08 | | | 0x08 |
| + | | NamePointer |
| | Thread name address. | | | Thread name address. |
| |- | | |- |
− | | 0x1B0 | + | | 0x1A8 |
| | 0x04 | | | 0x04 |
− | | Critical Section. | + | | CsThread |
| + | | Critical Section Storage. |
| |- | | |- |
− | | 0x1B4 | + | | 0x1AC |
| | 0x04 | | | 0x04 |
− | | Conditional Variable. | + | | CvThread |
| + | | Conditional Variable Storage. |
| |- | | |- |
− | | 0x1B8 | + | | 0x1B0 |
| | 0x04 | | | 0x04 |
| + | | Handle |
| | Thread handle. | | | Thread handle. |
| |- | | |- |
− | | 0x1BC | + | | 0x1B4 |
| | 0x04 | | | 0x04 |
− | | Always 0. | + | | LockHistory |
| + | | |
| |- | | |- |
− | | 0x1C0 | + | | 0x1B8 |
| | 0x08 | | | 0x08 |
− | | Thread global mutex. | + | | ThreadId |
− | |- | + | | |
− | | 0x1C8
| |
− | | 0x08
| |
− | | Unknown.
| |
| |} | | |} |