Cafe OS syscalls

Revision as of 07:30, 9 April 2016 by NWPlayer123 (talk | contribs) (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)

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