Changes

Jump to navigation Jump to search
904 bytes added ,  01:29, 12 December 2016
no edit summary
Line 99: Line 99:  
|-
 
|-
 
| 0x58
 
| 0x58
| KThread*
+
| KObjectMutex
| Thread operating on the KResourceLimit object
+
| Mutex
 
|-
 
|-
| 0x5C
+
| 0x60
| s16
+
| KPreemptionTimer
| Track errors for the running thread above.
+
| Preemption timer for the current core, see below
 +
|}
 +
 
 +
There are 4 KResourceLimit objects created on the kernel heap. Each is used for a different category specified by the exheader's resource limit category specifier in the exheader [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|ARM11 Local System Capabilities]].
 +
 
 +
'''KPreemptionTimer''':
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x5E
+
!  Offset
| u16
+
! Type
| Unused, alignment
+
!  Description
 
|-
 
|-
| 0x60
+
| 0x0
 
| u32
 
| u32
| Unknown
+
| Max CPU time in ticks for preemption type 0 (default preemption type)
 
|-
 
|-
| 0x64
+
| 0x4
 
| u32
 
| u32
| Unknown
+
| Current timer (in watchdog timer ticks)
 
|-
 
|-
| 0x68
+
| 0x8
 
| u32
 
| u32
| Unknown
+
| Last remembered watchdog timer counter value
 
|-
 
|-
| 0x6C
+
| 0xC
| u32
+
| u32  
| Unknown
+
| Max CPU time in ticks for preemption type 1
 
|}
 
|}
    +
A call to svcSetResourceLimitValues with a limit value of 1000 for CPU time must be done first to set up some global variables and the associated [[KTimeableInterruptEvent]] instances, and another call needs to be made to actually enable preemption.
   −
There are 4 KResourceLimit objects created on the kernel heap. Each is used for a different category specified by the exheader's resource limit category specifier in the exheader [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|ARM11 Local System Capabilities]].
+
Preemption type 0: this is the default, preempts threads on core1 and allow them to run only 2ms * (timeLimit / 100).
 +
 
 +
Preemption type 1: ''seems'' to be borked, it was apparently intended to preempt threads on all cores but seems to only preempt the kernel thread running the preemptor itself and threads on core1... (time slice: 12.5ms * (timeLimit / 100))
 +
 
 +
"Firm" dev consoles can switch between these two types using svcKernelSetState type 6.
516

edits

Navigation menu