The PS5 libSceNgs2.native module (firmware 3.20 and 4.03) accepts a setup with an all-zero format on a configured voice and keeps its format, so a play afterwards succeeds. The guard for a play on a voice with no channels would otherwise fail it.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
ReadRawShader evicted snapshots past 64 entries or 8 MiB. A snapshot owns
its prepared artifacts, so an evicted unregistered shader was recompiled
on its next use. PS4 titles do not register their shaders: Knowledge is
Power cycles through 383 of them in its menus and recompiled them 341 136
times in 240 s. Raise the limit to 4096 entries or 64 MiB.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceNpCalloutStartOnCtx64 cleared and filled the entry before looking for
it in the queue, so restarting a queued callout cut off every callout
queued after it and changed its deadline while the callout thread could
read it. The entry is now written only after the duplicate check under
the context mutex. sceNpArchInit and sceNpArchTerm now hold a lock, so a
second caller no longer returns before the global heap exists. Both
differences from the firmware are recorded in the debt document.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013XFS3FUfBtqCVfwmBrRQ6q
sceNetCtlGetResult threw for every event after its initialization and
address checks, and Worms Armageddon: Anniversary Edition (PPSA20052)
and Monster Hunter Wilds (PPSA24191) stop on it at boot; MHW's first
call asks about event 1, a disconnection.
It now answers as sceNetCtlGetResultV6 does: for event types 1 to 3,
disconnected to IP obtained (the numbers sceNetCtlCheckCallback
delivers), it writes 0 to the result and returns 0. Other event types
throw, naming the type. The initialization and null checks come first,
as before. The error code a console reports per event is unconfirmed,
which the library's debt page now records.
The guest NetCtl test covers each supported event, three unsupported
ones with the new message and the result left untouched, and a null
result answered before the event is looked at.
kern_fpathconf answers _PC_ASYNC_IO with _POSIX_ASYNCHRONOUS_IO (200112) after the descriptor lookup, and a pipe or socket (no vnode) with PIPE_BUF for _PC_PIPE_BUF and EINVAL for every other name. Drop the unused File.hpp include and the duplicate KernelErrors.hpp include.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
DescriptorIsOpen_nid_no_patch is not extern "C", so the patched libkernel.prx
does not export it and libkernel_sys.prx fails to load (patched_libraries:
LoadLibraryEx error 127). Check the descriptor like fchown does: GuestFstat on
Windows, fstat elsewhere, EBADF on failure.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
When the process starts with descriptor 0 closed, open returns 0, dup2(0, 0)
succeeds and closing the temporary descriptor then closes descriptor 0 again,
so the standard input case returned early at its EBADF branch. Skip the dup2
and the close when the temporary descriptor already is 0, on both platform
branches, and check the replacement for an initially open and an initially
closed standard input.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
scePthreadRwlockattrSettype stored any type and threw on a null
attribute. Measured against firmware 13.42's libkernel by BunnyFl in
#9632, it is the same function as pthread_rwlockattr_settype_np with
the error converted to an SCE code: types 1 and 2 are stored and return
0, and any other type, 0 included, or a null attribute or object
returns SCE_KERNEL_ERROR_EINVAL and stores nothing.
A finished or joined thread returns ESRCH for any priority, and scePthreadSetprio sets errno for a refused priority like pthread_setprio.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
BunnyFl measured these functions against firmware 13.42's libkernel and
libkernel_sys in the PR thread (behaviour only):
- pthread_rwlockattr_settype_np stores only types 1 and 2. Any other
type, 0 included, and a null attribute or object return EINVAL and
store nothing; type 0 was stored before.
- scePthreadMutexattrSetkind returns 0x8001FFFF, sceKernelError(-1), for
a null attribute or object instead of throwing. Kinds 1 to 4 are set as
before; other kinds still throw, since the firmware stores them
unchecked and a mutex's behaviour with them is not measured.
- scePthreadMutexattrGetkind takes the attribute itself and returns
sceKernelError of its kind, or 0x8001FFFF for a null one.