In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Cafe OS syscalls"

From WiiUBrew
Jump to navigation Jump to search
(Added a few more function names found in various RPLs as function names.)
(TODO: Not actually sure which RAMPID system it uses, I assume Browser is always 4? Also, "OS" prefix is only for userspace symbols eg coreinit to mark what is a syscall)
Line 8: Line 8:
 
Normal syscalls are divisible by 0x100, so all of them will jump to FFF0021A0 itself, which is a jump to the table dispatcher.
 
Normal syscalls are divisible by 0x100, so all of them will jump to FFF0021A0 itself, which is a jump to the table dispatcher.
  
The dispatcher uses the RAMPID and syscall it was sent to load an address from its table which it then jumps to (which, if zero, just crashes as it's invalid).
+
The dispatcher uses a RAMPID and the syscall table at FFEAAA40 (5.5.0) to get the secondary table each RAMPID is able to access.
  
Below is all RAMPIDs' access to syscalls. The loader mostly has its own special variations of syscalls.
+
0 (Kernel), 2, and 3 all use the empty table, root.rpx has its own table with a few unique calls, RAMPID 4, 5, and 6 share "syscall_system", and apps/games (RAMPID 7) have their own. See [[Cafe OS#Processes|Cafe OS]] wiki page for more info.
  
RAMPID 1, system (home menu, browser, and error handler), and apps/games usually all have access to the same syscalls.
+
Below is a list of what all of them, as well as the loader which has its own barebones table, have access to call.
  
 
{| class="wikitable sortable"
 
{| class="wikitable sortable"
Line 18: Line 18:
 
! scope="col" | #
 
! scope="col" | #
 
! scope="col" | Name
 
! scope="col" | Name
! scope="col" style="width: 24px;" | ID 1
+
! scope="col" style="width: 24px;" | root
 
! scope="col" style="width: 24px;" | Sys
 
! scope="col" style="width: 24px;" | Sys
 
! scope="col" style="width: 24px;" | App
 
! scope="col" style="width: 24px;" | App
Line 91: Line 91:
 
| 0x1B00 || SetInfo || Y || Y || Y || N
 
| 0x1B00 || SetInfo || Y || Y || Y || N
 
|-
 
|-
| 0x1C00 || OSThreadInit || Y || Y || Y || N
+
| 0x1C00 || ThreadInit || Y || Y || Y || N
 
|-
 
|-
 
| 0x1D00 || SendICI || Y || Y || Y || N
 
| 0x1D00 || SendICI || Y || Y || Y || N
Line 163: Line 163:
 
| 0x4900 || SavesDone_ReadyToRelease || Y || Y || Y || N
 
| 0x4900 || SavesDone_ReadyToRelease || Y || Y || Y || N
 
|-
 
|-
| 0x4A00 || OSSetAlarm || Y || Y || Y || N
+
| 0x4A00 || SetAlarm || Y || Y || Y || N
 
|-
 
|-
 
| 0x4B00 || SetDABR || Y || Y || Y || N
 
| 0x4B00 || SetDABR || Y || Y || Y || N
Line 233: Line 233:
 
| 0x6E00 || SwitchSecCodeGenMode || Y || Y || Y || N
 
| 0x6E00 || SwitchSecCodeGenMode || Y || Y || Y || N
 
|-
 
|-
| 0x6F00 || OSIopShell_RegisterCallback || Y || Y || Y || N
+
| 0x6F00 || IopShell_RegisterCallback || Y || Y || Y || N
 
|-
 
|-
 
| 0x7000 || GetTitleVersion || Y || Y || Y || N
 
| 0x7000 || GetTitleVersion || Y || Y || Y || N
Line 255: Line 255:
 
| 0x7900 || LoadShared || Y || N || N || N
 
| 0x7900 || LoadShared || Y || N || N || N
 
|-
 
|-
| 0x7A00 || OSSetExceptionCallback || Y || Y || Y || N
+
| 0x7A00 || SetExceptionCallback || Y || Y || Y || N
 
|-
 
|-
 
| 0x7B00 || IopShell_InjectCommand || Y || Y || Y || N
 
| 0x7B00 || IopShell_InjectCommand || Y || Y || Y || N
Line 267: Line 267:
 
| 0x7F00 || GetSystemMode || Y || Y || Y || N
 
| 0x7F00 || GetSystemMode || Y || Y || Y || N
 
|-
 
|-
| 0x8000 || OSSystemMode_RegisterCallback || Y || Y || Y || N
+
| 0x8000 || SystemMode_RegisterCallback || Y || Y || Y || N
 
|-
 
|-
 
| 0x8100 || ZeroProcessMemory || Y || N || N || N
 
| 0x8100 || ZeroProcessMemory || Y || N || N || N

Revision as of 07:30, 9 April 2016

Cafe OS syscalls are issued by doing the following:

li r0, 0x0100 # load syscall value->r0
sc            # syscall instruction
blr           # return control to program

When you send a call to the kernel, it goes to FFF00C00, which then jumps to FFF021A0 + (fastcall << 5).

Normal syscalls are divisible by 0x100, so all of them will jump to FFF0021A0 itself, which is a jump to the table dispatcher.

The dispatcher uses a RAMPID and the syscall table at FFEAAA40 (5.5.0) to get the secondary table each RAMPID is able to access.

0 (Kernel), 2, and 3 all use the empty table, root.rpx has its own table with a few unique calls, RAMPID 4, 5, and 6 share "syscall_system", and apps/games (RAMPID 7) have their own. See Cafe OS wiki page for more info.

Below is a list of what all of them, as well as the loader which has its own barebones table, have access to call.

# Name root Sys App Ldr
0x0000 ConsoleWrite Y Y Y Y (sp)
0x0006 LoadContext ? ? ? ?
0x0008 SetContext ? ? ? ?
0x0009 GetCurrentFPUContext ? ? ? ?
0x000A SetCurrentFPUContext ? ? ? ?
0x000C WriteGatherInit ? ? ? ?
0x000D SetPerformanceMonitor ? ? ? ?
0x0011 ReadRegister32Ex ? ? ? ?
0x0012 WriteRegister32Ex ? ? ? ?
0x0017 WriteGatherGetPtr ? ? ? ?
0x0019 GetSecurityLevel (always zero) ? ? ? ?
0x0100 AppPanic Y Y Y Y
0x0200 EffectiveToPhysical Y Y Y N
0x0300 PhysicalToEffectiveCached Y Y Y N
0x0400 PhysicalToEffectiveUncached Y Y Y N
0x0500 ValidateAddrRange Y Y Y Y
0x0600 UpdateCoreTime Y Y Y N
0x0800 SetUserModeExHandler Y Y Y N
0x0B00 AllocateTimer Y Y Y N
0x0C00 FreeTimer Y Y Y N
0x0D00 PrimeTimer Y Y Y N
0x0E00 StopTimer Y Y Y N
0x0F00 LogLoadedRPLs Y Y Y N
0x1000 SetInterruptHandler Y Y Y N
0x1100 GetInterruptHandler Y Y Y N
0x1200 DisableInterrupt Y Y Y N
0x1300 EnableInterrupt Y Y Y N
0x1400 ClearAndEnableInterrupt Y Y Y N
0x1500 GetInterruptStatus Y Y Y N
0x1600 ClearInterruptStatus Y Y Y N
0x1700 FindClosestSymbol Y Y Y Y (sp)
0x1900 Exit/Halt Y Y Y N
0x1A00 GetInfo Y Y Y N
0x1B00 SetInfo Y Y Y N
0x1C00 ThreadInit Y Y Y N
0x1D00 SendICI Y Y Y N
0x1E00 IPCKDriver_{Loader|User}Open Y Y Y Y (sp)
0x1F00 IPCKDriver_{Loader|User}Close Y Y Y Y (sp)
0x2000 IPCKDriver_SubmitRequest Y Y Y Y (sp)
0x2200 GetEnvironmentVariable Y Y Y N
0x2700 GetNotifyTarget Y Y Y N
0x2800 ProcCtrl Y Y Y N
0x2900 GetForegroundBucket Y Y Y N
0x2A00 RequestSwitch Y Y Y N
0x2B00 PrepareTitle Y Y Y N
0x2C00 ProcYield Y Y Y N
0x2E00 GetSystemMessage Y Y Y N
0x2F00 GetCallArgs Y Y Y N
0x3000 GetAbsoluteSystemTimeInternal Y Y Y N
0x3100 SetAbsoluteSystemTimeInternal Y Y Y N
0x3200 Driver_Register Y Y Y N
0x3300 Driver_Deregister Y Y Y N
0x3800 AllocVirtAddr Y Y Y N
0x3900 FreeVirtAddr Y Y Y N
0x3A00 GetMapVirtAddrRange Y Y Y N
0x3B00 GetDataPhysAddrRange Y Y Y N
0x3C00 GetAvailPhysAddrRange Y Y Y N
0x3D00 MapMemory Y Y Y N
0x3E00 UnmapMemory Y Y Y N
0x3F00 LogBuffer Y Y Y Y
0x4000 LogArgs Y Y Y Y
0x4100 LogFunc Y Y Y Y
0x4200 LogReportKernel Y Y Y Y
0x4300 LogRetrieve Y Y Y Y
0x4400 ??? Y Y Y N
0x4500 ??? Y Y Y N
0x4600 ??? Y Y Y N
0x4700 Driver_CopyFromSaveArea Y Y Y N
0x4800 Driver_CopyToSaveArea Y Y Y N
0x4900 SavesDone_ReadyToRelease Y Y Y N
0x4A00 SetAlarm Y Y Y N
0x4B00 SetDABR Y Y Y N
0x4C00 SetIABR Y Y Y N
0x4D00 GetProcessInfo Y Y Y N
0x4E00 GetCodegenVirtAddrRange Y Y Y N
0x4F00 LoaderCall Y Y Y N
0x5000 RPLLoaderResumeContext N N N Y
0x5200 WaitIopComplete N N N Y
0x5300 FlushCode N N N Y
0x5400 FlushData N N N Y
0x5500 UpdateHeartbeat N N N Y
0x5600 LogEntry N N N Y
0x5700 FastClearMemory N N N Y
0x5800 GetBusClockSpeed N N N Y
0x5900 GetSharedArea Y Y Y N
0x5A00 SendPolicy Y Y Y N
0x5B00 GetProcessIndex N N N Y
0x5C00 IPCKDriver_PollLoaderCompletion N N N Y
0x5D00 BlockLogSave Y Y Y N
0x5E00 FinishInitandPreload N N N Y
0x5F00 ContinueStartProcess N N N Y
0x6000 OpenMCP N N N Y
0x6100 QuerySwitchReady Y Y Y N
0x6200 ??? Y Y Y N
0x6300 ??? Y Y Y N
0x6400 SetTimeInternal N Y N N
0x6500 (blr) Y Y Y N
0x6600 ProfileEntry (blr) N N N Y
0x6700 RequestFastExit Y Y Y N
0x6800 CoreInitDone Y Y Y N
0x6900 GetSwitchTarget Y Y Y N
0x6A00 AcquireDone Y Y Y N
0x6B00 GetBuiltSDKVersion Y Y Y N
0x6C00 SystemFatal Y Y Y N
0x6E00 SwitchSecCodeGenMode Y Y Y N
0x6F00 IopShell_RegisterCallback Y Y Y N
0x7000 GetTitleVersion Y Y Y N
0x7100 IsTestKernel Y Y Y N
0x7200 ForceFullRelaunch Y Y Y N
0x7300 Recycle Y N N N
0x7400 get_mode_flags(?) Y Y Y Y
0x7500 QueryVirtAddr Y Y Y N
0x7600 GetCodegenCore Y Y Y N
0x7700 GetSecCodeGenMode Y Y Y N
0x7800 CodegenCopy Y Y Y N
0x7900 LoadShared Y N N N
0x7A00 SetExceptionCallback Y Y Y N
0x7B00 IopShell_InjectCommand Y Y Y N
0x7C00 Kill Y Y Y N
0x7D00 EnableOverlayArena Y Y Y N
0x7E00 DisableOverlayArena Y Y Y N
0x7F00 GetSystemMode Y Y Y N
0x8000 SystemMode_RegisterCallback Y Y Y N
0x8100 ZeroProcessMemory Y N N N
0x8200 HandleIopPowerEvents Y Y Y N
0x8300 ??? Y Y Y Y
0x8400 ??? N N N Y