Changes

2,825 bytes added ,  19:50, 25 September 2017
no edit summary
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.
 
|}
 
|}