Commit Graph
25 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5.5 804dd59df0 Interrupts: Charge for alarm handlers, and stop parking threads on idle
An interrupt with no handler to run, a vblank with none registered for
example, switched the running thread off to idle and left it there until
some later event rescheduled: ~775us of every frame in a game that spins
without a vblank handler. It now reschedules at once. Taking an interrupt
also clears the ll bit directly, which that switch had been doing.

Interrupt handlers can now carry a cost before they run and after the
last queued one returns. Alarms use it: on hardware a thread that keeps
running loses ~70us to an alarm handler, and a thread the handler wakes
runs ~50us after it (pspautotests threads/scheduling/alarmcosts), so
17us in and 40us out. sceKernelSetAlarm's 40us is split evenly around the
deadline, keeping the handler ~1040us after a 1000us alarm.

A handler's return value re-arms its alarm counting from the previous
deadline, so a repeating alarm doesn't drift by those costs, unless
that's already past, as after interrupts were suspended for a while.

The vblank's own cost (~62us of CPU on hardware) isn't charged yet: with
it, a waiter ~90us after the vblank still reads hcount 1 on hardware, but
line 2 here. Hardware evidently raises the interrupt ~40us before the
line count wraps. That's noted where the waiters are released.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 09:06:30 -06:00
Henrik RydgårdandClaude Fable 5.1 cc41a23256 GPU: empty the display list queue on sceKernelLoadExec, fixes Crazy Taxi
Reinitialize() wiped the 64 display lists but kept the queue of their ids.
Whatever the old executable still had queued came back as lists with no state
and a pc of 0, behind the first list of the new executable, where they
blocked everything. Crazy Taxi: Fare Wars is a launcher for its two games,
and stopped at a black screen that way. Fixes #19894.

This removes the workaround for it, which dropped such a list but returned
before currentList was cleared, and only worked as long as something else
happened to clear it later. A list with a bad pc is now dropped like one that
ran into an error, instead of sitting at the head of the queue for good.

Also narrows what sceGeBreak(1) throws away to interrupts that have actually
been raised, which is what gpu/ge/intrsuspend shows. The ones we haven't
raised yet are only late because we execute lists ahead of time: a game that
breaks right after its last list, and then waits for what the finish callback
signals, got that callback long ago on hardware.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 13:10:02 -06:00
sum2012 63606634bb Add InterruptManagerForKernel
Find in #16297
2022-10-31 20:17:12 +08:00
Unknown W. Brackets f530be0969 Dialog: Prevent reschedule on shutdown start.
This is a bit strange, but tests seem to suggest this is correct.
A worse priority thread won't run before savedata shutdown hits 0, but the
thread that initiated shutdown runs before shutdown completes.

Fixes Freakout Extreme Freeride loading savedata.
2021-08-14 20:15:34 -07:00
Unknown W. Brackets 87ee0bc650 Return error codes in register/release subintr.
This checks for duplicate registrations and other thigns that could've
been causing wrong behavior.
2014-06-21 21:27:58 -07:00
sum2012 d6790cf906 Add logging and fix savestatus 2014-02-17 20:42:35 +08:00
Unknown W. Brackets c9e1b01545 Don't reschedule while interrupts are disabled. 2013-03-24 19:43:56 -07:00
Unknown W. Brackets 62ab4b7f51 More signed compare warnings. 2013-03-02 15:34:16 -08:00
Unknown W. Brackets 07a5dca98e Expand out some savestate code saving non-pod. 2013-02-04 08:26:59 -08:00
Florent Castelli 8004d360dd Interrupt handler reorganization for easier GE interrupt support 2013-02-04 03:10:01 +01:00
Unknown W. Brackets 2fa0cf040d Fix alarm test by not interrupting when disabled.
vblank was interrupting/rescheduling when interrupts were disabled.
That's bad.
2013-02-03 13:48:19 -08:00
Henrik Rydgard 363f158a0a Just warning fixes 2013-01-02 21:13:21 +01:00
Henrik Rydgard 972e4ea4e4 Warning fixes, prevent a possible (but unlikely) crash 2013-01-02 21:05:00 +01:00
Unknown W. Brackets a8c9c31e16 Add a registry for actions so they can be stated.
Also add late loaders to ensure things are hooked up properly.
2012-12-28 13:55:26 -08:00
Unknown W. Brackets db787d266d Require interrupt handlers to be registered.
This allows it to be save stated sanely.
2012-12-28 13:55:25 -08:00
Unknown W. Brackets 12fb91b7b5 Don't run interrupts while they're suspended. 2012-12-20 22:49:48 -08:00
Unknown W. Brackets 9034cfbfd3 Defer HLE interrupts, vblank only when enabled.
Based on tests, vblank doesn't queue up (makes sense) while
interrupts are disabled.

I'm not 100% sure about the GPU stuff but it seems to only come
from HLE via sceGe, so this should fix those return values.
2012-12-20 21:54:40 -08:00
Unknown W. Brackets 529818c9cd Handle interrupt return values. 2012-12-20 20:07:54 -08:00
Unknown W. Brackets d6d1f687a8 Make the intr handler public, will need for timers.
The idea here is that alarm/vtimers/etc. can implement a subclass
to pass more arguments / do whatever they need to.
2012-12-20 20:07:53 -08:00
Henrik Rydgard 0ff792fce5 Refix ge interrupts, make headless printf log messages 2012-11-09 13:40:09 +01:00
Henrik Rydgard 117256e07b Implement various hle stuff.. 2012-11-07 19:10:52 +01:00
Henrik Rydgard aea0580297 More reworking of Callbacks, plus some other little fixes. 2012-11-07 15:44:48 +01:00
Henrik Rydgard 8a082f91cc Ge Callbacks seem to be working now. 2012-11-06 18:14:09 +01:00
Henrik Rydgard 64cc573703 Switch to "GPL 2.0 or later" for various reasons. I wrote most of the code I imported from Dolphin (which is GPL2-but-not-later), so it should be OK. 2012-11-04 23:24:00 +01:00
Henrik Rydgard 4f7ad15758 Add snapshot of the whole source code. 2012-11-01 16:19:01 +01:00