From 4223daac72cee7fa2352ca24b3fb0ee8c54a1dc8 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Sun, 23 Dec 2012 02:52:40 -0500 Subject: [PATCH] --- yaml --- r: 356687 b: refs/heads/master c: e8d9ef09df5f86f564a2ab6e8f1397121b1bad66 h: refs/heads/master i: 356685: aa70719a9cf4ee6ca2d95049e84a28c10cb0d5a9 356683: dd0b79378675acc082a3154b5d3792f40fa5ccc8 356679: 3b2291cfb4bc6428d7538a9dbae0d166f8d5decd 356671: 9e023ceb9ec558d484bfc2f64b661f8091937034 v: v3 --- [refs] | 2 +- trunk/arch/hexagon/Kconfig | 1 - trunk/arch/hexagon/kernel/signal.c | 16 ++++++++++++++-- trunk/arch/ia64/Kconfig | 1 + trunk/arch/ia64/kernel/signal.c | 19 +++---------------- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/[refs] b/[refs] index 84959e20a2f1..63352dea47e3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: da36f98a52e3a299fa067967e2928e9d53d3102f +refs/heads/master: e8d9ef09df5f86f564a2ab6e8f1397121b1bad66 diff --git a/trunk/arch/hexagon/Kconfig b/trunk/arch/hexagon/Kconfig index 3e6e27c11f93..0744f7d7b1fd 100644 --- a/trunk/arch/hexagon/Kconfig +++ b/trunk/arch/hexagon/Kconfig @@ -31,7 +31,6 @@ config HEXAGON select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS_BROADCAST select MODULES_USE_ELF_RELA - select GENERIC_SIGALTSTACK ---help--- Qualcomm Hexagon is a processor architecture designed for high performance and low power across a wide variety of applications. diff --git a/trunk/arch/hexagon/kernel/signal.c b/trunk/arch/hexagon/kernel/signal.c index 60fa2ca3202b..fe0d1373165d 100644 --- a/trunk/arch/hexagon/kernel/signal.c +++ b/trunk/arch/hexagon/kernel/signal.c @@ -125,7 +125,6 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info, err |= __put_user(0x5400c004, &frame->tramp[1]); err |= setup_sigcontext(regs, &frame->uc.uc_mcontext); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); - err |= __save_altstack(&frame->uc.uc_stack, user_stack_pointer(regs)); if (err) goto sigsegv; @@ -248,6 +247,12 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) /* * Architecture-specific wrappers for signal-related system calls */ +asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) +{ + struct pt_regs *regs = current_pt_regs(); + + return do_sigaltstack(uss, uoss, regs->r29); +} asmlinkage int sys_rt_sigreturn(void) { @@ -283,7 +288,14 @@ asmlinkage int sys_rt_sigreturn(void) */ regs->syscall_nr = __NR_rt_sigreturn; - if (restore_altstack(&frame->uc.uc_stack)) + /* + * If we were meticulous, we'd only call this if we knew that + * we were actually going to use an alternate stack, and we'd + * consider any error to be fatal. What we do here, in common + * with many other architectures, is call it blindly and only + * consider the -EFAULT return case to be proof of a problem. + */ + if (do_sigaltstack(&frame->uc.uc_stack, NULL, pt_psp(regs)) == -EFAULT) goto badframe; return 0; diff --git a/trunk/arch/ia64/Kconfig b/trunk/arch/ia64/Kconfig index 3279646120e3..98482d1cbc5b 100644 --- a/trunk/arch/ia64/Kconfig +++ b/trunk/arch/ia64/Kconfig @@ -42,6 +42,7 @@ config IA64 select GENERIC_TIME_VSYSCALL_OLD select HAVE_MOD_ARCH_SPECIFIC select MODULES_USE_ELF_RELA + select GENERIC_SIGALTSTACK default y help The Itanium Processor Family is Intel's 64-bit successor to diff --git a/trunk/arch/ia64/kernel/signal.c b/trunk/arch/ia64/kernel/signal.c index 680b73786be8..3637e03d2282 100644 --- a/trunk/arch/ia64/kernel/signal.c +++ b/trunk/arch/ia64/kernel/signal.c @@ -39,14 +39,6 @@ # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0]) #endif -asmlinkage long -sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2, - long arg3, long arg4, long arg5, long arg6, long arg7, - struct pt_regs regs) -{ - return do_sigaltstack(uss, uoss, regs.r12); -} - static long restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) { @@ -208,11 +200,8 @@ ia64_rt_sigreturn (struct sigscratch *scr) printk("SIG return (%s:%d): sp=%lx ip=%lx\n", current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip); #endif - /* - * It is more difficult to avoid calling this function than to - * call it and ignore errors. - */ - do_sigaltstack(&sc->sc_stack, NULL, scr->pt.r12); + if (restore_altstack(&sc->sc_stack)) + goto give_sigsegv; return retval; give_sigsegv: @@ -376,9 +365,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, err |= copy_siginfo_to_user(&frame->info, info); - err |= __put_user(current->sas_ss_sp, &frame->sc.sc_stack.ss_sp); - err |= __put_user(current->sas_ss_size, &frame->sc.sc_stack.ss_size); - err |= __put_user(sas_ss_flags(scr->pt.r12), &frame->sc.sc_stack.ss_flags); + err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12); err |= setup_sigcontext(&frame->sc, set, scr); if (unlikely(err))