Size : 0x74 bytes
|0x0||u32||Pointer to vtable|
|0x24||s32||Max shared memory|
|0x28||s32||Max address arbiter|
|0x2C||s32||Max CPU time|
|0x4C||s32||Current shared memory|
|0x50||s32||Current address arbiter|
|0x54||s32||Current CPU time|
|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 ARM11 Local System Capabilities.
|0x0||u32||Max CPU time in ticks for preemption type 0 (default preemption type)|
|0x4||u32||Current timer (in watchdog timer ticks)|
|0x8||u32||Last remembered watchdog timer counter value|
|0xC||u32||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.
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.