Line 103: |
Line 103: |
| |- | | |- |
| | 0x60 | | | 0x60 |
| + | | KPreemptionTimer |
| + | | 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" |
| + | |- |
| + | ! Offset |
| + | ! Type |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| | u32 | | | u32 |
− | | CPU time available in ticks | + | | 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. |