diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-26 09:44:32 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-26 09:44:32 -0700 |
commit | b82287587ef9917afbea5fcbf7aa63424b6f3719 (patch) | |
tree | 4b27b46c41ea9d26ee44f1f0f7e8ddcd3a17f6a2 /arch/x86/kernel/signal_32.c | |
parent | 2a8a2719be1397c64e726ccd1c0933a11dc493d0 (diff) | |
parent | 5afca33a43786408ce74540b54855973dde32bab (diff) | |
download | talos-op-linux-b82287587ef9917afbea5fcbf7aa63424b6f3719.tar.gz talos-op-linux-b82287587ef9917afbea5fcbf7aa63424b6f3719.zip |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86-misc
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86-misc: (28 commits)
x86: section mismatch fixes, #3
x86: section mismatch fixes, #2
x86: pgtable_32.h - prototype and section mismatch fixes
x86: unlock_ExtINT_logic() - fix section mismatch warnings
x86: uniq_ioapic_id - fix section mismatch warning
x86: trampoline_32.S - switch to .cpuinit.data
x86: use get_bios_ebda()
x86: remove duplicate get_bios_ebda() from rio.h
x86: get_bios_ebda() requires asm/io.h
x86: use cpumask function for present, possible, and online cpus
x86: cleanup div_sc() usage
x86: cleanup clocksource_hz2mult usage
x86: remove unnecessary memset and NULL check after alloc_bootmem()
x86: use bitmap library for pin_programmed
x86: use MP_intsrc_info()
x86: use BUILD_BUG_ON() for the size of struct intel_mp_floating
x86_64 ia32 ptrace: convert to compat_arch_ptrace
x86_64 ia32 ptrace: use compat_ptrace_request for siginfo
x86 signals: lift set_fs
x86 signals: lift flags diddling code
...
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, regs->ss = __USER_DS; 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; 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->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; give_sigsegv: @@ -566,6 +546,21 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, if (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); sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); if (!(ka->sa.sa_flags & SA_NODEFER)) |