The public SDK's libkernel, libkernel_sys and libkernel_web stub tables declare _sigintr, the
sigset_t that FreeBSD's libc shares between signal and siginterrupt, and no built library
provided it (boykopovar#8846). libkernel now exports the 16-byte object, zero at start, and signal records
a handler with SA_RESTART unless its signal is in the set, as lib/libc/gen/signal.c does.
siginterrupt, which fills the set, is a libSceLibcInternal export; libc does not link libkernel
and cannot reach the dispositions, so it stays out and a debt entry for signal says so.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
What
libkernel.prxexports_sigintr(nQVWJEGHObc), thesigset_tthat FreeBSD's libc shares betweensignalandsiginterrupt:signalgives a handlerSA_RESTARTunless its signal is in the set (lib/libc/gen/signal.c, 11.4). The public SDK's libkernel, libkernel_sys and libkernel_web stub tables declare the object, and no built library provided it, so a registry importing it was reported absent (#8846). The object is 16 bytes (fouruint32, the SDK'ssys/_sigset.h), zero at start, andsignalnow reads it under the registration lock when it records a handler.Not included:
siginterrupt, which fills the set. On the console it is a libSceLibcInternal export (the SDK'slibSceLibcInternal.cdeclares it; the three kernel tables do not), which AnyPS5 serves fromlibc.prx, andlibc.prxdoes not linklibkernel.prx(the dependency runs the other way), so it cannot reach the dispositions. A guest that writes the set itself gets FreeBSD's behaviour fromsignal; the function needs a decision on how libc reaches libkernel's signal state and is left for a follow-up. A debt entry forsignalsays so. Whether the two kernel variants should provide the object as well is the policy question of #8853.Tested
Windows 11, MinGW GCC 15.2.0, Release,
BUILD_TESTING=ON, onmain05f9995:guest_signals, extended: the set starts zero;signalrecordsSA_RESTART; with bit 29 set (signal 30) it records flags 0 and keeps the handler; signal 31 still getsSA_RESTART; bit 127 (signal 128) clears it the same way; with the bits clearedSA_RESTARTcomes back.guest_signalspasses (1 of 1).signalchange alone restored tomain(object and test kept) the test fails at the first flags-0 check; restored, it passes. It exits with0xc0000409(theRequireabort) on the reverted build and passes again on the restored one.tools/import_audit.pyon libkernel: public SDK _sigintr data object has no built provider #8846's one-line registry against the built libraries:implemented 1, absent 0, exit 0 (the issue measuredabsent 1).python tools/check_conventions.py --base origin/main --head HEADpasses.sigaction, a few lines below the changed line insignal, and feat(libkernel): export the underscore entry points of the socket, directory and signal calls #8700 adds entry points aftersigactionandsigsuspend; whichever merges second rebases a few lines. Neither touches_sigintr.Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)_sigintrimport of libkernel: public SDK _sigintr data object has no built provider #8846;siginterruptstays open there)🤖 Generated with Claude Code