KResourceLimit: Difference between revisions

Neimod (talk | contribs)
Created page with "Category:Kernel objects class KResourceLimit extends KAutoObject;"
 
No edit summary
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Kernel objects]]
[[Category:Kernel auto objects]]
class [[KResourceLimit]] extends [[KAutoObject]];
class [[KResourceLimit]] extends [[KAutoObject]];
Size : 0x74 bytes
{| class="wikitable" border="1"
|-
!  Offset
! Type
!  Description
|-
| 0x0
| u32
| Pointer to vtable
|-
| 0x4
| u32
| Reference count
|-
| 0x8
| s32
| Max Priority
|-
| 0xC
| s32
| Max commit
|-
| 0x10
| s32
| Max thread
|-
| 0x14
| s32
| Max event
|-
| 0x18
| s32
| Max mutex
|-
| 0x1C
| s32
| Max semaphore
|-
| 0x20
| s32
| Max timer
|-
| 0x24
| s32
| Max shared memory
|-
| 0x28
| s32
| Max address arbiter
|-
| 0x2C
| s32
| Max CPU time
|-
| 0x30
| s32
| Current Priority
|-
| 0x34
| s32
| Current commit
|-
| 0x38
| s32
| Current thread
|-
| 0x3C
| s32
| Current event
|-
| 0x40
| s32
| Current mutex
|-
| 0x44
| s32
| Current semaphore
|-
| 0x48
| s32
| Current timer
|-
| 0x4C
| s32
| Current shared memory
|-
| 0x50
| s32
| Current address arbiter
|-
| 0x54
| s32
| Current CPU time
|-
| 0x58
| KObjectMutex
| Mutex
|-
| 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
| 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.