Line 1: |
Line 1: |
− | This is the 0x200-byte thread-local-storage, the base address is loaded via ARM threadid register tpidrro_el0. | + | This is the 0x200-byte TLS (thread local storage). It's base address is loaded via ARM threadid register tpidrro_el0. |
− | | |
− | == Structure ==
| |
| | | |
| + | = Structure = |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 11: |
Line 10: |
| | 0x0 | | | 0x0 |
| | 0x100 | | | 0x100 |
− | | [[IPC_Marshalling|IPC]] command buffer | + | | [[IPC_Marshalling|IPC]] command buffer. |
| |- | | |- |
| | 0x100 | | | 0x100 |
| | 0xF8 | | | 0xF8 |
− | | ? | + | | Unknown. |
| |- | | |- |
| | 0x1F8 | | | 0x1F8 |
| | 0x8 | | | 0x8 |
− | | Address of threadctx+0x58. | + | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]]. |
| |} | | |} |
| | | |
− | == Userland context ==
| + | = Userland context = |
− | This is the structure of the 0x228-byte threadctx used by official userland software. | + | == Boot paramter == |
| + | This is "nn::os::detail::g_OsBootParamter". |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 31: |
Line 31: |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 | + | | 0x00 |
− | | 0xA8 | + | | 0x04 |
− | | ? | + | | Main thread handle. |
| + | |- |
| + | | 0x04 |
| + | | 0x04 |
| + | | Always 0. |
| + | |- |
| + | | 0x08 |
| + | | 0x30 |
| + | | Empty. |
| + | |} |
| + | |
| + | == Resource manager storage == |
| + | This is "nn::os::detail::g_OsResourceManagerStorage". |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x04 |
| + | | Always 0. |
| + | |- |
| + | | 0x04 |
| + | | 0x10 |
| + | | Process PRNG. |
| + | |- |
| + | | 0x14 |
| + | | 0x04 |
| + | | Padding. |
| + | |- |
| + | | 0x18 |
| + | | 0x08 |
| + | | Always set to 0. |
| + | |- |
| + | | 0x20 |
| + | | 0x08 |
| + | | [[SVC#svcGetInfo|AddressSpaceStart]] right shifted by 0x0C. |
| + | |- |
| + | | 0x28 |
| + | | 0x08 |
| + | | AddressSpaceEnd ([[SVC#svcGetInfo|AddressSpaceStart]] + [[SVC#svcGetInfo|AddressSpaceSize]]) right shifted by 0x0C and aligned to AddressSpaceAlign. |
| + | |- |
| + | | 0x30 |
| + | | 0x08 |
| + | | AddressSpaceAlign right shifted by 0x0C. |
| + | |- |
| + | | 0x38 |
| + | | 0x08 |
| + | | Always 0. |
| + | |- |
| + | | 0x40 |
| + | | 0x08 |
| + | | Always set to 0. |
| + | |- |
| + | | 0x48 |
| + | | 0x08 |
| + | | [[SVC#svcGetInfo|MapRegionBased]] right shifted by 0x0C. |
| + | |- |
| + | | 0x50 |
| + | | 0x08 |
| + | | MapRegionEnd ([[SVC#svcGetInfo|MapRegionBased]] + [[SVC#svcGetInfo|MapRegionSize]]) right shifted by 0x0C and aligned to MapRegionAlign. |
| + | |- |
| + | | 0x58 |
| + | | 0x08 |
| + | | MapRegionAlign right shifted by 0x0C. |
| + | |- |
| + | | 0x60 |
| + | | 0x08 |
| + | | Always 0. |
| + | |- |
| + | | 0x68 |
| + | | 0x08 |
| + | | Always 0. |
| + | |- |
| + | | 0x70 |
| + | | 0x1D0 |
| + | | Main [[Thread_Local_Storage#Thread_context|thread context]]. |
| + | |- |
| + | | 0x240 |
| + | | 0x08 |
| + | | Pointer to main [[Thread_Local_Storage#Thread_context|thread context]]. |
| + | |- |
| + | | 0x248 |
| + | | 0x08 |
| + | | Unknown. |
| + | |- |
| + | | 0x250 |
| + | | 0x08 |
| + | | Unknown. |
| + | |- |
| + | | 0x258 |
| + | | 0x130 |
| + | | Always empty? |
| + | |- |
| + | | 0x388 |
| + | | 0x08 |
| + | | Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388. |
| + | |- |
| + | | 0x390 |
| + | | 0x08 |
| + | | Pointer to [[Thread_Local_Storage#Resource_manager_storage|resource manager storage]] + 0x388. |
| + | |- |
| + | | 0x398 |
| + | | 0x08 |
| + | | Always 0. |
| + | |- |
| + | | 0x3A0 |
| + | | 0x08 |
| + | | Always 0. |
| + | |} |
| + | |
| + | == Thread context == |
| + | 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]]. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x00 |
| + | | 0x08 |
| + | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x1C8. |
| + | |- |
| + | | 0x08 |
| + | | 0x08 |
| + | | Unknown. |
| + | |- |
| + | | 0x10 |
| + | | 0x08 |
| + | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10. |
| + | |- |
| + | | 0x18 |
| + | | 0x08 |
| + | | Pointer to [[Thread_Local_Storage#Thread_context|thread context]] + 0x10. |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Empty. |
| + | |- |
| + | | 0x40 |
| + | | 0x04 |
| + | | Thread status. |
| + | |- |
| + | | 0x44 |
| + | | 0x04 |
| + | | Thread priority minus 0x1C. |
| + | |- |
| + | | 0x48 |
| + | | 0x08 |
| + | | Thread stack base address. |
| + | |- |
| + | | 0x50 |
| + | | 0x08 |
| + | | Thread stack base address mirror. |
| + | |- |
| + | | 0x58 |
| + | | 0x08 |
| + | | Thread stack size. |
| + | |- |
| + | | 0x60 |
| + | | 0x08 |
| + | | Unknown. |
| + | |- |
| + | | 0x68 |
| + | | 0x08 |
| + | | Unknown. |
| + | |- |
| + | | 0x70 |
| + | | 0x08 |
| + | | Always 0? |
| + | |- |
| + | | 0x78 |
| + | | 0x08 |
| + | | Always 0? |
| + | |- |
| + | | 0x80 |
| + | | 0x08 |
| + | | Always 0? |
| + | |- |
| + | | 0x88 |
| + | | 0x100 |
| + | | Initially empty (contains unknown pointers). |
| + | |- |
| + | | 0x188 |
| + | | 0x20 |
| + | | Thread name. |
| + | |- |
| + | | 0x1A8 |
| + | | 0x08 |
| + | | Thread name address. |
| + | |- |
| + | | 0x1B0 |
| + | | 0x04 |
| + | | Always 0. |
| + | |- |
| + | | 0x1B4 |
| + | | 0x04 |
| + | | Always 0. |
| + | |- |
| + | | 0x1B8 |
| + | | 0x04 |
| + | | Thread handle. |
| |- | | |- |
− | | 0xA8 | + | | 0x1BC |
− | | 0x8 | + | | 0x04 |
− | | Address of the stack-bottom-mirror which the thread was created with. | + | | Always 0. |
| |- | | |- |
− | | 0xB0 | + | | 0x1C0 |
− | | 0x8 | + | | 0x08 |
− | | Size of the stack. | + | | Thread global mutex. |
| |- | | |- |
− | | 0xB8 | + | | 0x1C8 |
− | | 0x178 | + | | 0x08 |
− | | ? | + | | Unknown. |
| |} | | |} |