From 9a19e7ce7f7fe579e17250ea997e4d0de5ef3401 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Thu, 9 Apr 2026 20:05:57 +0200 Subject: [PATCH] Fix stepping when paused at a breakpoint (gdb) b *nnMain (gdb) c (gdb) si --- src/core/hle/kernel/physical_core.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/core/hle/kernel/physical_core.cpp b/src/core/hle/kernel/physical_core.cpp index e4aff43d82..8286c23a69 100644 --- a/src/core/hle/kernel/physical_core.cpp +++ b/src/core/hle/kernel/physical_core.cpp @@ -97,11 +97,16 @@ void PhysicalCore::RunThread(Kernel::KThread* thread) { } // Determine why we stopped. - const bool supervisor_call = True(hr & Core::HaltReason::SupervisorCall); - const bool prefetch_abort = True(hr & Core::HaltReason::PrefetchAbort); - const bool breakpoint = True(hr & Core::HaltReason::InstructionBreakpoint); - const bool data_abort = True(hr & Core::HaltReason::DataAbort); - const bool interrupt = True(hr & Core::HaltReason::BreakLoop); + // If a step completed successfully, skip other halt reason handlers — + // the step takes priority (e.g. step may also set InstructionBreakpoint + // if the next instruction happens to be a breakpoint). + const bool step_completed = True(hr & Core::HaltReason::StepThread) + && thread->GetStepState() == StepState::StepPerformed; + const bool supervisor_call = !step_completed && True(hr & Core::HaltReason::SupervisorCall); + const bool prefetch_abort = !step_completed && True(hr & Core::HaltReason::PrefetchAbort); + const bool breakpoint = !step_completed && True(hr & Core::HaltReason::InstructionBreakpoint); + const bool data_abort = !step_completed && True(hr & Core::HaltReason::DataAbort); + const bool interrupt = !step_completed && True(hr & Core::HaltReason::BreakLoop); // Since scheduling may occur here, we cannot use any cached // state after returning from calls we make.