Kernel ABI
Calling Convention
Seems to be AAPCS-based (with modifications)
Overview
Inputs
r0–r3: Argument / Scratch registers (caller-saved), inherited from AAPCS. If an input is to be placed on the stack, it will instead use the next free register starting fromr0.
Outputs
r0-r1: Result, inherited from AAPCS. If multiple outputs are returned (e.g.,ControlMemory), they are placed in consecutive registers starting fromr0.
Example
Result ControlMemory(uintptr_t* out, uintptr_t addr0, uintptr_t addr1, size_t size, MemoryOperation operation, MemoryPermission permissions)
Inputs
Following standard AAPCS register selection:
r1-> addr0r2-> addr1r3-> size
As there are still more arguments, the next free registers are selected starting from r0
r0-> operationr4-> permissions
Outputs
r0-> Resultr1-> uintptr_t out
System calls
| ID | Name | Inputs | Outputs |
|---|---|---|---|
| 0x01 | ControlMemory |
|
|
| 0x02 | QueryMemory |
|
|
| 0x03 | ExitProcess | None | None, doesn't return |
| 0x04 | GetProcessAffinityMask |
|
|
| 0x05 | SetProcessAffinityMask |
|
|
| 0x06 | GetProcessIdealProcessor |
|
|
| 0x07 | SetProcessIdealProcessor |
|
|
| 0x08 | CreateThread |
|
|
| 0x09 | ExitThread | None | None, doesn't return |
| 0x0A | SleepThread |
|
None |
| 0x0B | GetThreadPriority |
|
|
| 0x0C | SetThreadPriority |
|
|
| 0x0D | GetThreadAffinityMask |
|
|
| 0x0E | SetThreadAffinityMask |
|
|
| 0x0F | GetThreadIdealProcessor |
|
|
| 0x10 | SetThreadIdealProcessor |
|
|
| 0x11 | GetProcessorID |
None |
|
| 0x24 | WaitSynchronization1 |
|
|
| 0x1B | SetTimer | Timer handle, initial_low, interval_low, initial_high, interval_high | Result |
| 0x28 | GetSystemTick | None |
|
| 0x2D | ConnectToPort | ??r1: pointer to port name
|
r0: Resultr1: handle to KClientSession
|
| 0x32 | SendSyncRequest | r0: handle to KClientSession
|
r0: Result |