Difference between revisions of "Kernel ABI"

From 3dbrew
Jump to navigation Jump to search
(Starting the page, just throwing content in there for now.)
 
(Specify GetSystemTick ABI)
 
(10 intermediate revisions by 4 users not shown)
Line 3: Line 3:
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Id
+
ID
 
!  Name
 
!  Name
 
!  Inputs
 
!  Inputs
 
!  Outputs
 
!  Outputs
 +
|-
 +
| 0x01
 +
| ControlMemory
 +
|
 +
<code>r0</code>: <code>[[Memory Management#enum_MemoryOperation|MemoryOperation]] operation</code><br>
 +
<code>r1</code>: <code>u32/void* addr0</code><br>
 +
<code>r2</code>: <code>u32/void* addr1</code><br>
 +
<code>r3</code>: <code>u32 size</code><br>
 +
<code>r4</code>: <code>[[Memory Management#enum_MemoryPermission|MemoryPermission]] permissions</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>u32/void* addr_out</code>
 +
|-
 +
| 0x02
 +
| QueryMemory
 +
|
 +
<code>r2</code>?: <code>u32/void* addr</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>u32 base_process_virtual_address</code><br>
 +
<code>r2</code>: <code>u32 size</code><br>
 +
<code>r3</code>: <code>[[Memory Management#enum_MemoryPermission|MemoryPermission]] permission</code><br>
 +
<code>r4</code>: <code>[[Memory_Management#enum_MemoryState|MemoryState]] state</code><br>
 +
<code>r5</code>: <code>[[Memory_Management#enum_PageFlags|PageFlags]] page_flags</code>
 +
|-
 +
| 0x03
 +
| ExitProcess
 +
| None
 +
| None, doesn't return
 +
|-
 +
| 0x04
 +
| GetProcessAffinityMask
 +
|
 +
<code>r0</code>: <code>[out] u8* affinitymask</code><br>
 +
<code>r1</code>: <code>Handle<[[KProcess]]> process</code><br>
 +
<code>r2</code>: <code>s32 processorcount</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x05
 +
| SetProcessAffinityMask
 +
|
 +
<code>r0</code>: <code>Handle<[[KProcess]]> process</code><br>
 +
<code>r1</code>: <code>[in] const u8* affinitymask</code><br>
 +
<code>r2</code>: <code>s32 processorcount</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x06
 +
| GetProcessIdealProcessor
 +
|
 +
<code>r1</code>?: <code>Handle<[[KProcess]]> process</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>s32 processorid</code><br>
 +
<code>r2</code>: Clobbered?
 +
|-
 +
| 0x07
 +
| SetProcessIdealProcessor
 +
|
 +
<code>r0</code>: <code>Handle<[[KProcess]]> process</code><br>
 +
<code>r1</code>: <code>s32 processorid</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
|-
 +
| 0x08
 +
| CreateThread
 +
|
 +
<code>r0</code>: <code>s32 thread_priority</code><br>
 +
<code>r1</code>: <code>ThreadFunc entrypoint</code><br>
 +
<code>r2</code>: <code>u32 arg</code><br>
 +
<code>r3</code>: <code>u32/void* stack_top</code><br>
 +
<code>r4</code>: <code>s32 processor_id</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>Handle<[[KThread]]> thread_handle</code>
 +
|-
 +
| 0x09
 +
| ExitThread
 +
| None
 +
| None, doesn't return
 +
|-
 +
| 0x0A
 +
| SleepThread
 +
|
 +
<code>r0-r1</code>: <code>s64 nanoseconds</code>
 +
| None
 +
|-
 +
| 0x0B
 +
| GetThreadPriority
 +
|
 +
<code>r0</code>: Ignored?<br>
 +
<code>r1</code>: <code>Handle thread_handle</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>s32 thread_priority</code><br>
 +
<code>r2</code>: Clobbered?
 +
|-
 +
| 0x0C
 +
| SetThreadPriority
 +
|
 +
<code>r0</code>: <code>Handle<[[KThread]]> thread_handle</code><br>
 +
<code>r1</code>: <code>s32 thread_priority</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x0D
 +
| GetThreadAffinityMask
 +
|
 +
<code>r0</code>: <code>[out] u8* affinitymask</code><br>
 +
<code>r1</code>: <code>Handle<[[KThread]]> thread_handle</code><br>
 +
<code>r2</code>: <code>s32 processorcount</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x0E
 +
| SetThreadAffinityMask
 +
|
 +
<code>r0</code>: <code>Handle<[[KThread]]> thread_handle</code><br>
 +
<code>r1</code>: <code>[in] const u8* affinitymask</code><br>
 +
<code>r2</code>: <code>s32 processorcount</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x0F
 +
| GetThreadIdealProcessor
 +
|
 +
<code>r0</code>: Ignored?<br>
 +
<code>r1</code>: <code>Handle<[[KThread]]> thread_handle</code>
 +
|
 +
<code>r0</code>: <code>Result</code><br>
 +
<code>r1</code>: <code>s32 processorid</code>
 +
|-
 +
| 0x10
 +
| SetThreadIdealProcessor
 +
|
 +
<code>r0</code>: <code>Handle<[[KThread]]> thread_handle</code><br>
 +
<code>r1</code>: <code>s32 processorid</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x11
 +
| GetProcessorID
 +
|
 +
None
 +
|
 +
<code>r0</code>: <code>s32 processorid</code>
 +
|-
 +
| 0x24
 +
| WaitSynchronization1
 +
|
 +
<code>r0</code>: <code>Handle<[[KSynchronizationObject]]> handle</code><br>
 +
<code>r2-r3</code>: <code>s64 timeout</code>
 +
|
 +
<code>r0</code>: <code>Result</code>
 +
|-
 +
| 0x1B
 +
| SetTimer
 +
| Timer handle, initial_low, interval_low, initial_high, interval_high
 +
| Result
 +
|-
 +
| 0x28
 +
| GetSystemTick
 +
| None
 +
|
 +
<code>r0</code>: <code>Low 32 bits of the tick count</code>
 +
<br><code>r1</code>: <code>High 32 bits of the tick count</code>
 
|-
 
|-
 
| 0x2D
 
| 0x2D
 
| ConnectToPort
 
| ConnectToPort
| ??, pointer to port name
+
| ??<br><code>r1</code>: <code>pointer to port name</code>
| Result, handle to [[KClientSession]]
+
| <code>r0</code>: <code>Result</code><br><code>r1</code>: <code>handle to [[KClientSession]]</code>
 
|-
 
|-
 
| 0x32
 
| 0x32
 
| SendSyncRequest
 
| SendSyncRequest
| handle to [[KClientSession]]
+
| <code>r0</code>: <code>handle to [[KClientSession]]</code>
| Result
+
| <code>r0</code>: <code>Result<code>
 
|}
 
|}

Latest revision as of 11:35, 12 August 2023

Inputs are read from registers starting from r0 and outputs are written back to the same registers (also starting with r0).

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