Files
AnyPS5/docs/dev/debt/libSceFiber.md
T
louise-patraandClaude Opus 5.5 43d4eebe51 feat(libSceFiber): attach contexts on run and switch, internal option initialize
Fibers may be initialized without a context and get one from
_sceFiberAttachContextAndRun or _sceFiberAttachContextAndSwitch.
_sceFiberInitializeWithInternalOptionImpl accepts the ulobjmgr,
context size check and FPU default flags.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-21 16:42:19 +05:30

4.0 KiB

libSceFiber technical debt

Functional

  • sceFiberGetInfo reports the requested-size window at the top of the host stack used for execution, rather than the original caller buffer, which is retained and pinned. The additional 1 MiB host-call margin below that window is not included in size_context. Planet Coaster (PPSA01736 v01.017) uses this range for ChakraCore garbage-collector stack scans; reporting the unused caller buffer makes the scan cross unmapped memory. The range is covered by a regression test while running, switching and migrating a fiber between threads. Console behavior for substituted host stacks has no direct equivalent and is not measured.

Unknown function info

  • _sceFiberInitializeWithInternalOptionImpl (libSceFiber) - its signature and the flag values 0x1 (no ulobjmgr registration), 0x10 (context size check) and 0x100 (start with MXCSR 0x9fc0 and x87 control word 0x037f) follow shadPS4's initialize implementation and flags. Not measured on a console. 0x1 has no effect because no ulobjmgr exists; other flag bits throw. shadPS4 also sets 0x100 for build_version 3.50 and later in every initialize; opt_param and build_version are ignored.
  • _sceFiberAttachContextAndRun, _sceFiberAttachContextAndSwitch (libSceFiber) - signatures and behaviour follow shadPS4's run, switch and attach implementations, not measured on a console. A context is attached only to an idle fiber initialized without one; a fiber that already has a context, or is not idle, returns SCE_FIBER_ERROR_INVALID. A size that is not a multiple of 16 returns SCE_FIBER_ERROR_ALIGNMENT as in initialize, where shadPS4 returns SCE_FIBER_ERROR_INVALID.
  • Fibers without a context (libSceFiber) - running or switching to a fiber initialized without a context, before one is attached, throws. On the console such a fiber runs on the stack of its caller, per shadPS4's run implementation.
  • _sceFiberGetThreadFramePointerAddress (libSceFiber, NID 0dy4JtMUcMQ) forwards to sceFiberGetThreadFramePointerAddress; that the argument list matches is inferred from the export without the underscore, as for the underscore Ult exports, not measured
  • Fiber stacks (libSceFiber) - a fiber whose context is smaller than 64 KiB runs on an mmap'd host stack of its context size plus 1 MiB, so host calls made from it (21 KiB deep when PPSA01341 reaches SPIRV-Tools from a 16 KiB context) do not overwrite the contexts packed next to it; a larger context is the stack, as on the console. PPSA05684 needs the second: its job fibers have 64 KiB and 512 KiB contexts, the 512 KiB ones at 1 MiB-aligned addresses, and find their job record by masking the stack pointer (~0xfffff for the 512 KiB ones), which a host stack breaks (the game waits forever in GameInit, or faults later in a 64 KiB fiber). The 64 KiB limit is chosen between these two titles, not measured: a title with small contexts that also derives state from the stack pointer, or one whose host calls exceed what is left of a large context, is not covered