mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 16:43:05 -05:00
sceKernelRaiseException threw on Linux, so a title whose garbage collector stops threads with it (Unity's PS5Util raises SIGUSR1 on each thread and reads mc_rsp from the handler's context) could not run there. The raise now sends the host SIGUSR1 to the target thread with pthread_kill. The host handler, installed on first use with SA_SIGINFO and SA_RESTART, builds the FreeBSD-layout ucontext from the interrupted registers and the FXSAVE area, calls the guest handler on the target's own stack and writes the registers back, so the handler's changes reach the interrupted code, as they do on Windows. errno is left as the handler leaves it, as libthr does. A raise on another thread takes the target's join lock with the host signal blocked and returns ESRCH once the thread has finished, so a detached thread's pthread_t is never signalled after it exits. The pthread_t is recorded when the thread is created or adopted. Handlers are now lock-free atomics, as the host handler reads them. guest_raise_exception now runs on every platform. It also checks that r13 and xmm8 reach the handler and that r12 and xmm8 written by the handler reach the interrupted code. AI-assisted: yes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwJx7AHrSUaMGSpEGhL1Kb