Commit Graph
93 Commits
Author SHA1 Message Date
Henrik Rydgård b42157aa49 Core: Add utility function to properly report memory exceptions from HLE functions (when they would actually crash the PSP) 2026-08-10 10:41:32 +02:00
Henrik RydgårdandClaude Sonnet 5 5df8c14f1e Core_RunOnCPUThread: drain the queue from NativeFrame(), not just Core_RunLoopUntil()
Core_RunLoopUntil() is only reached while a game is actually loaded and
running (via EmuScreen). Anything calling Core_RunOnCPUThread() while at
the main menu with no game loaded would hang forever waiting for a queue
that was never drained. Call Core_ProcessCPUQueue() directly from
NativeFrame(), just before screenManager->render(), so it always runs;
Core_RunLoopUntil() still also drains it for the tight-spin-while-stepping
case once a game is running.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hqm11k99viLfbJm2MkH4BH
2026-08-08 17:22:12 +02:00
Henrik RydgårdandClaude Sonnet 5 f72709feb0 Legacy Win32 debugger: fix the painting problem with a frame-scoped mutex
Debugger windows (register list, disassembly view, memory view, breakpoint/
thread/module/stack lists, watch list) read CPU-thread-owned state directly
from the GUI thread's WM_PAINT/list-fill handlers, racing against the CPU
thread. Routing every read through Core_RunOnCPUThread would be too slow for
something invoked continuously on paint/list-refresh.

Add g_frameMutex (Core.h/Core.cpp), held by NativeFrame() only across the
span where it actually touches that state (running the CPU, processing
breakpoints, running the ImGui debugger) - not across input handling or the
present/frame-pacing waits. Debugger windows now hold the same mutex while
reading, giving synchronized reads without the round-trip cost of queuing
to the CPU thread.

CtrlRegisterList::onPaint() goes back to always reading live values (now
safe under the lock) and grays them out by color alone while the core is
running, rather than the earlier snapshot-caching approach.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hqm11k99viLfbJm2MkH4BH
2026-08-08 17:22:12 +02:00
Henrik RydgårdandClaude Sonnet 5 29825c1e61 Debugger: Route the rest of SteppingSubscriber.cpp's handlers through the CPU thread
Extends the cpu.stepInto treatment to cpu.stepOver, cpu.stepOut, cpu.runUntil,
and cpu.nextHLE: each now routes its breakpoint/stepping manipulation through
Core_RunOnCPUThread() instead of touching it directly from the WebSocket
handler thread. cpu.runUntil didn't have an explicit "must be stepping"
guard to begin with; since the CPU-thread queue is now drained unconditionally
at the top of every Core_RunLoopUntil() iteration (not just while stepping),
queuing from it is safe regardless of current core state.

Also corrects a stale comment on Core_RunOnCPUThread() left over from before
the drain point moved from Core_ProcessStepping() to the top of
Core_RunLoopUntil() - it's not limited to the stepping/paused case.

Replaced remaining `auto` locals in this file with concrete types.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hqm11k99viLfbJm2MkH4BH
2026-08-08 11:32:01 +02:00
Henrik RydgårdandClaude Sonnet 5 c6fccefa49 Debugger: Route cpu.stepInto's stepping state through the CPU thread
The WebSocket debugger's cpu.stepInto handler ran entirely on the WebSocket
handler thread, directly manipulating breakpoints and stepping state (via
Core_RequestCPUStep, g_breakpoints.SetSkipFirst, etc.) that's otherwise only
ever touched from the CPU thread (the one that calls Core_RunLoopUntil, and
thus indirectly NativeFrame).

Adds Core_RunOnCPUThread() - queues a function to run on the CPU thread and
blocks the caller until it's done. The queue is drained at the top of
Core_RunLoopUntil()'s loop, so it's reached continuously (in a tight spin)
while the CPU is stepping/paused, and at least once per call even while fully
running.

