35 KiB
libSceSystemService technical debt
Silent stubs
- libSceSystemService -
sceSystemServicePowerTick,sceSystemServiceReportAbnormalTermination,sceSystemServiceDisableMusicPlayer,sceSystemServiceReenableMusicPlayer,sceSystemServiceDisableMediaPlayandsceSystemServiceReenableMediaPlayreturn success and do nothing: the host has no auto power-off timer to reset, no system crash reporter to notify, no system music player to pause or resume and no system media playback to disable. PPSA01521 callssceSystemServiceDisableMediaPlayduring start-up, and its wrappers for both pass no arguments - sceSystemServiceLaunchWebBrowser (libSceSystemService) - AnyPS5 launches no web browser, so the call fails and nothing is shown. RommPS PPSA76677 then tells the player to scan its QR code instead
- sceSystemServiceShowControllerSettings (libSceSystemService) - returns success without showing the controller settings: AnyPS5 has no system UI to open. Cat Quest III (PPSA15065) imports it
- sceSystemServiceShowDisplaySafeAreaSettings (libSceSystemService) - returns success without showing the display safe area settings dialog: AnyPS5 has no system UI to open. PPSA03332 imports it, and the no-argument signature is assumed: Orbital has
sceSystemServiceShowControllerSettingsbut not this call - sceSystemServiceOpenChallengeActivity (libSceSystemService) - returns success without opening the challenge activity: AnyPS5 has no system UI to open. Cat Quest III (PPSA15065) imports it
- sceSystemServiceOpenTournamentOccurrence (libSceSystemService) - returns success without opening the tournament occurrence: AnyPS5 has no system UI to open
Unknown function info
-
sceSystemServiceAddLocalProcessForPsmKit, sceSystemServiceKillLocalProcessForPsmKit (libSceSystemService) - AnyPS5 runs one process and starts or stops no other, so both throw without reading their arguments. The parameters follow Forever Launcher's own firmware 5.50 probes (
ps5/probes/localprocin bizkut/ps5-forever): a path, a null-terminated argv and a 0x90-byte parameter block in, a handle out; the kill takes that handle. Their results on the console are unknown. Forever Launcher (PPSA99030) imports both and stops at load without them. -
sceSystemServiceLaunchApp (libSceSystemService) - AnyPS5 runs one title and cannot start another, so every call throws without reading its arguments. The (title ID, null-terminated argv, launch parameters) signature follows SharpProspero, whose
AppLauncherProspero Explorer (PPSA99109) and Prospero Multi Tools (PPSA99110) import it through and which passes a 0x20-byte launch context or null; the console's argument checks and errors are unknown -
sceSystemServiceLaunchWebBrowser: the native export takes one URI argument. Null input, the 6015-byte length limit and supported scheme checks are recovered. The host still returns kernel
EOPNOTSUPPfor valid input; a missing browser service's native error is unresolved. -
sceSystemServiceParamGetString (libSceSystemService) - the system name (parameter 6) is the fixed
PS5, not the console's name. As in a payload process on a PS5 (firmware 13.60), the name is written NUL-padded to the whole buffer, and a buffer under 65 bytes, a null buffer or any other parameter returnsSYSTEM_SERVICE_ERROR_PARAMETERwithout writing. Parameters 0 to 40, 100 to 110, 1000 to 1010, -1 andINT_MAXwere tried there; the others are assumed to fail the same way. PPSA26344 at0xA87935passes parameter 6 with a 65-byte buffer -
sceSystemServiceParamGetInt (libSceSystemService) - console language numbers 0 to 29 follow the PS4 SDK enum in OpenOrbis (21 Arabic). 30 (Ukrainian) is not in it and follows PPSA99505 (Jelly5) and PPSA99002 (ProsperoLight), whose numbers agree with the enum. Not confirmed on a console, and neither title starts on
mainyet. Parameter 400 returns the same number as parameter 1: PPSA01325 asks for 400 first, asks for 1 when that fails, and uses either answer as an index into the same 31 languages; in the PS5 10.01 and 12.60libSceSystemServicemodules parameter 400 reads the same registry value as parameter 1, without parameter 1's mapping of newer language numbers by SDK version, and returns 0x80a10003 when an imported check that is not identified returns 1; the 4.03 module has no parameter 400. Neither the mapping nor that error is modelled, and the parameter's name is not known. WithoutANYPS5_LANGUAGEthe language is English (United States); the date format, time format and enter button stay fixed -
sceSystemServiceParamGetInt (libSceSystemService) - the time zone (parameter 4) and summer time (parameter 5) follow the host's local time zone at the moment of the call. Titles compute the local time as UTC plus the time zone in minutes plus 60 minutes when summer time is 1 (Apollo, GoldHEN's frame logger, and SharpProspero calls them the offset from UTC in minutes and whether summer time is in effect), so the time zone is the host's current offset east of UTC less the summer time shift while summer time is in effect: 60 minutes on Linux, and on Windows the C runtime's own summer time bias (
_get_dstbias), which is also what shifted its local time. For a host zone whose summer time is not one hour, Linux keeps the sum right and the standard offset wrong, and Windows the opposite; how the console reports such a zone is unknown. libkernel'ssceKernelConvertUtcToLocaltime,sceKernelConvertLocaltimeToUtcandsceKernelGettimezonestill use UTC -
sceSystemServiceInitializePlayerDialogParam (libSceSystemService) - a null param throws: what the console does with it is not measured. The console run in prosper shows only the 0x40 bytes written (size 0x40, user ID -1 at 0xC, zeros), so the field names and the mode and target account fields follow SharpProspero's struct, and the
voidreturn its declaration; the console left 0x800693020 inrax, not an SCE error code. Closes when: the null case is measured on a PS5 -
libSceSystemService pending exports: unreviewed argument lists and service behavior remain unresolved. The C decompilation contains 381 of the 477 pending names; additional exports exist as direct assembly jumps, so absence from that listing does not imply absence from the module. Confirmed argument lists are being restored independently of their protected throwing bodies; remaining empty declarations must not be treated as proof of a zero-argument ABI.
-
sceSystemServiceLaunchSystemDeeplink (libSceSystemService) - unknown signature
-
sceShellCoreUtilLaunchByUriParamInit (libSceSystemService) - unknown signature
-
sceSystemStateMgrTickVideoPlayback (libSceSystemService) - unknown signature
-
sceSystemServiceTelemetrySetData2WithUserId (libSceSystemService) - unknown signature
-
sceShellCoreUtilStartUmmDictation (libSceSystemService) - unknown signature
-
sceSystemServiceGetSpotifyTitleId (libSceSystemService) - unknown signature
-
sceSystemServiceGetAppStatusListContainsDaemon (libSceSystemService) - unknown signature
-
sceSystemServiceSwitchToVRApp (libSceSystemService) - unknown signature
-
sceSystemServiceSwitchToNonVRApp (libSceSystemService) - unknown signature
-
sceLncUtilGetSpmemAllocatorConfigValue (libSceSystemService) - unknown signature
-
sceCsbMgrInitialize (libSceSystemService) - unknown signature
-
sceCsbMgrTerminate (libSceSystemService) - unknown signature
-
sceCsbMgrCreateLocalSandbox (libSceSystemService) - unknown signature
-
sceCsbMgrDestroyLocalSandbox (libSceSystemService) - unknown signature
-
sceCsbMgrSwitchLocalSandbox (libSceSystemService) - unknown signature
-
sceCsbMgrGetCurrentLocalSandboxId (libSceSystemService) - unknown signature
-
sceCsbMgrGetLocalSandboxIdList (libSceSystemService) - unknown signature
-
sceCsbMgrGetLocalSandboxInfo (libSceSystemService) - unknown signature
-
sceCsbMgrSetLocalSandboxInfo (libSceSystemService) - unknown signature
-
sceCsbMgrIssueStreamingSandboxInfo (libSceSystemService) - unknown signature
-
sceReportSequenceHandlerRequestReport (libSceSystemService) - unknown signature
-
sceReportSequenceHandlerCancelReport (libSceSystemService) - unknown signature
-
sceReportSequenceHandlerExistsEvent (libSceSystemService) - unknown signature
-
sceReportSequenceHandlerUpdateEventCache (libSceSystemService) - unknown signature
-
sceReportSequenceHandlerGetEventCache (libSceSystemService) - unknown signature
-
sceLncUtilRegisterCallEntries (libSceSystemService) - unknown signature
-
sceLncUtilGetSpmemConfigJson (libSceSystemService) - unknown signature
-
sceLncUtilExportSpmemConfigJson (libSceSystemService) - unknown signature
-
sceLncUtilImportSpmemConfigJson (libSceSystemService) - unknown signature
-
sceShellCoreUtilExitAppWithValue (libSceSystemService) - unknown signature
-
sceShellCoreUtilNpDebugSpecialNotification (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsDddTemperatureDanger (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsM2StorageTemperatureDanger (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetAvailableSizeM2 (libSceSystemService) - unknown signature
-
sceShellCoreUtilNotifyConnectAccountStatusChanged (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsInternalCronosUser (libSceSystemService) - unknown signature
-
sceShellCoreUtilChangePbtcMode (libSceSystemService) - unknown signature
-
sceShellCoreUtilTelemetryCacheData (libSceSystemService) - unknown signature
-
sceShellCoreUtilMicMuteKeyPressed (libSceSystemService) - unknown signature
-
sceShellCoreUtilSwitchMicMute (libSceSystemService) - unknown signature
-
sceShellCoreUtilNotifyStartEventToUniversalMicMute (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsLotusMicActivated (libSceSystemService) - unknown signature
-
sceShellCoreUtilResetAllNoticeScreenSkipFlag (libSceSystemService) - unknown signature
-
sceShellCoreUtilResetNoticeScreenSkipFlag (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetNoticeScreenSkipFlagByAppId (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetPasscodeInputType (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetPasscodeDisplayInfo (libSceSystemService) - unknown signature
-
sceShellCoreUtilNotifySystemResumeTelemetryInfo (libSceSystemService) - unknown signature
-
sceShellCoreUtilUpdateTelemetryToken (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetVRBaseMatRectangles (libSceSystemService) - unknown signature
-
sceShellCoreUtilSetVRBaseMatRectangles (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsLaunchBlockDialog (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetConsoleToken (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetDeviceIdByDeviceUniqueId (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetDeviceUniqueIdByDeviceId (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetStreamingClientInfo (libSceSystemService) - unknown signature
-
sceShellCoreUtilRequestCffUpdate (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetCffConfig (libSceSystemService) - unknown signature
-
sceShellCoreUtilRemoveCffConfigFile (libSceSystemService) - unknown signature
-
sceShellCoreUtilDebugGetNumberOfCffItems (libSceSystemService) - unknown signature
-
sceShellCoreUtilDebugGetCffInfo (libSceSystemService) - unknown signature
-
sceShellCoreUtilDebugSetCffStatus (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetPeripheralConnectionSessionId (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetCdlgEnabledFreezeRendering (libSceSystemService) - unknown signature
-
sceShellCoreUtilGetNpTitleId (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsCronosInGameCommerceEnabled (libSceSystemService) - unknown signature
-
sceShellCoreUtilLemSettingGet (libSceSystemService) - unknown signature
-
sceShellCoreUtilLemSettingSet (libSceSystemService) - unknown signature
-
sceShellCoreUtilLemSettingGetList (libSceSystemService) - unknown signature
-
sceShellCoreUtilLemSettingReset (libSceSystemService) - unknown signature
-
sceShellCoreUtilIsEChassisVariant (libSceSystemService) - unknown signature
-
sceSystemStateMgrGetRebootCause (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerUpdateEventCache (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerGetEventCache (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerGetWorkingEventSummary (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerGetCoredumpStatus (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerGetCoredumpStatusByAppId (libSceSystemService) - unknown signature
-
sceCoredumpSequenceHandlerCancelCoredump (libSceSystemService) - unknown signature
Functional
-
sceSystemServiceLoadExec (libSceSystemService) - besides
"exit", it starts the title's own/app0/eboot.binor another executable under/app0that the relinker converted with--executable, which is looked up beside the running one (/app0/picker/picker.binaspicker.picker.binwith the running executable's extension). The main executable is the oneAPS5_EBOOTnames, which the first call sets to its own path. After the guest shutdown the old process ends without running guest exit handlers or host destructors; as duringexit, a guest thread that calls a library the shutdown has stopped waits for the end instead of unwinding."exit"ends the process after the host shutdown without running the title'satexitand__cxa_atexithandlers, since the console's shell closes the title instead; a line the title writes just before through its own thread, such as a forwarded standard error line, may not be printed. VLC for PS5 (PPSA85300) relaunches itself with no arguments; RetroArch (PPSA99169) starts its frontend picker with{"", NULL}, and the picker startseboot.binwith{"--ps5-mode=retroarch", NULL}or/app0/es-de/es-de.bin(picker.cpp), so the list holds only arguments. A list with a first entry becomes the whole guestargv, with no program name in front (LoadExec.cpp): a PS5 RetroArch console transcript records a restart with one argument entering withargc=1,argv[0]="--ps5-relaunch=1", and a launch from the home screen withargc=1,argv[0]=""(relaunch_ps5.cpp). For such a list Linux replaces the process withfexecve, and macOS withposix_spawnandPOSIX_SPAWN_SETEXEC: the PID and the standard streams stay, the other descriptors are closed and the working directory becomes the executable's. Windows starts a suspended process that inherits only the standard streams and a handle of the old process, and its entry stub waits for the old process to end before it loads the title's libraries, so a shell or script that started the title sees it end. A null list or one without a first entry keeps the earlier launch: the new executable gets only its own path as its command line (CreateProcessWon Windows,execvon Linux and macOS), so itsargv[0]is the host path, and the old process ends without waiting for it. What the console passes for such a list is not known, nor are its argument limits and error codes. Paths outside/app0and unconverted executables throw -
Running application ID (libSceSystemService) -
sceSystemServiceGetAppIdOfRunningBigAppreports 1 as the running title's app ID. The value is AnyPS5's own: the console's shell assigns app IDs and their values are not known here, so other calls that take an app ID must use the same one.sceSystemServiceKillAppwith that ID and the arguments -1, 0 and 0, which SwanStationPS5 passes to close itself and ps5-payload-dev's hbldr passes to close the running game, ends the title as its ownexit(0)would: the guest's shutdown andatexithandlers run and the process exits with status 0. On the console the call returns and the shell then ends the title, and whether those handlers run there is unknown; here there is no shell, so the call does not return. Another app ID or other arguments throw. -
sceLncUtilKillApp, sceLncUtilKillAppWithReason (libSceSystemService) - the running title's app ID ends the title as
sceSystemServiceKillAppdoes, which SharpProspero describes as a wrapper ofsceLncUtilKillApp; the signatures follow its launcher utility bindings. Another app ID throws, and so does a reason other than 0, whose meaning and effect on the console are not documented -
LoadExec descriptors (libSceSystemService) - on Linux, a call with an argument list replaces the process with
fexecve, which first closes every descriptor above 2, and on macOS withposix_spawn, which closes them throughPOSIX_SPAWN_CLOEXEC_DEFAULT; a call without one usesexecv, and the guest's descriptors stay open across it. On both paths descriptor 2 first gets back the host standard error a guest redirect kept, so the runtime's output does not follow the title's redirect (RetroArch's trace file, VLC's log) into the next executable. Which descriptors the console passes to the new process is not known -
LncUtil process and status payloads: local-process creation transmits a 72-byte parameter block whose fields remain unresolved. Title-ID output occupies 16 bytes; category output is a four-byte string, while category type and launched-user outputs are 32-bit scalars. The argument lists are recovered through the indirect dispatch targets rather than the decompiler's apparent zero-argument wrappers.
-
LncUtil event and diagnostic payloads: Daemon and shell-UI events are distinct output structures. GetDbgExecutablePath writes up to a 1024-byte protocol output and forwards a 64-bit selector whose meaning is unresolved. Boolean outputs and the two direct boolean budget/mode queries are confirmed.
-
LncUtil launch and lifecycle payloads: Flag values and service-side focus/resume/suspend/exception behavior remain unresolved. Launch and load-exec use null-terminated argument vectors; asynchronous launch/kill write a 32-bit request ID. The argument positions and transported widths are confirmed, but the service operations remain protected stubs.
-
ShellCoreUtil application data: GetAppLaunchTypeInfo writes eight bytes whose fields are unresolved. Application-data and launched-parameter keys are null-terminated strings, with 32-bit capacities/outputs. Format/fsck paths and mini-app return values are strings. File-formatting and service implementations remain protected stubs.
-
ShellCoreUtil queries: launched-parameter strings have signed 32-bit capacities; checker strings use machine-sized capacities and one or two string keys. Cloud status and device-index outputs are 32-bit scalars; the timeout variant consumes one byte. Partition-size output and the direct temporary-content free-size return are 64-bit. The service-side checker protocol remains unresolved. Device-index scene output uses a 32-bit native store despite the managed wrapper using a byte-backed scene enum; the native output width is preserved.
-
ShellCoreUtil storage and HID queries: partition free sizes and required application-content size are 64-bit outputs; fsck progress takes a title ID and a 32-bit progress output. HID string queries transport a 64-bit capacity and 32-bit selector, while output-vector lengths sign-extend the capacity's low 32 bits. HID selectors are configuration indices; the wrapper declares 32-bit capacities while the native code transports 64 bits, so their declared width remains unresolved. IDU mode byte values remain unresolved. Streaming status and the compositor-profiler return are boolean; the compositor-profiler and current GPU-load queries consume no caller arguments.
-
ShellCoreUtil account and privacy payloads: Pbtc user information occupies 800 bytes; privacy-event data occupies eight bytes after two string keys, each limited to 32 characters. The five account-information outputs occupy 8, 104, 136, 1024 and 1032 bytes; their fields remain unresolved. Category-default list output has a byte capacity and unresolved element format. Remote-play/share-play/social-screen outputs are boolean; application display-state queries take a 32-bit application ID. Only the support-site query signature is restored; no endpoint content is included.
-
ShellCoreUtil telemetry and user queries: telemetry-token output is 4112 bytes, including an eight-byte service result at offset 4104; its meaning remains unresolved. UI status is a 64-bit event mask; VM statistics and workaround-file strings use machine-sized capacities. Eye-distance adjustment writes one byte.
-
ShellCoreUtil launch and status arguments: Navigation consumes one 32-bit value, not the phantom vector/register arguments shown by decompilation. Workaround checks and mount requests take strings. Logout-state queries transmit two 32-bit values and return a byte output; selector meanings remain unresolved.
-
ShellCoreUtil notifications: IDU notifications use a signed 64-bit identifier, optional text and a 32-bit type. PSM events carry a 32-bit event ID and a string.
-
ShellCoreUtil state setters: UI updates take a 64-bit status and mask; app data takes two strings. Display-state setters mask their low bits, so source enum names and declared widths cannot be inferred from those masks alone. Streaming/impose/profiler setters test all 32 bits. User-focus reads take an application ID and return its user ID; writes apply a user ID to the current application.
-
ShellCoreUtil dialog parameters: the 24-byte error-dialog parameter contains a message pointer at offset zero, a null-terminated vector of string arguments at offset eight and a byte flag at offset 16. Field offsets and size are asserted; the flag meaning remains unresolved. Start/stop streaming-game and unmount requests take strings. Bus-transfer testing writes one byte after a string input.
-
SystemService activation and process signatures: activation wrappers validate a machine-sized handle and expose 32-bit status/result outputs or a byte activation flag. Shell activation initialization also receives a type selector; managed callers confirm the machine-sized handle consumed by constant-return start/abort/terminate exports. SystemService local-process parameters differ from LncUtil parameters and are kept as distinct types; general creation reads through offset 71, JVM/PS2 creation reads two 32-bit fields at offsets four and eight. Install status writes 12 bytes and application status writes 16 bytes; their remaining field meanings are unresolved.
-
SystemService query payloads: daemon events write 12 bytes; local-process entries occupy 36 bytes, consisting of a 32-bit value and 32-byte name. PS-button extraction reads a 16-byte event and rearranges its fields into a distinct 16-byte output; semantic names remain unresolved. Privacy definition/version queries take string keys and distinct output types; their layouts remain unresolved. Workaround information writes four bytes at offset zero and 16 bytes at offset eight.
-
SystemService direct aliases: assembly-only jumps now share the confirmed signatures of their LncUtil/ShellCoreUtil targets for application-ID lists, remote-play/UI status, navigation, controller-focus permissions and boolean budget/status queries. Aliases of unresolved targets still require target or caller analysis.
-
LncUtil collapsed dispatch stubs: assembly table targets confirm application-ID lookup takes a title-ID string, current/focused status outputs occupy 64 bytes, GPU-crash status occupies 1320 bytes, and dialog activation writes one byte. Shared-memory registration takes a string. The protected service implementations remain unchanged; collapsed assembly procedures are not missing exports.
-
SystemService launch and telemetry arguments: store-launch parameters contain only a four-byte size; web-app launch takes one string argument. Process lifecycle wrappers forward the verified LncUtil argument lists. TelemetrySetData takes a string key, binary payload and machine-sized length; TelemetrySetData2 takes two strings. Token storage consumes a 32-bit identifier and string; only its signature is restored, with no token values included.
-
SystemStateMgr and modal signatures: keep-main-on-standby takes a string, reboot timer consumes a 32-bit mode and wake-up consumes a 16-bit trigger. Suspend/resume progress forwards a string to kernel logging. Disc readiness, shell shutdown progress and standby enablement return booleans. Modal open takes a string and close takes a 32-bit dialog ID. Platform privacy setting writes a 32-bit value; the kernel platform query it calls consumes no caller arguments.
-
USB storage aliases and USB exports: direct-jump signatures are matched to the supplied USB module. RequestMap/RequestMapWSB take six arguments; the two extra helper arguments are internal. IsExist takes a device, directory and byte output, with a separate boolean failure result. Callbacks receive an event pointer and user data. Device information writes 824 bytes, device lists hold eight 32-bit IDs, and mount-point outputs occupy 128 bytes. Event/device field meanings and initialization attributes remain unresolved.
-
Assembly-only shell and clock queries: format/fsck progress returns a float in XMM0. Impose-menu, accessibility-zoom and suspend-confirmation queries take an application ID and return a boolean. Suspend-blacklist lookup forwards a 32-bit ID to SysCore. Clock changes take a string and 32-bit value; CPU pstate takes a 32-byte input structure whose fields remain unresolved, and memory pstate takes one 32-bit value.
-
Integer system parameters: registry-backed parameters 100–111, 200–213 and 300 throw because their settings are not modeled. Language results omit the console SDK-version compatibility remapping, and parameters 7, 400 and 1000 do not reproduce platform-dependent availability.
-
Tournament launch parameters: occurrence parameters occupy 32 bytes and contain two string pointers and a user ID. The final string semantics are unresolved. Event-details and team-profile launches retain an unused first argument slot of unknown declared type. The daemon blocking-event receive argument is passed unchanged as 64 bits to IPC; its meaning remains unresolved. Protected bodies in PendingExports.cpp remain unchanged.