Line 1: |
Line 1: |
− | [[Category:Kernel objects]] | + | [[Category:Kernel synchronization objects]] |
− | class [[KThread]] extends [[KSynchronizationObject]]; | + | [[Category:Kernel interrupt events]] |
| + | class [[KThread]] extends [[KSynchronizationObject]], [[KTimeableInterruptEvent]], [[KSendableInterruptEvent]] and [[KSchedulableInterruptEvent]]; |
| | | |
| Size : 0xB0 bytes | | Size : 0xB0 bytes |
Line 6: |
Line 7: |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Offset | + | ! Offset |
| ! Type | | ! Type |
− | ! Description | + | ! Description |
| |- | | |- |
| | 0x0 | | | 0x0 |
Line 31: |
Line 32: |
| |- | | |- |
| | 0x14 | | | 0x14 |
− | | u32 | + | | [[KTimeableInterruptEvent]] |
− | | Start of 0x10 byte unnamed kernel object in KThread | + | | Used to suspend threads (*this) |
| |- | | |- |
| | 0x24 | | | 0x24 |
− | | u32 | + | | [[KSendableInterruptEvent]] |
− | | Start of 0x8 byte unnamed kernel object in KThread | + | | Interrupt event (*this) sent to terminate a thread, except in the case just below |
| |- | | |- |
| | 0x2C | | | 0x2C |
− | | u32 | + | | [[KSchedulableInterruptEvent]] |
− | | Start of unnamed kernel object of undetermined size in KThread | + | | Interrupt event (*this) scheduled by the IRQ handler when the thread should terminate (*this) |
| |- | | |- |
| | 0x34 | | | 0x34 |
| | u8 | | | u8 |
− | | Used to signal (re)scheduling | + | | Scheduling mask |
| |- | | |- |
| | 0x35 | | | 0x35 |
| | u8 | | | u8 |
− | | Used in syncing | + | | Set to 1 when a thread is woken up from a svcSendSyncRequest call due to the ServerSession endpoint closing down |
| |- | | |- |
| | 0x36 | | | 0x36 |
| | s8 | | | s8 |
− | | ? | + | | Indicates that the thread shall terminate |
| |- | | |- |
| | 0x37 | | | 0x37 |
| | u8 | | | u8 |
− | | Used in syncing | + | | Indicates there was an error translating the parameters in the command buffer during an IPC call |
| |- | | |- |
| | 0x38 | | | 0x38 |
Line 69: |
Line 70: |
| | u32 | | | u32 |
| | Pointer to object the KThread is waiting on- can be a timer, event, session, etc. | | | Pointer to object the KThread is waiting on- can be a timer, event, session, etc. |
| + | |- |
| + | | 0x44 |
| + | | Result |
| + | | Status for object above |
| |- | | |- |
| | 0x48 | | | 0x48 |
− | | u32 | + | | KObjectMutex* |
− | | Double pointer to KThread of unknown use/creation - used in scheduler | + | | Locking kernel mutex |
| |- | | |- |
| | 0x4C | | | 0x4C |
| | u32 | | | u32 |
| | Arbitration address | | | Arbitration address |
| + | |- |
| + | | 0x50 |
| + | | KLinkedListNode* |
| + | | Pointer to first KLinkedListNode in node list of objects this thread is waiting on |
| + | |- |
| + | | 0x54 |
| + | | KLinkedListNode* |
| + | | Pointer to last KLinkedListNode in node list of objects this thread is |
| |- | | |- |
| | 0x5C | | | 0x5C |
− | | KMutex*(?) | + | | [[KMutex|KMutexLinkedList]] * |
− | | Set to KMutex+0x14 in some very specific circumstances | + | | Set in some very specific circumstances |
| |- | | |- |
| | 0x60 | | | 0x60 |
Line 100: |
Line 113: |
| | 0x70 | | | 0x70 |
| | s32 | | | s32 |
− | | Processor that created the thread | + | | Processor that created the thread (in the sense of "first ran") ; processor the thread is running in |
| + | |- |
| + | | 0x74 |
| + | | [[KResourceLimit|KPreemptionTimer]] * |
| + | | Points to [[KResourceLimit]]+0x60, which among other things holds the amount of CPU time available in ticks, or NULL |
| |- | | |- |
| | 0x7C | | | 0x7C |
| | u8 | | | u8 |
− | | ? | + | | Thread is alive |
| |- | | |- |
| | 0x7D | | | 0x7D |
| | u8 | | | u8 |
− | | ? | + | | Thread has been terminated |
| |- | | |- |
| | 0x7E | | | 0x7E |
Line 136: |
Line 153: |
| | 0x94 | | | 0x94 |
| | void* | | | void* |
− | | Ptr to threadlocalstorage | + | | Ptr to [[Thread Local Storage]] |
| |- | | |- |
| | 0x98 | | | 0x98 |
| | void* | | | void* |
− | | Ptr to threadlocalstorage in FCRAM via kernel vmem | + | | Ptr to [[Thread Local Storage]] in FCRAM via kernel vmem |
| |- | | |- |
| | 0xA0 | | | 0xA0 |
− | | KThread* | + | | KThreadLinkedListNode |
− | | Previous (virtual address)
| + | | Previous and next scheduled threads |
| + | |- |
| + | | 0xA8 |
| + | | KThreadLinkedList * |
| + | | Pointer to linked list of scheduled threads that has stolen it, or 0 if in normal list |
| + | |- |
| + | | 0xAC |
| + | | s32 |
| + | | Priority to restore after sleep if suspended, otherwise -1 |
| + | |} |
| + | |
| + | With the following declarations: <code>struct KThreadLinkedList { KThread *first, *last; };</code> and <code>struct KThreadLinkedListNode { KThread *prev, *next; };</code>. |
| + | |
| + | =Thread Scheduling Mask= |
| + | The thread scheduling mask is made of a low nibble (enum) and a high nibble (bitfield). |
| + | |
| + | Low nibble: |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value |
| + | ! Description |
| + | |- |
| + | | 0 |
| + | | The thread is not scheduled |
| |- | | |- |
− | | 0xA4 | + | | 1 |
− | | KThread* | + | | The thread is scheduled |
− | | Next (virtual address)
| |
| |- | | |- |
− | | 0xA8 | + | | 2 |
− | | struct { KThread* first; KThread* last; } ptr | + | | The thread is being terminated |
− | | Pointer to linked list that has stolen it, or 0 if in normal list
| |
| |} | | |} |
| | | |
| + | High nibble: |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Mask |
| + | ! Description |
| + | |- |
| + | | 0 |
| + | | Nothing special |
| + | |- |
| + | | 0x8 (bit 3) |
| + | | The thread has been debug-locked |
| + | |} |
| | | |
| + | A thread is scheduled *if and only if* its (full) scheduling mask is exactly 1. This allows debug-(un)locking of threads to be done transparently. |
| =Thread Affinity Mask= | | =Thread Affinity Mask= |
| | | |