Files
AnyPS5/docs/dev/debt/libScePsml_debug.md
T
hypermistandClaude Opus 5.5 916312403c docs(libScePsml): cite firmware 13.60, not 12.00, for the decrypted modules
The firmware version comes from the SDK 0x13600007 recorded in each module's module-param segment.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013XFS3FUfBtqCVfwmBrRQ6q
2026-10-24 01:06:01 +13:00

4.5 KiB

libScePsml_debug technical debt

Unknown function info

  • scePsmlMfsrGetSharedResourcesInitRequirement, scePsmlMfsrCreateSharedResources, scePsmlMfsrReleaseSharedResources, scePsmlMfsrGetContextBufferRequirement800M3_2, scePsmlMfsrCreateContext800M3_2, scePsmlMfsrReleaseContext (libScePsml) - only resource type 0 is supported. The context requirement reports four 2 MiB blocks regardless of its parameters, while the system calculation depends on the context configuration. The descriptor pointer at 0x28 is not read. Validation throws for null pointers, short block lists and foreign handles instead of reproducing the system error and fault behaviour.
  • scePsmlMfsr2Init and the other MFSR2 calls (libScePsml) - only a console without PSSR is modelled. In firmware 13.60 libScePsml.sprx (read from disassembly, not measured on a console), scePsmlMfsr2Init returns 0x8A8A0012 when sceKernelIsTrinityMode returns 0, and until Init succeeds every other MFSR2 call returns 0x8A8A0001 without touching its arguments. AnyPS5 reports 0, so Init throws only if that changes: the initialization after the check, the shared resource and context requirements, and the 0x800-dword size that GetDispatchPacketsSizeInDwords writes through its second argument are not implemented
  • scePsmlMfsrGetContextBufferRequirement1100, scePsmlMfsrCreateContext1100, scePsmlMfsrGetDispatchMfsrPacket1100 (libScePsml_debug) - argument layouts unknown; PPSA26344 imports but does not call the first two and at 0x87EFA passes (rdi, rsi=&stack, rdx) as three pointers to GetDispatchMfsrPacket1100; before scePsmlMfsrInit they return 0x8A810001 (not initialized) and after it they throw. scePsmlMfsrCreateContext1300 and scePsmlMfsrGetDispatchMfsrPacket900, 1000 and 1300 take the same shapes (context slot and parameter; context, command buffer and parameter) and behave the same way. PPSA08330 and PPSA03016 pass GetDispatchMfsrPacket900/1000 the context handle, a {cursor, size in dwords} command buffer and the dispatch parameters, and advance their cursor by the size scePsmlMfsrGetDispatchMfsrPacketSizeInDwords returned. Whether the 1100 and 1300 versions take these arguments, and the console's error, are unverified
  • scePsmlMfsrGetDispatchMfsrPacket1000 (libScePsml) - imported by PPSA25344. libScePsml and libScePsml_debug are built from the same source
  • scePsmlMfsrCreateContext1300, scePsmlMfsrGetDispatchMfsrPacket1300 (libScePsml) - imported by PPSA28416 next to scePsmlMfsrGetContextBufferRequirement1100. The names are not in the aerolib NID list; they hash to the imported NIDs kLF7WtQ1-Dg and DDVUyPyYHTA (tools/nid_names.py)

Functional

  • scePsmlMfsrGetDispatchMfsrPacketSizeInDwords, scePsmlMfsrGetMipmapBias, scePsmlMfsrSelectConfig, scePsmlMfsrRequestCapture, scePsmlMfsrIsCaptureInProgress (libScePsml) - semantics from the APR-EMU fakelib/libScePsml.sprx. Guards: 0x8A810001 uninitialized, 0x8A810005 null/foreign handle (fakelib checks an engine id 0xA9C4/0x9231; our map check is the equivalent), 0x8A810009 null output. GetDispatchMfsrPacketSizeInDwords writes 0x600; GetMipmapBias(context, bias, dimension) writes log2f(dimension / context->inputWidth) - 1.0f, width recorded at CreateContext800M3_2 from the parameter pair at 0x18 or descriptor0 + 0x20 for callers that pass a descriptor pointer there (indirection inferred; zero width returns 0x8A810005). SelectConfig, RequestCapture, IsCaptureInProgress validate then return 0. The GetDispatchMfsrPacket* calls still throw: the 0x158-byte template's packet routine is not understood
  • scePsmlMfsrInit (libScePsml) - succeeds and only sets the initialized state; the shared resources and contexts are bookkeeping objects that use none of the guest blocks. The console's library fails there instead: in firmware 13.60 (read from disassembly, not measured on a console) scePsmlMfsrInit returns 0x8A810012 when sceKernelIsTrinityMode returns 0, so its later MFSR calls return 0x8A810001. PPSA08330 calls the setup unconditionally and only uses a context when its cached sceKernelIsTrinityMode result is set (0x3c643d, 0x567f97; otherwise it stores a -0.25 mip bias itself at 0x567fe2), which AnyPS5 reports as 0