cpu.stepInto is the first consumer: once the CPU is already stepping, the
breakpoint/stepping manipulation is now routed through Core_RunOnCPUThread
instead of happening directly on the WebSocket thread. The "not currently
stepping" path still calls Core_Break() directly from the WebSocket thread,
since it's already documented free-threaded and is what makes the CPU thread
start reaching the queue-drain point in the first place.

More WebSocket debugger commands can be converted the same way going forward.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hqm11k99viLfbJm2MkH4BH
2026-08-08 11:21:46 +02:00
Henrik RydgårdandClaude Sonnet 5 b1f0112cef Debugger: Remove opcode-fusion display and fix cpu step size units
DisassemblyManager used to fuse lui+addiu/load/store into single pseudo-
instructions ("li", fused loads/stores) for display. This only applied to a
handful of opcodes, complicated DisassemblyManager, and was the root cause of
a stepping bug: Core_PerformCPUStep's Into/Over cases treated stepSize as a
byte count, while the WebSocket cpu.stepInto handler computed it as an
instruction count (needed to step over a whole fused macro in one go) - so a
plain, non-fused stepInto silently executed zero instructions.

Removed the fusion logic entirely (DisassemblyMacro, DISTYPE_MACRO) - every
disassembly line is now exactly one 4-byte instruction. With that,
"how many instructions does this line span" is always 1, so the
getInstructionSizeAt() byte-size queries in the legacy Windows and ImGui
debuggers are gone too; step requests just pass 1. Core_RequestCPUStep's
stepSize is now consistently in instructions everywhere.

