From 0a262ed268ca3c99112fca9fabc80c514e31175b Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Tue, 27 Jul 2021 15:09:36 -0700 Subject: [PATCH] kern: improve single-step around user-exception entry --- .../arch/arm64/kern_exception_handlers.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/libmesosphere/source/arch/arm64/kern_exception_handlers.cpp b/libmesosphere/source/arch/arm64/kern_exception_handlers.cpp index 714ce88f..b54815e2 100644 --- a/libmesosphere/source/arch/arm64/kern_exception_handlers.cpp +++ b/libmesosphere/source/arch/arm64/kern_exception_handlers.cpp @@ -109,13 +109,9 @@ namespace ams::kern::arch::arm64 { break; } - /* If we should, clear the thread's state as single-step. */ + /* In the event that we return from this exception, we want SPSR.SS set so that we advance an instruction if single-stepping. */ #if defined(MESOSPHERE_ENABLE_HARDWARE_SINGLE_STEP) - if (AMS_UNLIKELY(GetCurrentThread().IsSingleStep())) { - GetCurrentThread().ClearSingleStep(); - cpu::MonitorDebugSystemControlRegisterAccessor().SetSoftwareStep(false).Store(); - cpu::EnsureInstructionConsistency(); - } + context->psr |= (1ul << 21); #endif /* If we should process the user exception (and it's not a breakpoint), try to enter. */ @@ -224,6 +220,15 @@ namespace ams::kern::arch::arm64 { } } + /* If we should, clear the thread's state as single-step. */ + #if defined(MESOSPHERE_ENABLE_HARDWARE_SINGLE_STEP) + if (AMS_UNLIKELY(GetCurrentThread().IsSingleStep())) { + GetCurrentThread().ClearSingleStep(); + cpu::MonitorDebugSystemControlRegisterAccessor().SetSoftwareStep(false).Store(); + cpu::EnsureInstructionConsistency(); + } + #endif + { /* Collect additional information based on the ec. */ ams::svc::DebugException exception;