Difference between revisions of "Cafe OS syscalls"
Jump to navigation
Jump to search
(Added a few more function names found in various RPLs as function names.) |
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) |
||
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 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#Processes|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. | |
{| 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;" | | + | ! 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 || | + | | 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 || | + | | 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 || | + | | 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 || | + | | 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 || | + | | 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 |