|
@@ -413,16 +413,6 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
|
|
regs->ss = __USER_DS;
|
|
regs->ss = __USER_DS;
|
|
regs->cs = __USER_CS;
|
|
regs->cs = __USER_CS;
|
|
|
|
|
|
- /*
|
|
|
|
- * Clear TF when entering the signal handler, but
|
|
|
|
- * notify any tracer that was single-stepping it.
|
|
|
|
- * The tracer may want to single-step inside the
|
|
|
|
- * handler too.
|
|
|
|
- */
|
|
|
|
- regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF);
|
|
|
|
- if (test_thread_flag(TIF_SINGLESTEP))
|
|
|
|
- ptrace_notify(SIGTRAP);
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
give_sigsegv:
|
|
give_sigsegv:
|
|
@@ -501,16 +491,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|
regs->ss = __USER_DS;
|
|
regs->ss = __USER_DS;
|
|
regs->cs = __USER_CS;
|
|
regs->cs = __USER_CS;
|
|
|
|
|
|
- /*
|
|
|
|
- * Clear TF when entering the signal handler, but
|
|
|
|
- * notify any tracer that was single-stepping it.
|
|
|
|
- * The tracer may want to single-step inside the
|
|
|
|
- * handler too.
|
|
|
|
- */
|
|
|
|
- regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF);
|
|
|
|
- if (test_thread_flag(TIF_SINGLESTEP))
|
|
|
|
- ptrace_notify(SIGTRAP);
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
give_sigsegv:
|
|
give_sigsegv:
|
|
@@ -566,6 +546,21 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Clear the direction flag as per the ABI for function entry.
|
|
|
|
+ */
|
|
|
|
+ regs->flags &= ~X86_EFLAGS_DF;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Clear TF when entering the signal handler, but
|
|
|
|
+ * notify any tracer that was single-stepping it.
|
|
|
|
+ * The tracer may want to single-step inside the
|
|
|
|
+ * handler too.
|
|
|
|
+ */
|
|
|
|
+ regs->flags &= ~X86_EFLAGS_TF;
|
|
|
|
+ if (test_thread_flag(TIF_SINGLESTEP))
|
|
|
|
+ ptrace_notify(SIGTRAP);
|
|
|
|
+
|
|
spin_lock_irq(¤t->sighand->siglock);
|
|
spin_lock_irq(¤t->sighand->siglock);
|
|
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
|
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
|
if (!(ka->sa.sa_flags & SA_NODEFER))
|
|
if (!(ka->sa.sa_flags & SA_NODEFER))
|