uprobe registers a handler at step_hook. So, single_step_handler now
checks for user mode as well if there is a valid hook.

Signed-off-by: Pratyush Anand <pan...@redhat.com>
---
 arch/arm64/kernel/debug-monitors.c | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/arch/arm64/kernel/debug-monitors.c 
b/arch/arm64/kernel/debug-monitors.c
index 486ee94304a0..7eb13dcf09fa 100644
--- a/arch/arm64/kernel/debug-monitors.c
+++ b/arch/arm64/kernel/debug-monitors.c
@@ -238,7 +238,14 @@ static int single_step_handler(unsigned long addr, 
unsigned int esr,
        if (!reinstall_suspended_bps(regs))
                return 0;
 
-       if (user_mode(regs)) {
+#ifdef CONFIG_KPROBES
+       if (kprobe_single_step_handler(regs, esr) == DBG_HOOK_HANDLED)
+               handler_found = true;
+#endif
+       if (!handler_found && call_step_hook(regs, esr) == DBG_HOOK_HANDLED)
+               handler_found = true;
+
+       if (!handler_found && user_mode(regs)) {
                info.si_signo = SIGTRAP;
                info.si_errno = 0;
                info.si_code  = TRAP_HWBKPT;
@@ -252,22 +259,13 @@ static int single_step_handler(unsigned long addr, 
unsigned int esr,
                 * to the active-not-pending state).
                 */
                user_rewind_single_step(current);
-       } else {
-#ifdef CONFIG_KPROBES
-               if (kprobe_single_step_handler(regs, esr) == DBG_HOOK_HANDLED)
-                       handler_found = true;
-#endif
-               if (call_step_hook(regs, esr) == DBG_HOOK_HANDLED)
-                       handler_found = true;
-
-               if (!handler_found) {
-                       pr_warn("Unexpected kernel single-step exception at 
EL1\n");
-                       /*
-                        * Re-enable stepping since we know that we will be
-                        * returning to regs.
-                        */
-                       set_regs_spsr_ss(regs);
-               }
+       } else if (!handler_found) {
+               pr_warning("Unexpected kernel single-step exception at EL1\n");
+               /*
+                * Re-enable stepping since we know that we will be
+                * returning to regs.
+                */
+               set_regs_spsr_ss(regs);
        }
 
        return 0;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to