Files
AnyPS5/docs/dev/debt/libSceUlt.md
T

5.2 KiB

libSceUlt technical debt

Unknown function info

  • Bound condition variables use the creation-time mutex, inferred from PPSA28061 callers of _sceUltConditionVariableCreate; the wait caller reloads only the condition argument. Error precedence, busy/state errors, FIFO signal selection and unsupported recursive waits have not been measured on PS5 hardware. Non-null options and waits at recursion depth above one throw. A live condition prevents destroying its bound mutex. Finalization follows the existing host mutex lifecycle: it invalidates conditions and wakes queued or reacquiring waiters with a state error. Scheduling priority and build-version validation are not implemented.

  • libSceUlt ulthreads - Runtime option defaults still omit the native header, stack size, worker affinity and priority fields; affinity depends on unresolved process configuration queries. Concurrent join ownership is not modeled: the native runtime distinguishes an ordinary running thread from one with another joiner. Host threads do not use the guest context or worker scheduler.

  • libSceUlt queues - Queue-data pool destruction and shared slot limits still require comparison with the native node allocator.

  • sceUltConditionVariableCreate and sceUltConditionVariableOptParamInitialize (libSceUlt) are absent from the console export list, where only the underscored variants _sceUltConditionVariableCreate and _sceUltConditionVariableOptParamInitialize appear; their non-underscored signatures are assumed. Condition variable option parameter initialization only zeroes 128 bytes, and its layout without the common header remains unverified on hardware.

  • Status query exports lack waiter identities, types and wait values. All five synchronization queries throw before writing output when capacity is nonzero and waiters exist; capacity-zero queries still report counts. sceUltGetUlthreadRuntimeInfo throws for a non-empty worker array because no worker threads are started. Recovered layouts, waiting records, worker scheduling and priority accounting lack full console validation.

  • Mutex and reader-writer status queries throw for held recursive mutexes and ulthread-owned mutexes or write locks: recursive counts and ulthread owner encoding remain unverified. Firmware 13.42 observations, from native x86-64 module runs with stubbed imports rather than PS5 hardware, supply lockType 1/2/0 for read/write/free, pthread owner from the thread block's first 8 bytes, ownerType 1 and default mutex lockCount 0 when held once. Both queries reject any supplied waiting record whose size is not 64 with ULT_ERROR_INVALID before writing output, as observed without waiters. Validation precedence and record-size checks for the other queries remain unverified.

  • Ult factory and creation exports without a leading underscore are absent from the supplied module; their signatures remain unresolved. Diagnostic signatures and synchronization argument lists are recovered.

  • sceUltMutexTryLock, the reader-writer lock and sceUltUlthreadGetSelf, sceUltUlthreadYield and sceUltUlthreadExit (libSceUlt) - the signatures follow the PS Vita libult in RPCS3 (a 256-byte lock and 128-byte option structures), not a PS5 binary. The rules are assumed: readers may take the lock while a writer waits, a thread that holds the write lock gets ULT_ERROR_STATE for any further lock instead of waiting on itself, a reader asking for the write lock waits on its own read lock, and the try forms return ULT_ERROR_BUSY. Outside an ulthread, sceUltUlthreadGetSelf, sceUltUlthreadYield and sceUltUlthreadExit return ULT_ERROR_STATE; inside one they act on the guest thread it runs on, since ulthreads are not scheduled cooperatively here

Functional

  • sceUltFinalize - allocator-failure behavior is unverified on a PS5. The host may throw std::bad_alloc while reserving temporary wake lists; guest waiting-pool exhaustion and native finalization errors are not modeled.
  • libSceUlt queues use preallocated host storage instead of the supplied guest work area; the guest object layouts remain incomplete. Waiting-queue pool thread limits and waiter priority ordering are not implemented. Finalization wakes blocked queue callers with ULT_ERROR_STATE.
  • sceUltWaitingQueueResourcePoolDestroy refuses with ULT_ERROR_STATE only when a thread is currently waiting on a pool-backed mutex, semaphore or queue, matching the PS5 libSceUlt disassembly (0x473a in or55417wcDk); bound but idle objects do not block pool destruction. Waiting-queue pool guest work area node accounting is not implemented.