Prospero system library layout and privilege model
The retail filesystem organisation of system shared libraries
(.sprx), the sandbox partition boundaries, and the
four-tier privilege model governing access on the Prospero-generation
platform (firmware 12.40).
Everything below is measured from retail hardware via obSCEne runtime
probes and live filesystem inspection. The complete module list is the
companion manifest data/hardware/ps5-sprx-manifest.tsv,
a measured snapshot at firmware 12.40 and the source of truth for the
per-tier tallies below, which move with firmware.
1. Divergence from the Orbis-generation platform
On the Orbis-generation platform, system shared libraries resided
almost exclusively in a single flat directory:
/system/common/lib/. Any library not shipped in
/system/common/lib/ was bundled with the application inside
/app0/sce_module/ (such as libc.prx or
libSceFios2.prx).
On the Prospero-generation platform, the vendor compartmentalized the system filesystem into distinct mount points with independent access controls, security tokens, and sandbox rules:
/ (Root)
├── /system/common/lib/ [Tier: app] Standard Title Sandbox
├── /system_ex/common_ex/lib/ [Tier: system] System Apps & WebKit
├── /system/priv/lib/ [Tier: root] Privileged Daemons & Core Codecs
└── /app0/sce_module/ [Tier: app/title] Application-Bundled Modules (*.prx)
Linking a module statically via DT_NEEDED forces the
system loader (rtld) to resolve it at launch. If that
library does not exist in /system/common/lib/ or is in a
higher privilege tier denied to the title, the process is terminated
before executing a single instruction.
2. The four privilege tiers
Access to system libraries is partitioned into four permission tiers (D296):
| Tier | Category / Target | Typical Directory | Credentials (paid) |
Scope & Capabilities |
|---|---|---|---|---|
app |
Game title ("gd") |
/system/common/lib/ |
0x38000000000000000x3100000000000002 |
Standard sandboxed game titles. Access to
the standard application-tier SPRXs and
/app0/sce_module/*.prx. |
sysmodule |
Title with sysmodules | Dynamic via IPC | Same as app |
Dynamically activated into process address
space via sceSysmoduleLoadModule(id) /
SceSysCore. |
system |
System App
("system_app") |
/system_ex/common_ex/lib/ |
0x3800000000000001 |
Extended system applications (WebKit, Shell UI, Settings, Media Player). Access to WebKit, Mono, and POSIX runtimes. |
root |
System Service / Daemon | /system/priv/lib/ |
0x8000000000000001 |
Privileged system services and jailbroken payloads. Access to proprietary hardware encoders and kernel services. |
3. Directory layout and module breakdown
3.1
/system/common/lib/ (standard application tier)
Mapped into every standard game title sandbox
(appCategory: "gd"); the manifest lists these SPRXs as a
measured snapshot. These libraries provide the public and semi-public
APIs exposed to games:
- Core Runtime:
libkernel.sprx,libkernel_sys.sprx,libkernel_web.sprx- System call interfaces and thread primitives.libSceLibcInternal.sprx- Standard C runtime internals.libSceSysmodule.sprx- System module dynamic loader.libSceAmpr.sprx- Application memory protection runtime (automatically loaded bylibSceSysmodule).libSceFios2.sprx- Fast I/O subsystem.
- Next-Generation Graphics (Prospero Native):
libSceAgc.sprx,libSceAgcDriver.sprx,libSceAgcVsh.sprx- Native Prospero AGC graphics pipeline (EI_ABIVERSION 2).
- Legacy Graphics (Orbis Backwards-Compatibility):
libSceGnmDriver.sprx- Orbis GNM driver.
- Peripherals & Input:
libScePad.sprx(DualSense / DualShock),libSceKeyboard.sprx,libSceMouse.sprx,libSceMove.sprx.libSceAjm.sprx,libSceAjm.native.sprx,libSceAjmi.sprx- Audio Joint Manager.
- Audio & Video:
libSceAudioOut.sprx,libSceAudioIn.sprx,libSceAudio3d.sprx,libSceAudioPropagation.sprx.libSceVideoOut.sprx,libSceVideoRecording.sprx.libSceVenc.sprx- Video Encoder. (On Orbis this was split acrosslibSceVenc.sprxandlibSceVencCore.sprx; on Prospero it is consolidated).
- Networking & Identity:
libSceNet.sprx,libSceNetCtl.sprx- Sockets and network configuration.libSceUserService.sprx,libSceNpCommon.sprx,libSceSaveData.sprx,libwebrtc.sprx.
3.2
/system_ex/common_ex/lib/ (extended system tier)
Mounted only for applications flagged as system applications
(system_app / 0x3800000000000001). Sandboxed
game titles cannot access this directory. As measured, it holds native
C/C++ libraries alongside a larger set of Mono/.NET assemblies
(.dll.sprx); the manifest carries the exact split:
- POSIX Runtime:
libScePosixForWebKit.sprx- Full POSIX threading, sockets, and memory functions. (Orbis providedlibScePosix.sprxin/system/common/lib/. On Prospero,libScePosix.sprxdoes not exist; POSIX is relegated to this WebKit support library).
- Web Engines:
libSceNKWebKit.sprx,libSceNKWeb.sprx,libSceNKWebKitRequirements.sprx- WebKit runtime.libSceJsc.sprx- JavaScriptCore engine.libhermes-0.11.sprx- Facebook Hermes JavaScript engine.
- Open Source System Ports:
libcurl.sprx- HTTP/networking.libcairo.sprx,libfontconfig.sprx- 2D graphics and font rasterization.libSceVshFreeType.sprx,libSceVshHarfBuzz.sprx,libSceVshPng.sprx,libSceVshJpeg.sprx,libSceVshWebP.sprx,libSceVshBrotli.sprx- Media rendering and decompression libraries.
- Managed Frameworks:
libmonosgen-2.0.sprx,libmono-btls-shared.sprx,libmono-profiler-log.sprx- Mono CLR runtime.- The
.dll.sprxmanaged assemblies (the manifest holds the full set as measured), e.g.mscorlib.dll.sprx,Microsoft.CSharp.dll.sprx,Newtonsoft.Json.PlayStation.dll.sprx.
- Shell UI Components:
libSceShellUIUtil.sprx,libSceGLSlimVSH.sprx,libSceGLSlimClientVSH.sprx,libSceNotificationClient.sprx.
3.3
/system/priv/lib/ (root / privileged tier)
Accessible only to processes with root/kernel daemon credentials
(0x8000000000000001 or specific daemon entitlements); the
manifest lists these privileged SPRXs as measured. Unprivileged titles
attempting to load these fail with permission denials:
- Proprietary Hardware Codecs & DSPs:
libSceAc3Enc.sprx- Dolby Digital AC-3 hardware encoder.libSceDtsEnc.sprx- DTS surround encoder.libSceMat2Enc.sprx- Dolby MAT 2.0 encoder (Dolby Atmos bitstreaming).libSceAudiodecCpuTrhd.sprx(Dolby TrueHD),libSceAudiodecCpuDts.sprx,libSceAudiodecCpuDtsHdMa.sprx,libSceAudiodecCpuOpus.sprx,libSceAudiodecCpuLpcm.sprx.
- System Core:
libSceAudioSystem.sprx- Low-level kernel audio bus.libSceDipsw.sprx,libSceComposite.sprx- Hardware dip switches and composition hardware.libSceFsInternalForVsh.sprx,libSceLoginMgrServer.sprx,libSceAppDbShellCoreClient.sprx.libmdbg_syscore.sprx- Debug monitor.
- AI & Voice Services:
libSceVoiceCommand.sprx,libSceVisionManager.sprx.
- Remote Play & Cloud Transport:
libSceNpRemotePlaySessionSignaling.sprx,libSceWebTransport.sprx,libSceWtIpcClient.sprx.
4. Key differences, Orbis versus Prospero
| Library / Functionality | Orbis | Prospero | Impact on Homebrew |
|---|---|---|---|
libScePosix |
/system/common/lib/libScePosix.sprx |
/system_ex/common_ex/lib/libScePosixForWebKit.sprx |
Titles cannot statically link
libScePosix. Must resolve dynamically via
obs_module_open. |
libSceVencCore |
Present in
/system/common/lib/ |
Absent (merged into
libSceVenc.sprx) |
Static DT_NEEDED on
libSceVencCore aborts launch with val 2
(ENOENT). |
| 3D Rendering | libSceGnmDriver.sprx |
libSceAgc.sprx /
libSceAgcDriver.sprx |
Native titles use AGC; GnmDriver is retained for backwards compatibility. |
| Audio Encoders | Broadly accessible | Strictly isolated in
/system/priv/lib/ |
Dolby/DTS encoders require
root privilege. |
| C Runtime | Bundled in
/app0/sce_module/libc.prx |
Built into
/system/common/lib/libSceLibcInternal.sprx |
Requiring libc.prx via
.libc_param causes
SCE_KERNEL_ERROR_ESDKVERSION if versions mismatch. |
5. obSCEne probing strategy
obSCEne treats module presence as an empirical question, probed dynamically rather than assumed:
- Static dynamic section (
DT_NEEDED):obscene.eboot.elfstatically links only a bounded set of core libraries guaranteed to exist in/system/common/lib/on every Prospero firmware, gated byEBOOT_LIBSbecause a system loader resolves every named library before any of the probe's code runs (D226). The set is the behavioural imports insrc/probe/imports.cand the per-target exclusions there; read that file for the current membership. - On-demand loader (
obs_module_open): Non-essential libraries (POSIX, video encoders, system tools) are resolved at runtime withobs_module_open(), which searches the tier paths in order of accessibility. - Privilege flag (
--privilege):selfishcontainer builds declare target privilege (app,sysmodule,system,root), generating the matchingpaidauth token andappCategoryso probes test higher tiers when executing under kstuff (D296). - Census logging (
OBS|modtier|...): The runtime module probe emits the verified permission tier of every reachable module into the report for automated comparison.
6. Application category, display arbitration, and memory budgets
Process authority and runtime hardware resources are governed across two orthogonal axes:
- Privilege tier (
paidin SELF header): Determines kernel authority, raw device access, sysctls, and directory partition traversal (/system/priv/lib/). - Application category (
applicationCategoryTypeinparam.json): Determines display bus ownership (SceSysAvControl), Direct Memory budget (ResourceArbitrator), and UI focus:0(SCE_APP_CATEGORY_TYPE_BIG_APP/gd/native_game): Primary foreground application.65536(0x00010000,SCE_APP_CATEGORY_TYPE_SYSTEM_APP): Background or system application.131072(0x00020000,SCE_APP_CATEGORY_TYPE_MINI_APP): Mini app (quick menu overlay).
6.1 Hardware display and memory arbitration rules
- HDMI video scanout:
SceSysAvControlgrants ownership of the primary HDMI video bus (OBS_VIDEO_BUS_MAIN = 0) exclusively to Big Apps (category 0). CallingsceVideoOutOpen(..., OBS_VIDEO_BUS_MAIN, ...)from asystem_app(category 65536) fails with0x80290001 (SCE_VIDEO_OUT_ERROR_INVALID_VALUE). - Direct Memory (
DMEM) budget:ResourceArbitratorgrants direct physical memory pools (required for GPU framebuffers and DMA buffers) only to Big Apps (0x300000000/ 12 GB). Forsystem_app, direct memory budget is 0 bytes (sceKernelAllocateDirectMemoryreturns-1). - Orthogonality: a
rooteboot (paid: 0x8000000000000001) can be launched as a Big App (category 0). Launched with both, the kernel grants full 12 GB DMEM, switches HDMI video ownership to the app, and retains root kernel capabilities.
6.2 The Big App PRX loader contract
When launched as category 0 (native_game),
the Prospero runtime dynamic linker (rtld) activates the
retail game startup contract:
rtldunconditionally attempts to load/app0/sce_module/libc.prxbefore jumping to the eboot entry point.- Under
kstuffon current firmware (FW 12.40),sceSblAuthMgrAuthHeaderintercepts and authenticates fSELF files using Gen-4 container magic (4F 15 3D 1D). - Bundled PRX modules in
/app0/sce_module/must be wrapped in Gen-4 containers with matching privilege authority. Raw unencrypted ELFs (\x7fELF) or Gen-5 containers (54 14 F5 EE) causertldto abort launch withPRX_SCE_MODULE_LOAD_ERROR(0xa0020102).
6.3 Homebrew configuration matrix
| Target Goal | Application Category | Privilege (paid) |
Bundled sce_module/ |
Suitable Use Cases |
|---|---|---|---|---|
| GUI / Game / Emulator / Screen Output | 0 (Big App) |
root or app |
Required: libc.prx (Gen-4 container,
4F 15 3D 1D) |
Emulators, games, graphical homebrew, full obSCEne visual tests. |
| Headless Daemon / Background Service | 65536 (0x10000) |
root or system |
Not required | FTP servers, telnet/shsrv daemons, headless klog dumpers. |
| System Overlay / HUD | 131072 (0x20000) |
system |
System app standard | On-screen displays, quick menus, notification overlays. |