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.
|}
|}