From 42cafe9e60eb62cac85f5f55fc95ebc61a45ab0c Mon Sep 17 00:00:00 2001 From: Hiroshi Shimamoto Date: Thu, 19 Mar 2009 10:56:29 -0700 Subject: [PATCH] --- yaml --- r: 138820 b: refs/heads/master c: 14fc9fbc700dc95b4f46ebd588169324fe6deff8 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/x86/include/asm/dmi.h | 5 +--- trunk/arch/x86/kernel/signal.c | 48 ++++++++++++++++++-------------- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/[refs] b/[refs] index 0755ae77ca88..b90cbf22485c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c8608d6b58981a58ca4aee8308576666c5f7ab0c +refs/heads/master: 14fc9fbc700dc95b4f46ebd588169324fe6deff8 diff --git a/trunk/arch/x86/include/asm/dmi.h b/trunk/arch/x86/include/asm/dmi.h index fd8f9e2ca35f..aa32f7e6c197 100644 --- a/trunk/arch/x86/include/asm/dmi.h +++ b/trunk/arch/x86/include/asm/dmi.h @@ -1,13 +1,10 @@ #ifndef _ASM_X86_DMI_H #define _ASM_X86_DMI_H -#include -#include - #include #include -static __always_inline __init void *dmi_alloc(unsigned len) +static inline void *dmi_alloc(unsigned len) { return extend_brk(len, sizeof(int)); } diff --git a/trunk/arch/x86/kernel/signal.c b/trunk/arch/x86/kernel/signal.c index d2cc6428c587..dfcc74ab0ab6 100644 --- a/trunk/arch/x86/kernel/signal.c +++ b/trunk/arch/x86/kernel/signal.c @@ -211,31 +211,27 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, { /* Default to using normal stack */ unsigned long sp = regs->sp; + int onsigstack = on_sig_stack(sp); #ifdef CONFIG_X86_64 /* redzone */ sp -= 128; #endif /* CONFIG_X86_64 */ - /* - * If we are on the alternate signal stack and would overflow it, don't. - * Return an always-bogus address instead so we will die with SIGSEGV. - */ - if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size))) - return (void __user *) -1L; - - /* This is the X/Open sanctioned signal stack switching. */ - if (ka->sa.sa_flags & SA_ONSTACK) { - if (sas_ss_flags(sp) == 0) - sp = current->sas_ss_sp + current->sas_ss_size; - } else { + if (!onsigstack) { + /* This is the X/Open sanctioned signal stack switching. */ + if (ka->sa.sa_flags & SA_ONSTACK) { + if (sas_ss_flags(sp) == 0) + sp = current->sas_ss_sp + current->sas_ss_size; + } else { #ifdef CONFIG_X86_32 - /* This is the legacy signal stack switching. */ - if ((regs->ss & 0xffff) != __USER_DS && - !(ka->sa.sa_flags & SA_RESTORER) && - ka->sa.sa_restorer) - sp = (unsigned long) ka->sa.sa_restorer; + /* This is the legacy signal stack switching. */ + if ((regs->ss & 0xffff) != __USER_DS && + !(ka->sa.sa_flags & SA_RESTORER) && + ka->sa.sa_restorer) + sp = (unsigned long) ka->sa.sa_restorer; #endif /* CONFIG_X86_32 */ + } } if (used_math()) { @@ -244,12 +240,22 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, sp = round_down(sp, 64); #endif /* CONFIG_X86_64 */ *fpstate = (void __user *)sp; - - if (save_i387_xstate(*fpstate) < 0) - return (void __user *)-1L; } - return (void __user *)align_sigframe(sp - frame_size); + sp = align_sigframe(sp - frame_size); + + /* + * If we are on the alternate signal stack and would overflow it, don't. + * Return an always-bogus address instead so we will die with SIGSEGV. + */ + if (onsigstack && !likely(on_sig_stack(sp))) + return (void __user *)-1L; + + /* save i387 state */ + if (used_math() && save_i387_xstate(*fpstate) < 0) + return (void __user *)-1L; + + return (void __user *)sp; } #ifdef CONFIG_X86_32