Difference between revisions of "Kernel ABI"

From 3dbrew
Jump to navigation Jump to search
m (QueryMemory permission return is an MemoryPermission enum)
(Specify GetSystemTick ABI)
 
(6 intermediate revisions by 3 users not shown)
Line 12: Line 12:
 
|
 
|
 
<code>r0</code>: <code>[[Memory Management#enum_MemoryOperation|MemoryOperation]] operation</code><br>
 
<code>r0</code>: <code>[[Memory Management#enum_MemoryOperation|MemoryOperation]] operation</code><br>
<code>r1</code>: <code>u32 addr0</code><br>
+
<code>r1</code>: <code>u32/void* addr0</code><br>
<code>r2</code>: <code>u32 addr1</code><br>
+
<code>r2</code>: <code>u32/void* addr1</code><br>
 
<code>r3</code>: <code>u32 size</code><br>
 
<code>r3</code>: <code>u32 size</code><br>
 
<code>r4</code>: <code>[[Memory Management#enum_MemoryPermission|MemoryPermission]] permissions</code>
 
<code>r4</code>: <code>[[Memory Management#enum_MemoryPermission|MemoryPermission]] permissions</code>
 
|
 
|
 
<code>r0</code>: <code>Result</code><br>
 
<code>r0</code>: <code>Result</code><br>
<code>r1</code>: <code>u32 addr_out</code>
+
<code>r1</code>: <code>u32/void* addr_out</code>
 
|-
 
|-
 
| 0x02
 
| 0x02
 
| QueryMemory
 
| QueryMemory
 
|
 
|
<code>r2</code>?: <code>u32 addr</code>
+
<code>r2</code>?: <code>u32/void* addr</code>
 
|
 
|
 
<code>r0</code>: <code>Result</code><br>
 
<code>r0</code>: <code>Result</code><br>
Line 35: Line 35:
 
| ExitProcess
 
| ExitProcess
 
| None
 
| None
| None
+
| None, doesn't return
 
|-
 
|-
 
| 0x04
 
| 0x04
Line 41: Line 41:
 
|
 
|
 
<code>r0</code>: <code>[out] u8* affinitymask</code><br>
 
<code>r0</code>: <code>[out] u8* affinitymask</code><br>
<code>r1</code>: <code>Handle process</code><br>
+
<code>r1</code>: <code>Handle<[[KProcess]]> process</code><br>
 
<code>r2</code>: <code>s32 processorcount</code>
 
<code>r2</code>: <code>s32 processorcount</code>
 
|
 
|
 
<code>r0</code>: <code>Result</code>
 
<code>r0</code>: <code>Result</code>
 
|-
 
|-
| 0x04
+
| 0x05
 
| SetProcessAffinityMask
 
| SetProcessAffinityMask
 
|
 
|
<code>r0</code>: <code>Handle process</code><br>
+
<code>r0</code>: <code>Handle<[[KProcess]]> process</code><br>
<code>r1</code>: <code>[in] u8* affinitymask</code><br>
+
<code>r1</code>: <code>[in] const u8* affinitymask</code><br>
 
<code>r2</code>: <code>s32 processorcount</code>
 
<code>r2</code>: <code>s32 processorcount</code>
 
|
 
|
 
<code>r0</code>: <code>Result</code>
 
<code>r0</code>: <code>Result</code>
 
|-
 
|-
| 0x05
+
| 0x06
 
| GetProcessIdealProcessor
 
| GetProcessIdealProcessor
 
|
 
|
<code>r1</code>?: <code>Handle process</code>
+
<code>r1</code>?: <code>Handle<[[KProcess]]> process</code>
 
|
 
|
 
<code>r0</code>: <code>Result</code><br>
 
<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>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
 
| 0x1B
Line 67: Line 167:
 
| Timer handle, initial_low, interval_low, initial_high, interval_high
 
| Timer handle, initial_low, interval_low, initial_high, interval_high
 
| Result
 
| 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