Files
BFpilot/docs/COMPATIBILITY_STRATEGY.md

73 lines
4.0 KiB
Markdown

# BFpilot Compatibility Strategy
BFpilot ships one payload: `bfpilot.elf`. It contains the file manager,
RAR/7z/ZIP extraction, local PKG submission, and Media-tile registration.
## Installer architecture
- The release contains one distributable file, `bfpilot.elf`. No helper must be
copied, selected, or injected by the user.
- Media-tile registration runs directly in BFpilot and links
`SceAppInstUtil` with its `SceIpmi` dependency.
- Full-content PKG submission uses a small worker ELF embedded as bytes inside
`bfpilot.elf`. BFpilot streams it to the existing elfldr only when a PKG is
first requested. It is a private build component, not a release artifact.
- The worker listens only on PS5 loopback port 9041, accepts a narrow serialized
`PING`/`INSTALL`/`STOP` protocol, and is stopped during clean shutdown or
reinjection. A stale, failed, or mismatched worker is retired once before a
clean embedded copy is started.
- A fresh process is necessary because Sony binds the AppInst IPMI peer during
initialization; changing a long-running web process after that point can be
rejected even when the credential values look correct.
- AppInst initialization is bounded: ten seconds in the private PKG worker and
fifteen seconds in the direct Media-tile path. A delayed Sony service cannot
permanently wedge either installation path or later reinjection.
- Starts the HTTP listener before the asynchronous tile check, so file-manager
startup is observable even if AppInst returns an error.
- Compares embedded tile assets byte-for-byte and also requires a marker written
only after successful registration before skipping AppInst. This keeps normal
reinjection idempotent without confusing staged files for a registered tile.
- Uses the firmware-compatible TitleDir NID when available and falls back to
`sceAppInstUtilAppInstallAll` only when that symbol cannot be resolved.
The tile is `BFPL00001`, category `65536` (**Media**), and opens
`http://127.0.0.1:5905/`.
## PKG installation
PKG files are validated again immediately before submission. BFpilot accepts
both standard `7F CNT` packages and PS5-native fake-package `7F FIH` files.
FIH metadata is intentionally left to Sony's installer because that header does
not expose the CNT content-ID fields; the worker reports Sony's returned ID
after submission. `/data/...` paths
are translated to AppInst's `/user/data/...` view; other absolute local paths
are passed unchanged. NPXS system packages are rejected. The AppInst PlayGo
structure is fixed at the verified 9,984-byte ABI.
The firmware major is read through the safe `kern.version` sysctl; BFpilot does
not carry firmware-specific offsets. Firmware 11 and newer use the SYSTEM
installer identity; older or unknown versions use ShellCore. This follows the
hardware-observed AppInst authority boundary: using SYSTEM too early breaks
the older URL/path preflight, while using ShellCore on firmware 11+ can create
a title record without copying its content. Identity is set
before `sceAppInstUtilInitialize` in the fresh worker. The worker submits a bare
absolute path through `InstallByPackage`; it never falls back to
`AppInstallPkg`, which was hardware-observed to create metadata without the
actual application content.
The tile path uses a short, mutex-protected identity window and restores the
previous credentials with verification. The private PKG worker does not mutate
the long-running BFpilot process and exits as a whole when retired. Unsupported
loader/kernel capability states fail with diagnostics instead of using guessed
offsets or continuing after a failed credential operation.
Hardware verification on FW 11.60 installed the 37,633,547-byte PS5-native FIH
Internet Browser package through the normal BFpilot API. Sony returned content
ID `IV9999-MOUU12023_00-XXXXXXXXXXXXXXXX`, and the resulting
`/user/app/MOUU12023/app.pkg` contained 37,617,664 bytes. The test title was
then uninstalled successfully.
## Data directory
All BFpilot state remains under `/data/BFpilot`. Tile assets are the only files
written under `/user/app/BFPL00001`.