s390: switch to generic old sigaction()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 26 Dec 2012 00:26:12 +0000 (19:26 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 3 Feb 2013 23:16:14 +0000 (18:16 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/s390/Kconfig
arch/s390/include/asm/signal.h
arch/s390/kernel/compat_linux.h
arch/s390/kernel/compat_signal.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/entry.h
arch/s390/kernel/signal.c

index e3ab2d6..bcdcf31 100644 (file)
@@ -146,6 +146,7 @@ config S390
        select GENERIC_COMPAT_RT_SIGPROCMASK
        select GENERIC_COMPAT_RT_SIGPENDING
        select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config SCHED_OMIT_FRAME_POINTER
        def_bool y
@@ -255,6 +256,7 @@ config COMPAT
        depends on 64BIT
        select COMPAT_BINFMT_ELF if BINFMT_ELF
        select ARCH_WANT_OLD_COMPAT_IPC
+       select COMPAT_OLD_SIGACTION
        help
          Select this option if you want to enable your system kernel to
          handle system-calls from ELF binaries for 31 bit ESA.  This option
index d26e30e..abf9e57 100644 (file)
@@ -21,12 +21,5 @@ typedef struct {
         unsigned long sig[_NSIG_WORDS];
 } sigset_t;
 
-struct old_sigaction {
-        __sighandler_t sa_handler;
-        old_sigset_t sa_mask;
-        unsigned long sa_flags;
-        void (*sa_restorer)(void);
-};
-
 #define __ARCH_HAS_SA_RESTORER
 #endif
index 47e9f07..00d92a5 100644 (file)
@@ -17,13 +17,6 @@ struct ipc_kludge_32 {
         __s32   msgtyp;
 };
 
-struct old_sigaction32 {
-       __u32                   sa_handler;     /* Really a pointer, but need to deal with 32 bits */
-       compat_old_sigset_t     sa_mask;        /* A 32 bit mask */
-       __u32                   sa_flags;
-       __u32                   sa_restorer;    /* Another 32 bit pointer */
-};
-
 /* asm/sigcontext.h */
 typedef union
 {
@@ -81,8 +74,6 @@ struct ucontext32 {
 struct stat64_emu31;
 struct mmap_arg_struct_emu31;
 struct fadvise64_64_args;
-struct old_sigaction32;
-struct old_sigaction32;
 
 long sys32_chown16(const char __user * filename, u16 user, u16 group);
 long sys32_lchown16(const char __user * filename, u16 user, u16 group);
@@ -131,6 +122,4 @@ long sys32_read(unsigned int fd, char __user * buf, size_t count);
 long sys32_write(unsigned int fd, const char __user * buf, size_t count);
 long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise);
 long sys32_fadvise64_64(struct fadvise64_64_args __user *args);
-long sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
-                    struct old_sigaction32 __user *oact);
 #endif /* _ASM_S390X_S390_H */
index 141bfe1..3e71194 100644 (file)
@@ -157,43 +157,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
        return err;
 }
 
-asmlinkage long
-sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
-                struct old_sigaction32 __user *oact)
-{
-        struct k_sigaction new_ka, old_ka;
-       unsigned long sa_handler, sa_restorer;
-        int ret;
-
-        if (act) {
-               compat_old_sigset_t mask;
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(sa_handler, &act->sa_handler) ||
-                   __get_user(sa_restorer, &act->sa_restorer) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(mask, &act->sa_mask))
-                       return -EFAULT;
-               new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
-               new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
-               siginitset(&new_ka.sa.sa_mask, mask);
-        }
-
-        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               sa_handler = (unsigned long) old_ka.sa.sa_handler;
-               sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(sa_handler, &oact->sa_handler) ||
-                   __put_user(sa_restorer, &oact->sa_restorer) ||
-                   __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
-                   __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
-                       return -EFAULT;
-        }
-
-       return ret;
-}
-
 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
 {
        _s390_regs_common32 regs32;
index 1f8af00..559e04f 100644 (file)
@@ -230,7 +230,7 @@ ENTRY(sys32_sigaction_wrapper)
        lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # const struct old_sigaction *
        llgtr   %r4,%r4                 # struct old_sigaction32 *
-       jg      sys32_sigaction         # branch to system call
+       jg      compat_sys_sigaction            # branch to system call
 
 ENTRY(sys32_setreuid16_wrapper)
        llgfr   %r2,%r2                 # __kernel_old_uid_emu31_t
index ee1a8b3..c3a736a 100644 (file)
@@ -73,8 +73,6 @@ long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
 long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
 long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
                        u32 len_low);
-long sys_sigaction(int sig, const struct old_sigaction __user *act,
-                  struct old_sigaction __user *oact);
 long sys_sigreturn(void);
 long sys_rt_sigreturn(void);
 long sys32_sigreturn(void);
index 0bc5c9d..9c6e747 100644 (file)
@@ -48,37 +48,6 @@ typedef struct
        struct ucontext uc;
 } rt_sigframe;
 
-SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act,
-               struct old_sigaction __user *, oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       if (act) {
-               old_sigset_t mask;
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(mask, &act->sa_mask))
-                       return -EFAULT;
-               siginitset(&new_ka.sa.sa_mask, mask);
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-                   __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
-                   __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
-                   __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
-                       return -EFAULT;
-       }
-
-       return ret;
-}
-
 /* Returns non-zero on fault. */
 static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
 {