mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-26 02:11:36 -04:00
0f7d0f1645
Replace the non-deterministic host-fiber thread-switch bridge with a deterministic TCB scheduler (HLE_SCHEDULER_CARVEOUT_PLAN.md steps 2-8, minimal "A+" scope): - psx_scheduler_run (traps.c): outer trampoline wrapping the top-level dispatch (main.cpp calls it instead of bare psx_dispatch). setjmp(g_scheduler_jmpbuf); restore current TCB / dispatch / on-escape reset g_psx_dispatch_depth + g_psx_call_bail; boot/pre-TCB runs raw cpu->pc; one-level switch-back safety net; fail-closed psx_is_dispatchable on every restored EPC. - psx_request_thread_switch: save yielder ctx (resume=$ra), repoint dword_108->entry, longjmp to the scheduler. No fibers, no cpu->pc=0 signal. Fires only with in_exception==0, so it never unwinds a live exception_jmpbuf frame (the in-exception RFE path stays LLE/intact). - sched_escape_ring (step 8) for always-on observability. - Hidden toggle PSX_HLE_SCHEDULER (default 1=HLE, 0=legacy fibers), read once; psx_change_thread branches on it; startup banner prints the mode. The trampoline is transparent in LLE mode. Fiber funcs kept compiled-but-dead. Validated live (HLE): thread1 trace shows ONLY the new TCB-switch events and ZERO fiber kinds 10/11/13 — the per-frame fiber recreate is eliminated. Builds clean. Freeze NOT resolved: same 0x800CD3F8 wedge persists (separate upstream root, per ChatGPT Q5). Keep HLE default until the upstream cause is fixed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>