From 1bc008fe6dcbf7ee0311c88b72b68dce17b488fd Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 12 Nov 2012 14:19:03 -0500 Subject: [PATCH] --- yaml --- r: 356762 b: refs/heads/master c: ea93a6e2e73c5a1a8d1d60098f1ca5618fd5aca1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/unicore32/Kconfig | 1 - trunk/arch/unicore32/kernel/entry.S | 5 +++++ trunk/arch/unicore32/kernel/signal.c | 12 ++++++++++-- trunk/arch/x86/kernel/entry_64.S | 1 - 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 6e94bc5e08d9..8fcd853f3135 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 50b3c9e30a53172b627081e7129c03ef53f27319 +refs/heads/master: ea93a6e2e73c5a1a8d1d60098f1ca5618fd5aca1 diff --git a/trunk/arch/unicore32/Kconfig b/trunk/arch/unicore32/Kconfig index a62786fdcaab..60651df5f952 100644 --- a/trunk/arch/unicore32/Kconfig +++ b/trunk/arch/unicore32/Kconfig @@ -16,7 +16,6 @@ config UNICORE32 select ARCH_WANT_FRAME_POINTERS select GENERIC_IOMAP select MODULES_USE_ELF_REL - select GENERIC_SIGALTSTACK help UniCore-32 is 32-bit Instruction Set Architecture, including a series of low-power-consumption RISC chip diff --git a/trunk/arch/unicore32/kernel/entry.S b/trunk/arch/unicore32/kernel/entry.S index bcdedd80890e..581630d91444 100644 --- a/trunk/arch/unicore32/kernel/entry.S +++ b/trunk/arch/unicore32/kernel/entry.S @@ -674,6 +674,11 @@ ENTRY(sys_rt_sigreturn) b __sys_rt_sigreturn ENDPROC(sys_rt_sigreturn) +ENTRY(sys_sigaltstack) + ldw r2, [sp+], #S_OFF + S_SP + b do_sigaltstack +ENDPROC(sys_sigaltstack) + __INIT /* diff --git a/trunk/arch/unicore32/kernel/signal.c b/trunk/arch/unicore32/kernel/signal.c index 6905f0ebdc77..b8b2ffd774d6 100644 --- a/trunk/arch/unicore32/kernel/signal.c +++ b/trunk/arch/unicore32/kernel/signal.c @@ -123,7 +123,8 @@ asmlinkage int __sys_rt_sigreturn(struct pt_regs *regs) if (restore_sigframe(regs, &frame->sig)) goto badframe; - if (restore_altstack(&frame->sig.uc.uc_stack)) + if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->UCreg_sp) + == -EFAULT) goto badframe; return regs->UCreg_00; @@ -264,6 +265,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, { struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); + stack_t stack; int err = 0; if (!frame) @@ -273,7 +275,13 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, err |= __put_user(0, &frame->sig.uc.uc_flags); err |= __put_user(NULL, &frame->sig.uc.uc_link); - err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp); + + memset(&stack, 0, sizeof(stack)); + stack.ss_sp = (void __user *)current->sas_ss_sp; + stack.ss_flags = sas_ss_flags(regs->UCreg_sp); + stack.ss_size = current->sas_ss_size; + err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); + err |= setup_sigframe(&frame->sig, regs, set); if (err == 0) err |= setup_return(regs, ka, frame->sig.retcode, frame, usig); diff --git a/trunk/arch/x86/kernel/entry_64.S b/trunk/arch/x86/kernel/entry_64.S index 07a7a04529bc..2f2f57ac3748 100644 --- a/trunk/arch/x86/kernel/entry_64.S +++ b/trunk/arch/x86/kernel/entry_64.S @@ -886,7 +886,6 @@ ENTRY(stub_execve) SAVE_REST FIXUP_TOP_OF_STACK %r11 call sys_execve - RESTORE_TOP_OF_STACK %r11 movq %rax,RAX(%rsp) RESTORE_REST jmp int_ret_from_sys_call