@@ -104,6 +104,7 @@ void user_regs_reset_single_step(struct user_pt_regs *regs,
void kernel_enable_single_step(struct pt_regs *regs);
void kernel_disable_single_step(void);
int kernel_active_single_step(void);
+void kernel_regs_reset_single_step(struct pt_regs *regs);
#ifdef CONFIG_HAVE_HW_BREAKPOINT
int reinstall_suspended_bps(struct pt_regs *regs);
@@ -438,6 +438,11 @@ int kernel_active_single_step(void)
}
NOKPROBE_SYMBOL(kernel_active_single_step);
+void kernel_regs_reset_single_step(struct pt_regs *regs)
+{
+ set_regs_spsr_ss(regs);
+}
+
/* ptrace API */
void user_enable_single_step(struct task_struct *task)
{
@@ -252,6 +252,8 @@ int kgdb_arch_handle_exception(int exception_vector, int signo,
if (!kernel_active_single_step()) {
kgdb_save_local_irqflag(linux_regs);
kernel_enable_single_step(linux_regs);
+ } else {
+ kernel_regs_reset_single_step(linux_regs);
}
err = 0;
break;