arm64: switch to generic sigaltstack
Al Viro [Sun, 23 Dec 2012 06:56:45 +0000 (01:56 -0500)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

arch/arm64/Kconfig
arch/arm64/include/asm/syscalls.h
arch/arm64/include/asm/unistd32.h
arch/arm64/kernel/entry.S
arch/arm64/kernel/signal.c
arch/arm64/kernel/signal32.c
arch/arm64/kernel/sys.c
arch/arm64/kernel/sys32.S

index f8f362a..d9c901d 100644 (file)
@@ -10,6 +10,7 @@ config ARM64
        select GENERIC_IOMAP
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
+       select GENERIC_SIGALTSTACK
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL
        select HARDIRQS_SW_RESEND
index 20d63b2..48fe7c6 100644 (file)
@@ -24,8 +24,6 @@
  * System call wrappers implemented in kernel/entry.S.
  */
 asmlinkage long sys_rt_sigreturn_wrapper(void);
-asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss,
-                                       stack_t __user *uoss);
 
 #include <asm-generic/syscalls.h>
 
index 5ef47ba..008406a 100644 (file)
@@ -207,7 +207,7 @@ __SYSCALL(182, sys_chown16)
 __SYSCALL(183, sys_getcwd)
 __SYSCALL(184, sys_capget)
 __SYSCALL(185, sys_capset)
-__SYSCALL(186, compat_sys_sigaltstack_wrapper)
+__SYSCALL(186, compat_sys_sigaltstack)
 __SYSCALL(187, compat_sys_sendfile)
 __SYSCALL(188, sys_ni_syscall)                 /* 188 reserved */
 __SYSCALL(189, sys_ni_syscall)                 /* 189 reserved */
index 9c94f40..514d609 100644 (file)
@@ -677,10 +677,5 @@ ENTRY(sys_rt_sigreturn_wrapper)
        b       sys_rt_sigreturn
 ENDPROC(sys_rt_sigreturn_wrapper)
 
-ENTRY(sys_sigaltstack_wrapper)
-       ldr     x2, [sp, #S_SP]
-       b       sys_sigaltstack
-ENDPROC(sys_sigaltstack_wrapper)
-
 ENTRY(handle_arch_irq)
        .quad   0
index abd7563..890a591 100644 (file)
@@ -149,8 +149,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigframe(regs, frame))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack,
-                          NULL, regs->sp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return regs->regs[0];
@@ -164,12 +163,6 @@ badframe:
        return 0;
 }
 
-asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-                               unsigned long sp)
-{
-       return do_sigaltstack(uss, uoss, sp);
-}
-
 static int setup_sigframe(struct rt_sigframe __user *sf,
                          struct pt_regs *regs, sigset_t *set)
 {
@@ -250,7 +243,6 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
                          sigset_t *set, struct pt_regs *regs)
 {
        struct rt_sigframe __user *frame;
-       stack_t stack;
        int err = 0;
 
        frame = get_sigframe(ka, regs);
@@ -260,12 +252,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
        __put_user_error(0, &frame->uc.uc_flags, err);
        __put_user_error(NULL, &frame->uc.uc_link, err);
 
-       memset(&stack, 0, sizeof(stack));
-       stack.ss_sp = (void __user *)current->sas_ss_sp;
-       stack.ss_flags = sas_ss_flags(regs->sp);
-       stack.ss_size = current->sas_ss_size;
-       err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack));
-
+       err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
        err |= setup_sigframe(frame, regs, set);
        if (err == 0) {
                setup_return(regs, ka, frame, usig);
index a4db3d2..54920c5 100644 (file)
@@ -42,12 +42,6 @@ struct compat_old_sigaction {
        compat_uptr_t                   sa_restorer;
 };
 
-typedef struct compat_sigaltstack {
-       compat_uptr_t                   ss_sp;
-       int                             ss_flags;
-       compat_size_t                   ss_size;
-} compat_stack_t;
-
 struct compat_sigcontext {
        /* We always set these two fields to 0 */
        compat_ulong_t                  trap_no;
@@ -423,43 +417,6 @@ asmlinkage int compat_sys_rt_sigaction(int sig,
        return ret;
 }
 
-int compat_do_sigaltstack(compat_uptr_t compat_uss, compat_uptr_t compat_uoss,
-                         compat_ulong_t sp)
-{
-       compat_stack_t __user *newstack = compat_ptr(compat_uss);
-       compat_stack_t __user *oldstack = compat_ptr(compat_uoss);
-       compat_uptr_t ss_sp;
-       int ret;
-       mm_segment_t old_fs;
-       stack_t uss, uoss;
-
-       /* Marshall the compat new stack into a stack_t */
-       if (newstack) {
-               if (get_user(ss_sp, &newstack->ss_sp) ||
-                   __get_user(uss.ss_flags, &newstack->ss_flags) ||
-                   __get_user(uss.ss_size, &newstack->ss_size))
-                       return -EFAULT;
-               uss.ss_sp = compat_ptr(ss_sp);
-       }
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       /* The __user pointer casts are valid because of the set_fs() */
-       ret = do_sigaltstack(
-               newstack ? (stack_t __user *) &uss : NULL,
-               oldstack ? (stack_t __user *) &uoss : NULL,
-               (unsigned long)sp);
-       set_fs(old_fs);
-
-       /* Convert the old stack_t into a compat stack. */
-       if (!ret && oldstack &&
-               (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) ||
-                __put_user(uoss.ss_flags, &oldstack->ss_flags) ||
-                __put_user(uoss.ss_size, &oldstack->ss_size)))
-               return -EFAULT;
-       return ret;
-}
-
 static int compat_restore_sigframe(struct pt_regs *regs,
                                   struct compat_sigframe __user *sf)
 {
@@ -562,9 +519,7 @@ asmlinkage int compat_sys_rt_sigreturn(struct pt_regs *regs)
        if (compat_restore_sigframe(regs, &frame->sig))
                goto badframe;
 
-       if (compat_do_sigaltstack(ptr_to_compat(&frame->sig.uc.uc_stack),
-                                ptr_to_compat((void __user *)NULL),
-                                regs->compat_sp) == -EFAULT)
+       if (compat_restore_altstack(&frame->sig.uc.uc_stack))
                goto badframe;
 
        return regs->regs[0];
@@ -705,11 +660,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
        __put_user_error(0, &frame->sig.uc.uc_flags, err);
        __put_user_error(NULL, &frame->sig.uc.uc_link, err);
 
-       memset(&stack, 0, sizeof(stack));
-       stack.ss_sp = (compat_uptr_t)current->sas_ss_sp;
-       stack.ss_flags = sas_ss_flags(regs->compat_sp);
-       stack.ss_size = current->sas_ss_size;
-       err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
+       err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->compat_sp);
 
        err |= compat_setup_sigframe(&frame->sig, regs, set);
 
index 8292a9b..3fa98ff 100644 (file)
@@ -40,7 +40,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
  * Wrappers to pass the pt_regs argument.
  */
 #define sys_rt_sigreturn       sys_rt_sigreturn_wrapper
-#define sys_sigaltstack                sys_sigaltstack_wrapper
 
 #include <asm/syscalls.h>
 
index 7ef59e9..6abb057 100644 (file)
@@ -39,11 +39,6 @@ compat_sys_rt_sigreturn_wrapper:
        b       compat_sys_rt_sigreturn
 ENDPROC(compat_sys_rt_sigreturn_wrapper)
 
-compat_sys_sigaltstack_wrapper:
-       ldr     x2, [sp, #S_COMPAT_SP]
-       b       compat_do_sigaltstack
-ENDPROC(compat_sys_sigaltstack_wrapper)
-
 compat_sys_statfs64_wrapper:
        mov     w3, #84
        cmp     w1, #88