Files
AnyPS5/docs/dev/debt/libSceNpTus.md
T
KernelPanicNT 41c1f7881a feat(libSceNpTus): create NpId title contexts with sceNpTusCreateNpTitleCtx
sceNpTusCreateNpTitleCtx makes the same checks as sceNpTssCreateNpTitleCtx,
which already follows shadPS4's sceNpTusCreateNpTitleCtx: a null npId is
INSUFFICIENT_ARGUMENT, service label 0xFFFFFFFF is INVALID_ARGUMENT, and
otherwise it creates a context in the shared 32-context table. The
signature is shadPS4's and fpPS4's.
2026-10-30 15:06:50 +00:00

8.5 KiB

libSceNpTus technical debt

Unknown function info

Functional

  • sceNpTusCreateNpTitleCtxA (libSceNpTus) - creates a title context without checking sign-in, up to 32 contexts (TOO_MANY_OBJECTS beyond); shadPS4 returns the sceNpGetNpId error instead. Requests are limited to 256, and the limits are not measured on a console.
  • sceNpTssCreateNpTitleCtx and sceNpTssCreateNpTitleCtxA (libSceNpTus) - that TSS title contexts share the TUS context table and its 32-context limit is inferred from shadPS4, which redirects both to the TUS creators, and from TSS requests coming from sceNpTusCreateRequest; nothing is measured on a console. The A form is sceNpTusCreateNpTitleCtxA. The NpId form returns INSUFFICIENT_ARGUMENT for a null npId and INVALID_ARGUMENT for service label 0xFFFFFFFF before the limit, as shadPS4's sceNpTusCreateNpTitleCtx does; the signatures are shadPS4's and fpPS4's, and Orbital's for the A form.
  • sceNpTusCreateNpTitleCtx (libSceNpTus) - not measured on a console, and the npId contents are neither read nor kept with the context, where shadPS4 keeps them for its requests. It is sceNpTssCreateNpTitleCtx: INSUFFICIENT_ARGUMENT for a null npId, then INVALID_ARGUMENT for service label 0xFFFFFFFF, then a context in the shared 32-context table, as in shadPS4; the signature is shadPS4's and fpPS4's.
  • sceNpTusPollAsync, sceNpTusWaitAsync (libSceNpTus) - there is no PSN, so every implemented *Async call whose arguments pass the checks starts a request that finishes at once with SCE_NP_ERROR_SIGNED_OUT, which poll and wait report and the blocking calls return; shadPS4 returns SIGNED_OUT from the *Async call itself when no shadNet client is signed in, and RPCS3 returns INVALID_ONLINE_ID while offline, marked there as probable behaviour. An abort stays set, so every later operation on the request, blocking ones included, finishes with ABORTED; in shadPS4 an abort only ends the operation in progress. Until an operation has started, poll returns 1 and wait returns INVALID_ARGUMENT as in shadPS4; RPCS3 blocks until a result is set.
  • sceNpTusGetData, sceNpTusGetDataVUser, sceNpTusGetMultiSlotVariable, sceNpTusGetMultiSlotVariableVUser, sceNpTusGetMultiUserVariableForCrossSave, sceNpTusSetData, sceNpTusSetDataVUser, sceNpTusSetMultiSlotVariable and sceNpTusSetMultiSlotVariableVUser (libSceNpTus) - block on their *Async forms with the same parameters, as shadPS4 does, so they inherit those forms' unmeasured checks and the offline SIGNED_OUT result