Also fixes the PPSSPPHeadless build, broken since 0ed1f3e added
OpenWebDebugger() (which calls System_LaunchUrl) without a headless stub.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hqm11k99viLfbJm2MkH4BH
2026-08-08 11:16:36 +02:00
Henrik Rydgård 3139d7ccfe Add command line parameters for controlling the behavior on memory/instruction exceptions 2026-07-27 18:37:26 +02:00
Henrik Rydgård b27a022e7c Remove two states from the CoreState enum. 2025-04-05 09:18:56 +02:00
Henrik Rydgård 24b30cc709 Mostly remove coreState management from System.cpp 2025-04-05 09:18:56 +02:00
Henrik Rydgård d11f8609ea Add an easy way to break into the imdebugger from assert messageboxs ("No") 2025-03-19 14:22:02 +01:00
Henrik Rydgård 4989ec61d9 BreakpointManager: Safer and simpler updates. 2025-03-03 13:59:42 +01: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 85c015efb8 Remove redundant shutdown callback 2025-02-13 15:13:25 -06:00
Henrik Rydgård 63a41e7635 Windows: Fix mis-interaction between no-menu pause and pause on window lost focus, reported by IRVN 2025-01-23 14:32:38 +01:00
Henrik Rydgård 4dd3621fa0 Remove some unnecessary <algorithm> includes. 2024-12-18 17:04:27 +01:00
Henrik Rydgård 3e198c53b2 More include cleanup 2024-12-18 13:57:26 +01:00
Henrik Rydgård de3617529f const, rename a function 2024-12-10 01:01:31 +01:00
Henrik Rydgård 93baf22369 ImDebugger: Add frame-stepping and a "skim" button (single-steps while held down) 2024-12-08 15:12:13 +01:00
Henrik Rydgård 080798b5dd Move out two more functions from Core.cpp. Clean up Windows includes 2024-12-08 12:12:02 +01:00
Henrik Rydgård 83af54950f Move more core-related stuff into Core.cpp/h 2024-12-08 11:54:58 +01:00
Henrik Rydgård df91f699fc Move the core loop to Core.cpp 2024-12-08 11:47:12 +01:00
Henrik Rydgård 474e7acf54 Hook up the new (bare-bones) ImGui debug window to GPU stepping, fix stepping. 2024-12-05 00:51:59 +01:00
Henrik Rydgård 9ed8d8871e Ge stepping without wait: Tex/Prim stepping works. Draw/Single have issues. 2024-12-05 00:36:48 +01:00
Henrik Rydgård ea43e07cce Move some stuff around, rename some stuff 2024-12-05 00:36:48 +01:00
Henrik Rydgård 0f97578a35 Replace a bad function 2024-12-03 20:33:12 +01:00
Henrik Rydgård 2b8414b437 Move irrelevant code out of Core.cpp 2024-12-02 13:26:41 +01:00
Henrik Rydgård e94defbb15 Get the CORE_RUNNING_GE coreState working! 2024-12-01 22:49:18 +01:00
Henrik Rydgård e6ae256da8 Fix regression with Debug->Stop (Ctrl+W). Delete some duplicate code. 2024-11-29 17:18:34 +01:00
Henrik Rydgård 3a5968ba33 Don't block the render thread while the CPU is paused. This is a prereq for imgui debuggers. 2024-11-05 12:53:21 +01:00
Henrik Rydgård e19ad1f359 Remove return value from Core_PerformStep 2024-11-05 12:53:21 +01:00
Henrik Rydgård c787149472 Start moving the CPU debug-step logic to Core.cpp 2024-11-03 17:54:51 +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 20626ebfee When we enforce run-behind due to multiplayer, show "Network connected" on the pause screen 2024-01-21 12:02:30 +01:00
Henrik Rydgård b899a178bf Change approach (call from NativeFrame instead). Add Mac support 2024-01-18 18:21:12 +01:00
Henrik Rydgård d51da3ca60 Windows: Add "Restart Graphics" to the debug menu. Useful to debug resource lifetime issues. 2024-01-18 15:57:45 +01:00
Henrik Rydgård 3ce843819e Show a notification if a game exits with sceKernelExitGame. Mainly useful for homebrew. 2024-01-15 10:36:32 +01:00
Henrik Rydgård acd719448e Wrap g_Config.bRunBehindPauseMenu behind a function, so we can add conditions 2023-12-30 21:50:20 +01:00
Herman Semenov af41281761 [Core/Dialog/ELF/FileSystems/HLE/HW/Util] Added const reference for function params 2023-12-14 14:22:24 +03:00
Henrik Rydgård 0477ba8c78 Core.cpp: Some slight simplifications 2023-08-10 17:15:56 +02:00
Henrik Rydgård be708e3e02 Move KeepScreenAwake to platform specific code. 2023-08-10 16:12:12 +02:00
Henrik Rydgård 5ee04ce403 SDL: Break out event processing from main loop
Makes things a bit easier to work with.
2023-08-08 12:28:42 +02:00
Henrik Rydgård ab37b8dea9 Rename a couple of types to avoid clashes with a Mac header, sigh. 2023-04-28 13:38:16 +02:00
Henrik Rydgård 2814668cf5 Show a MIPS stack trace on crash screen (#17211)
* Print simple stack traces to log on crashes.

* Display stack traces on crash screen

* Show the in-function offset in the printed callstacks.

* Libretro buildfix attempt
2023-03-31 10:08:12 +02:00
Henrik Rydgård 436a3e0d61 Cleaner exit from emuthread, as used by OpenGL. Don't know how it worked before... 2023-01-30 11:49:31 +01:00
Henrik Rydgård aa80659530 Memory exception: Add facility to track size
Might theoretically help in tracking some things down.

Not fully utilized yet, the fault handler needs to extract the
information from the faulting instruction. But we can use it for
GetPointerRange etc.
2023-01-01 20:30:29 +01:00
Henrik Rydgård 97fadbcecb Show bluescreen properly on memory errors that we failed to ignore.
Previously we just wouldn't draw it but still would be in the error
state.
2022-12-30 12:29:23 +01:00
Unknown W. Brackets 8e7847f6d9 UI: Show return address for exec crashes. 2022-08-21 14:49:34 -07:00
Unknown W. Brackets 90517ace59 irjit: Validate alignment in slow memory mode. 2022-08-21 13:24:10 -07:00
Unknown W. Brackets fc2efe5dff Debugger: Add reason to cpu.stepping event. 2021-10-23 22:08:15 -07:00
Unknown W. Brackets 2bd13c5d9d Debugger: Track reason for entering stepping. 2021-10-23 16:56:15 -07:00