diff options
Diffstat (limited to 'arch/x86/kernel/signal_32.c')
-rw-r--r-- | arch/x86/kernel/signal_32.c | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index f1b117930837..8e05e7f7bd40 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
@@ -413,16 +413,6 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
413 | regs->ss = __USER_DS; | 413 | regs->ss = __USER_DS; |
414 | regs->cs = __USER_CS; | 414 | regs->cs = __USER_CS; |
415 | 415 | ||
416 | /* | ||
417 | * Clear TF when entering the signal handler, but | ||
418 | * notify any tracer that was single-stepping it. | ||
419 | * The tracer may want to single-step inside the | ||
420 | * handler too. | ||
421 | */ | ||
422 | regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF); | ||
423 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
424 | ptrace_notify(SIGTRAP); | ||
425 | |||
426 | return 0; | 416 | return 0; |
427 | 417 | ||
428 | give_sigsegv: | 418 | give_sigsegv: |
@@ -501,16 +491,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
501 | regs->ss = __USER_DS; | 491 | regs->ss = __USER_DS; |
502 | regs->cs = __USER_CS; | 492 | regs->cs = __USER_CS; |
503 | 493 | ||
504 | /* | ||
505 | * Clear TF when entering the signal handler, but | ||
506 | * notify any tracer that was single-stepping it. | ||
507 | * The tracer may want to single-step inside the | ||
508 | * handler too. | ||
509 | */ | ||
510 | regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF); | ||
511 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
512 | ptrace_notify(SIGTRAP); | ||
513 | |||
514 | return 0; | 494 | return 0; |
515 | 495 | ||
516 | give_sigsegv: | 496 | give_sigsegv: |
@@ -566,6 +546,21 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
566 | if (ret) | 546 | if (ret) |
567 | return ret; | 547 | return ret; |
568 | 548 | ||
549 | /* | ||
550 | * Clear the direction flag as per the ABI for function entry. | ||
551 | */ | ||
552 | regs->flags &= ~X86_EFLAGS_DF; | ||
553 | |||
554 | /* | ||
555 | * Clear TF when entering the signal handler, but | ||
556 | * notify any tracer that was single-stepping it. | ||
557 | * The tracer may want to single-step inside the | ||
558 | * handler too. | ||
559 | */ | ||
560 | regs->flags &= ~X86_EFLAGS_TF; | ||
561 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
562 | ptrace_notify(SIGTRAP); | ||
563 | |||
569 | spin_lock_irq(¤t->sighand->siglock); | 564 | spin_lock_irq(¤t->sighand->siglock); |
570 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); | 565 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); |
571 | if (!(ka->sa.sa_flags & SA_NODEFER)) | 566 | if (!(ka->sa.sa_flags & SA_NODEFER)) |