Commit Graph
116 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5 434f1b4e13 Give the cpu.runUntilTime deadline its own BreakReason
It reported BreakReason::DebugBreak, the same reason a user hitting pause
produces, so a client that asked to run until a point in emulated time couldn't
tell its deadline landing from someone stopping the core by hand - the one
piece of information the cpu.stepping event exists to convey.

Reports "cpu.runUntilTime" now, matching the request that armed it.

No client depended on the old string: nothing outside Core.cpp names
"cpu.debugbreak", and wsdbg's resume handling keys off the event, not the
reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
2026-08-18 10:59:08 +02:00
Henrik RydgårdandClaude Opus 5 8120338530 Add cpu.runUntilTime: run to a point in emulated time and break there
Lining a scripted repro up with a bug report ("about five seconds in, press
X") had no support at all. The only way to do it was to poll cpu.status in a
loop from the client, which is slow - a process spawn per poll, minutes for a
single run - and lands somewhere different every time, so the repro isn't one.

cpu.runUntilTime takes either an absolute `us` (as reported by cpu.status) or
`relativeUs` from now, resumes, and breaks when emulated time gets there. It
answers immediately with the target, and the usual cpu.stepping event follows
when it arrives. Anything else that stops the CPU first - a breakpoint, an
exception - cancels the deadline, the same way it cancels a pending step.

The deadline is held in microseconds, not ticks, and recomputed whenever
SetClockFrequencyHz() runs. Converting to a tick count once up front looks
right and isn't: games change the CPU clock while running, and CrossCraft
Classic goes 222 -> 333MHz during startup, which made a request for 3.0s stop
at 2.24s. With the recompute it stops at exactly 3000000us. Advance() also
shortens its slice to land on the deadline instead of up to a slice past it,
so repeated runs stop at the same instruction rather than somewhere in the
following frame.

Nothing is added to CoreTiming's event list, so savestates are unaffected -
the deadline is debugger session state and isn't serialized.

Also adds DebuggerRequest::ParamF64, since microseconds outgrow 32 bits after
about 71 minutes. Like the other Param* helpers it fails loudly on a missing
or unparseable value rather than defaulting.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
2026-08-18 09:32:04 +02:00
Henrik RydgårdandClaude Opus 5 59eb8a9a81 Report emulated time in cpu.status, and note headless/wsdbg traps in AGENTS.md
cpu.status only reported raw CPU ticks, which a client can't turn into a time:
the PSP's clock frequency is changeable and games do change it, so the
ticks-per-second ratio isn't fixed over a run. CrossCraft Classic runs at
333MHz, so assuming the default 222MHz reads 9.1s where the truth is 6.3s -
enough to put scripted input injection in the wrong place entirely.

Adds "us" (emulated microseconds) and "clockHz" alongside "ticks".
CoreTiming::GetGlobalTimeUs() can't be used directly for this: it rebases its
own internal counters as a side effect, and cpu.status is deliberately served
straight from the WebSocket thread rather than queued to the CPU thread (it's
meant to be cheap and frequently pollable). So PeekGlobalTimeUs() computes the
same value without the rebasing.

AGENTS.md picks up the things that cost time while driving headless over the
websocket API: --sync silently desynchronises on raw JSON lines because only
wsdbg's key=value shorthand gets a ticket; headless reports HAS_DEBUGGER as
false so anything gated on it silently does nothing there; the memstick is
hardcoded next to the executable; a leftover headless process turns a build
into an LNK1168 that looks like a compile error; wrapping the launcher in
`timeout` kills the emulator along with it, losing the crash you stopped at;
response field names aren't uniform (value vs uintValue); broadcast.config.set
rejects two of the four keys the docs list.

Also writes down the ELF-as-oracle technique that cracked the relocation bug -
when homebrew ships app.elf next to app.prx, the pre-link ELF still has the
symbols and the relocation symbol indices the PRX format discards, so the
loader's output can be checked exhaustively offline instead of by re-running.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
2026-08-17 18:51:54 +02:00
Henrik Rydgård eb0813c0e3 Add a utility function for all the ABIs to call functions with a pointer arg. Use to call Advance from the JIT with the MIPSContext. Indent some code better. 2026-08-13 08:09:30 +02:00
Henrik Rydgård e9a3449ede More MIPSState * plumbing (manual) 2026-08-12 14:02:19 +02:00
Henrik Rydgård 68ec34ad54 Build and warning fixes 2026-08-03 19:11:07 +02:00
Henrik Rydgård 484b94c3f3 Build and warning fixes 2026-06-12 17:28:52 +02:00
Henrik Rydgård 37e00f616e Clean up logging in scePowerSetClockFrequency 2026-06-12 12:23:36 +02:00
Henrik Rydgård 1d32f68869 Remove an unnecessary callback mechanism 2026-06-12 12:19:31 +02:00
Henrik Rydgård 31cf5771f4 Turn the break reason into an enum, fix some minor issues 2025-02-19 16:01:11 -06:00
Henrik Rydgård b3346df646 ImDebugger: Add a window to inspect upcoming CoreTiming events 2024-12-07 16:28:27 +01:00
Henrik Rydgård d3e9398cb3 Split Core_EnableStepping into Core_Break and Core_Resume 2024-11-03 17:53:42 +01:00
Henrik Rydgård e01ca5b057 Logging API change (refactor) (#19324)
* Rename LogType to Log

* Explicitly use the Log:: enum when logging. Allows for autocomplete when editing.

* Mac/ARM64 buildfix

* Do the same with the hle result log macros

* Rename the log names to mixed case while at it.

* iOS buildfix

* Qt buildfix attempt, ARM32 buildfix
2024-07-14 14:42:59 +02:00
Henrik Rydgård 3fd5190271 Add a comment, some additional cleanup 2024-01-16 09:07:09 +01:00
Henrik Rydgård 7e427e41d1 Remove a bunch of dead code from CoreTiming ("threadsafe" events)
We haven't used these "threadsafe" events since we removed our first attempt
at GPU threading, so like 10 years, and maybe some experimentation in the
networking code according to some comments. It's unlikely that any
savestates that used these events would load anyway.
2024-01-16 09:06:03 +01:00
Henrik Rydgård 6066e745db CoreTiming::ProcessEvents : Reject bad event types. Rename function. 2024-01-15 23:57:34 +01:00
Henrik Rydgård a43bdd8169 ReadSFO: Fix memory safety issues 2023-05-01 13:52:16 +02:00
Henrik Rydgård 6945deec01 Replace a LOT of sprintf with snprintf, and a few strcpy with truncate_cpy 2023-04-28 21:04:05 +02:00
Henrik Rydgård 2659fd6f66 Android work. Make the Android OpenGL exit prodecure make more sense 2023-01-30 11:49:31 +01:00
Unknown W. Brackets 49f6c461ad Reporting: Fix some header includes.
Particularly in Common, avoid including Core/Reporting.h.
2022-12-27 14:58:20 -08:00
Henrik Rydgård a34e32abe1 Revert "Disables "ForceCheck" on jit invalidation on ARM32, introduced in #16194"
This reverts commit bc28f54612.
2022-10-11 15:42:59 +02:00
Henrik Rydgård bc28f54612 Disables "ForceCheck" on jit invalidation on ARM32, introduced in #16194
I'm not sure if we should call it at all here, but at least this makes
games work again on ARM32. Will need more investigation.
2022-10-11 10:10:52 +02:00
Unknown W. Brackets ffbd9bbe98 Global: Fix some int/size_t conversion warnings. 2022-03-13 12:03:48 -07:00
Unknown W. Brackets 2479d52202 Global: Reduce includes of common headers.
In many places, string, map, or Common.h were included but not needed.
2022-01-30 16:35:33 -08:00
Unknown W. Brackets 48b597a1b9 Display: Move core counters/stats to HW file.
This separates things better, so not everything is pulling in HLE.
2022-01-30 11:53:48 -08:00
Unknown W. Brackets 2bd13c5d9d Debugger: Track reason for entering stepping. 2021-10-23 16:56:15 -07:00
Unknown W. Brackets 2303cad684 SaveState: Automatically fix duplicate event types.
Some states during certain version ranges have broken state IDs.  This
will auto-heal those on load as best we can.
2021-03-02 20:09:49 -08:00
Unknown W. Brackets e326971a96 SaveState: Start new events at end properly.
Oops, off by one mistake.
2021-02-21 08:13:32 -08:00
Henrik Rydgård 93fd62f54b Merge pull request #13832 from unknownbrackets/events
SaveState: Make event restoring more obvious
2021-02-15 23:39:42 +01:00
Unknown W. Brackets b52c432f06 CoreTiming: Ensure we never idle into the past.
Better to keep away from quantum trickiness here.
2021-02-06 18:35:55 -08:00
Unknown W. Brackets 06f8ab5a49 SaveState: Make event restoring more obvious.
We still must restore all events, but everything can be taken care of
during the save state load.
2020-12-28 13:29:19 -08:00
Henrik Rydgård 821817e6d4 Move the profiler to Common 2020-10-04 11:42:16 +02:00
Henrik Rydgård e8a9845d93 First step of cleaning up Log.h. Plus a few other bits and bobs. 2020-08-16 14:48:54 +02:00
Henrik Rydgård b43698a13d Remove most instances of base/logging.h from Common, Core, GPU, more 2020-08-15 19:08:44 +02:00
Unknown W. Brackets b8342fb8ec SaveState: Rename ChunkFile files to Serialize.
Makes more sense and less weird than ChunkFileDoMap, etc.
2020-08-10 08:04:05 +00:00
Unknown W. Brackets 1dc5ee424b SaveState: Split out Do types to reduce headers. 2020-08-10 08:03:44 +00:00
Unknown W. Brackets 4b4e3432cd SaveState: Split Do() into a separate header. 2020-08-10 08:03:41 +00:00
Henrik Rydgård 0829543987 Third part of getting rid of PanicAlert 2020-07-19 20:34:02 +02:00
Henrik Rydgård c5e0b799d9 Remove category from _assert_msg_ functions. We don't filter these by category anyway.
Fixes the inconsistency where we _assert_ didn't take a category but
_assert_msg_ did.
2020-07-19 20:33:25 +02:00
Henrik Rydgård 6f97c3d422 Various platform buildfixes 2020-07-14 09:25:59 +02:00
Henrik Rydgård a9befb5496 Remove our custom atomics code entirely. 2020-05-17 13:11:36 +02:00
Henrik Rydgård af18532095 Convert atomic code in core and ConsoleListener to use C++ atomics 2020-05-17 13:04:34 +02:00
LunaMoo 9388a14a61 Add missing variable reset fixes #12002 2019-04-28 06:43:59 +02:00
Unknown W. Brackets bc4a203fcf Power: Correct hz on update and improve resched.
It only reschedules when the PLL changes, which changes in steps.  This
also reads back much more accurate Mhz for each of PLL, CPU, and bus.
2019-04-14 14:51:35 -07:00
Henrik Rydgard 0fdea30ac3 Remove "Timer Hack" setting. Untested, probably low usage and unclear utility. 2018-12-14 13:56:42 +01:00
Unknown W. Brackets 15244b7679 CoreTiming: Reset CPU mhz on reset.
Oops - this wasn't being reset, and stayed at the previous value.
See #5530.
2018-06-22 21:29:18 -07:00
Unknown W. Brackets 6fbd0e27bb Core: Remove some unused coreState funcs. 2018-06-06 05:58:50 -07:00
Henrik Rydgård b6472b562b Revert "Limit the flip delay in the other direction to try to work around #10763." 2018-05-02 10:07:37 +02:00
Henrik Rydgård 687b5f92b1 Limit the flip delay in the other direction to try to work around #10763. 2018-04-20 11:49:38 +02:00
Henrik Rydgård 22e65ba80d Get rid of ugly alignment macros and some other cruft, we now have alignas(16) from C++11 2017-08-31 01:14:51 +02:00