Kernel ABI

From 3dbrew
Jump to navigation Jump to search

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 from r0.

Outputs

  • r0-r1 : Result, inherited from AAPCS. If multiple outputs are returned (e.g., ControlMemory), they are placed in consecutive registers starting from r0.

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 -> addr0
r2 -> addr1
r3 -> size

As there are still more arguments, the next free registers are selected starting from r0

r0 -> operation
r4 -> permissions

Outputs

r0 -> Result
r1 -> uintptr_t out

System calls

ID Name Inputs Outputs
0x01 ControlMemory

r0: MemoryOperation operation
r1: u32/void* addr0
r2: u32/void* addr1
r3: u32 size
r4: MemoryPermission permissions

r0: Result
r1: u32/void* addr_out

0x02 QueryMemory

r2?: u32/void* addr

r0: Result
r1: u32 base_process_virtual_address
r2: u32 size
r3: MemoryPermission permission
r4: MemoryState state
r5: PageFlags page_flags

0x03 ExitProcess None None, doesn't return
0x04 GetProcessAffinityMask

r0: [out] u8* affinitymask
r1: Handle<KProcess> process
r2: s32 processorcount

r0: Result

0x05 SetProcessAffinityMask

r0: Handle<KProcess> process
r1: [in] const u8* affinitymask
r2: s32 processorcount

r0: Result

0x06 GetProcessIdealProcessor

r1?: Handle<KProcess> process

r0: Result
r1: s32 processorid
r2: Clobbered?

0x07 SetProcessIdealProcessor

r0: Handle<KProcess> process
r1: s32 processorid

r0: Result

0x08 CreateThread

r0: s32 thread_priority
r1: ThreadFunc entrypoint
r2: u32 arg
r3: u32/void* stack_top
r4: s32 processor_id

r0: Result
r1: Handle<KThread> thread_handle

0x09 ExitThread None None, doesn't return
0x0A SleepThread

r0-r1: s64 nanoseconds

None
0x0B GetThreadPriority

r0: Ignored?
r1: Handle thread_handle

r0: Result
r1: s32 thread_priority
r2: Clobbered?

0x0C SetThreadPriority

r0: Handle<KThread> thread_handle
r1: s32 thread_priority

r0: Result

0x0D GetThreadAffinityMask

r0: [out] u8* affinitymask
r1: Handle<KThread> thread_handle
r2: s32 processorcount

r0: Result

0x0E SetThreadAffinityMask

r0: Handle<KThread> thread_handle
r1: [in] const u8* affinitymask
r2: s32 processorcount

r0: Result

0x0F GetThreadIdealProcessor

r0: Ignored?
r1: Handle<KThread> thread_handle

r0: Result
r1: s32 processorid

0x10 SetThreadIdealProcessor

r0: Handle<KThread> thread_handle
r1: s32 processorid

r0: Result

0x11 GetProcessorID

None

r0: s32 processorid

0x24 WaitSynchronization1

r0: Handle<KSynchronizationObject> handle
r2-r3: s64 timeout

r0: Result

0x1B SetTimer Timer handle, initial_low, interval_low, initial_high, interval_high Result
0x28 GetSystemTick None

r0: Low 32 bits of the tick count
r1: High 32 bits of the tick count

0x2D ConnectToPort ??
r1: pointer to port name
r0: Result
r1: handle to KClientSession
0x32 SendSyncRequest r0: handle to KClientSession r0: Result