]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 24 Feb 2013 02:50:11 +0000 (18:50 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 24 Feb 2013 02:50:11 +0000 (18:50 -0800)
Pull signal handling cleanups from Al Viro:
 "This is the first pile; another one will come a bit later and will
  contain SYSCALL_DEFINE-related patches.

   - a bunch of signal-related syscalls (both native and compat)
     unified.

   - a bunch of compat syscalls switched to COMPAT_SYSCALL_DEFINE
     (fixing several potential problems with missing argument
     validation, while we are at it)

   - a lot of now-pointless wrappers killed

   - a couple of architectures (cris and hexagon) forgot to save
     altstack settings into sigframe, even though they used the
     (uninitialized) values in sigreturn; fixed.

   - microblaze fixes for delivery of multiple signals arriving at once

   - saner set of helpers for signal delivery introduced, several
     architectures switched to using those."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (143 commits)
  x86: convert to ksignal
  sparc: convert to ksignal
  arm: switch to struct ksignal * passing
  alpha: pass k_sigaction and siginfo_t using ksignal pointer
  burying unused conditionals
  make do_sigaltstack() static
  arm64: switch to generic old sigaction() (compat-only)
  arm64: switch to generic compat rt_sigaction()
  arm64: switch compat to generic old sigsuspend
  arm64: switch to generic compat rt_sigqueueinfo()
  arm64: switch to generic compat rt_sigpending()
  arm64: switch to generic compat rt_sigprocmask()
  arm64: switch to generic sigaltstack
  sparc: switch to generic old sigsuspend
  sparc: COMPAT_SYSCALL_DEFINE does all sign-extension as well as SYSCALL_DEFINE
  sparc: kill sign-extending wrappers for native syscalls
  kill sparc32_open()
  sparc: switch to use of generic old sigaction
  sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE
  mips: switch to generic sys_fork() and sys_clone()
  ...

185 files changed:
arch/Kconfig
arch/alpha/Kconfig
arch/alpha/include/asm/signal.h
arch/alpha/include/asm/unistd.h
arch/alpha/kernel/process.c
arch/alpha/kernel/signal.c
arch/arm/Kconfig
arch/arm/include/asm/signal.h
arch/arm/include/asm/unistd.h
arch/arm/kernel/calls.S
arch/arm/kernel/entry-common.S
arch/arm/kernel/signal.c
arch/arm64/Kconfig
arch/arm64/include/asm/syscalls.h
arch/arm64/include/asm/unistd.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
arch/avr32/include/asm/signal.h
arch/avr32/include/asm/unistd.h
arch/avr32/kernel/signal.c
arch/avr32/kernel/syscall-stubs.S
arch/avr32/kernel/syscall_table.S
arch/blackfin/include/asm/unistd.h
arch/blackfin/kernel/signal.c
arch/c6x/kernel/entry.S
arch/cris/Kconfig
arch/cris/arch-v10/kernel/signal.c
arch/cris/arch-v32/kernel/signal.c
arch/cris/include/asm/signal.h
arch/cris/include/asm/unistd.h
arch/frv/Kconfig
arch/frv/include/asm/signal.h
arch/frv/include/asm/unistd.h
arch/frv/kernel/signal.c
arch/h8300/Kconfig
arch/h8300/include/asm/signal.h
arch/h8300/include/asm/unistd.h
arch/h8300/kernel/signal.c
arch/h8300/kernel/syscalls.S
arch/hexagon/kernel/signal.c
arch/ia64/include/asm/signal.h
arch/ia64/include/asm/unistd.h
arch/ia64/kernel/signal.c
arch/m32r/include/asm/signal.h
arch/m32r/include/asm/unistd.h
arch/m32r/kernel/signal.c
arch/m68k/Kconfig
arch/m68k/include/asm/signal.h
arch/m68k/include/asm/unistd.h
arch/m68k/kernel/signal.c
arch/microblaze/include/asm/unistd.h
arch/microblaze/kernel/entry-nommu.S
arch/microblaze/kernel/entry.S
arch/microblaze/kernel/ptrace.c
arch/microblaze/kernel/signal.c
arch/mips/Kconfig
arch/mips/include/asm/compat.h
arch/mips/include/asm/signal.h
arch/mips/include/asm/sim.h
arch/mips/include/asm/unistd.h
arch/mips/include/uapi/asm/signal.h
arch/mips/kernel/linux32.c
arch/mips/kernel/process.c
arch/mips/kernel/scall32-o32.S
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/mips/kernel/signal.c
arch/mips/kernel/signal32.c
arch/mips/kernel/signal_n32.c
arch/mips/kernel/syscall.c
arch/mn10300/Kconfig
arch/mn10300/include/asm/signal.h
arch/mn10300/include/asm/unistd.h
arch/mn10300/kernel/signal.c
arch/openrisc/kernel/entry.S
arch/openrisc/kernel/signal.c
arch/parisc/include/asm/signal.h
arch/parisc/include/asm/unistd.h
arch/parisc/kernel/entry.S
arch/parisc/kernel/signal.c
arch/parisc/kernel/signal32.c
arch/parisc/kernel/signal32.h
arch/parisc/kernel/sys32.h
arch/parisc/kernel/syscall_table.S
arch/powerpc/Kconfig
arch/powerpc/include/asm/signal.h
arch/powerpc/include/asm/syscalls.h
arch/powerpc/include/asm/systbl.h
arch/powerpc/include/asm/unistd.h
arch/powerpc/include/uapi/asm/signal.h
arch/powerpc/kernel/ppc32.h
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/sys_ppc32.c
arch/s390/Kconfig
arch/s390/include/asm/signal.h
arch/s390/include/asm/unistd.h
arch/s390/kernel/compat_linux.c
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
arch/s390/kernel/syscalls.S
arch/score/include/asm/syscalls.h
arch/score/kernel/entry.S
arch/score/kernel/signal.c
arch/sh/Kconfig
arch/sh/include/asm/syscalls_32.h
arch/sh/include/asm/unistd.h
arch/sh/include/uapi/asm/signal.h
arch/sh/kernel/signal_32.c
arch/sh/kernel/signal_64.c
arch/sparc/Kconfig
arch/sparc/include/asm/compat_signal.h
arch/sparc/include/asm/signal.h
arch/sparc/include/asm/unistd.h
arch/sparc/include/uapi/asm/signal.h
arch/sparc/kernel/entry.S
arch/sparc/kernel/signal32.c
arch/sparc/kernel/signal_32.c
arch/sparc/kernel/signal_64.c
arch/sparc/kernel/sys32.S
arch/sparc/kernel/sys_sparc32.c
arch/sparc/kernel/sys_sparc_32.c
arch/sparc/kernel/syscalls.S
arch/sparc/kernel/systbls.h
arch/sparc/kernel/systbls_32.S
arch/sparc/kernel/systbls_64.S
arch/tile/include/asm/compat.h
arch/tile/include/asm/syscalls.h
arch/tile/include/asm/unistd.h
arch/tile/kernel/compat_signal.c
arch/tile/kernel/signal.c
arch/um/kernel/signal.c
arch/unicore32/kernel/entry.S
arch/unicore32/kernel/signal.c
arch/x86/Kconfig
arch/x86/ia32/ia32_signal.c
arch/x86/ia32/ia32entry.S
arch/x86/ia32/sys_ia32.c
arch/x86/include/asm/fpu-internal.h
arch/x86/include/asm/ia32.h
arch/x86/include/asm/signal.h
arch/x86/include/asm/sys_ia32.h
arch/x86/include/asm/syscalls.h
arch/x86/include/asm/unistd.h
arch/x86/include/uapi/asm/signal.h
arch/x86/kernel/entry_32.S
arch/x86/kernel/entry_64.S
arch/x86/kernel/ioport.c
arch/x86/kernel/signal.c
arch/x86/kernel/vm86_32.c
arch/x86/syscalls/syscall_32.tbl
arch/x86/syscalls/syscall_64.tbl
arch/x86/um/Kconfig
arch/x86/um/Makefile
arch/x86/um/shared/sysdep/syscalls_32.h
arch/x86/um/signal.c
arch/x86/um/sys_call_table_32.c
arch/x86/um/syscalls_32.c [deleted file]
arch/xtensa/include/asm/signal.h
arch/xtensa/include/asm/syscall.h
arch/xtensa/include/asm/unistd.h
arch/xtensa/include/uapi/asm/unistd.h
arch/xtensa/kernel/signal.c
fs/compat.c
fs/timerfd.c
include/asm-generic/syscalls.h
include/asm-generic/unistd.h
include/linux/compat.h
include/linux/sched.h
include/linux/signal.h
include/linux/syscalls.h
include/uapi/asm-generic/signal.h
include/uapi/asm-generic/unistd.h
kernel/compat.c
kernel/futex_compat.c
kernel/signal.c

index 97fb7d0365d15505d500a126588f889a7647fcd8..40e2b12c7916b7838dd602f1b4ab0b6974748f7c 100644 (file)
@@ -368,9 +368,6 @@ config MODULES_USE_ELF_REL
          Modules only use ELF REL relocations.  Modules with ELF RELA
          relocations will give an error.
 
-config GENERIC_SIGALTSTACK
-       bool
-
 #
 # ABI hall of shame
 #
@@ -385,4 +382,30 @@ config CLONE_BACKWARDS2
        help
          Architecture has the first two arguments of clone(2) swapped.
 
+config ODD_RT_SIGACTION
+       bool
+       help
+         Architecture has unusual rt_sigaction(2) arguments
+
+config OLD_SIGSUSPEND
+       bool
+       help
+         Architecture has old sigsuspend(2) syscall, of one-argument variety
+
+config OLD_SIGSUSPEND3
+       bool
+       help
+         Even weirder antique ABI - three-argument sigsuspend(2)
+
+config OLD_SIGACTION
+       bool
+       help
+         Architecture has old sigaction(2) syscall.  Nope, not the same
+         as OLD_SIGSUSPEND | OLD_SIGSUSPEND3 - alpha has sigsuspend(2),
+         but fairly different variant of sigaction(2), thanks to OSF/1
+         compatibility...
+
+config COMPAT_OLD_SIGACTION
+       bool
+
 source "kernel/gcov/Kconfig"
index dabc93649495617d31d68e7a2635d184c09238c8..1ecbf7a1b677b97341dde7a17a708b858e1a394a 100644 (file)
@@ -21,7 +21,8 @@ config ALPHA
        select GENERIC_STRNLEN_USER
        select HAVE_MOD_ARCH_SPECIFIC
        select MODULES_USE_ELF_RELA
-       select GENERIC_SIGALTSTACK
+       select ODD_RT_SIGACTION
+       select OLD_SIGSUSPEND
        help
          The Alpha is a 64-bit general-purpose processor designed and
          marketed by the Digital Equipment Corporation of blessed memory,
index 8a1ac28cd56208ea4b9db87740f72f3bf061371b..963f0494dca78621715d19226f965e013bc41c2a 100644 (file)
@@ -22,15 +22,6 @@ struct osf_sigaction {
        int             sa_flags;
 };
 
-struct sigaction {
-       __sighandler_t  sa_handler;
-       unsigned long   sa_flags;
-       sigset_t        sa_mask;        /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-       __sigrestore_t ka_restorer;
-};
+#define __ARCH_HAS_KA_RESTORER
 #include <asm/sigcontext.h>
 #endif
index b3396ee039b77df8ba4459dad3f00ac3a47be438..6d6fe7ab5473f63f60e0c8c3e9ef55dd39ee8914 100644 (file)
@@ -14,7 +14,6 @@
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index b5d0d0923699b338bff0090d21787699071567c5..63d27fb9b023f745ad8c6c4d23526edb3c42bc8c 100644 (file)
@@ -250,7 +250,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
        struct pt_regs *childregs = task_pt_regs(p);
        struct pt_regs *regs = current_pt_regs();
        struct switch_stack *childstack, *stack;
-       unsigned long settls;
 
        childstack = ((struct switch_stack *) childregs) - 1;
        childti->pcb.ksp = (unsigned long) childstack;
index 02d02c047f17e13d8c7714e0cd4d328ea2a2ce11..6cec2881acbf2fe7f21195fb7eb036b4b5d75c80 100644 (file)
@@ -112,16 +112,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
        return ret;
 }
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -282,12 +272,9 @@ give_sigsegv:
  */
 
 static inline void __user *
-get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
+get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size)
 {
-       if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
-               sp = current->sas_ss_sp + current->sas_ss_size;
-
-       return (void __user *)((sp - frame_size) & -32ul);
+       return (void __user *)((sigsp(sp, ksig) - frame_size) & -32ul);
 }
 
 static long
@@ -348,14 +335,13 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
 }
 
 static int
-setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
-           struct pt_regs *regs)
+setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
        unsigned long oldsp, r26, err = 0;
        struct sigframe __user *frame;
 
        oldsp = rdusp();
-       frame = get_sigframe(ka, oldsp, sizeof(*frame));
+       frame = get_sigframe(ksig, oldsp, sizeof(*frame));
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
 
@@ -365,9 +351,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
 
        /* Set up to return from userspace.  If provided, use a stub
           already in userspace.  */
-       if (ka->ka_restorer) {
-               r26 = (unsigned long) ka->ka_restorer;
-       } else {
+       r26 = (unsigned long) ksig->ka.ka_restorer;
+       if (!r26) {
                err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
                err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1);
                err |= __put_user(INSN_CALLSYS, frame->retcode+2);
@@ -381,8 +366,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
 
        /* "Return" to the handler */
        regs->r26 = r26;
-       regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
-       regs->r16 = sig;                        /* a0: signal number */
+       regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+       regs->r16 = ksig->sig;                  /* a0: signal number */
        regs->r17 = 0;                          /* a1: exception code */
        regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */
        wrusp((unsigned long) frame);
@@ -395,18 +380,17 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
 }
 
 static int
-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-              sigset_t *set, struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
        unsigned long oldsp, r26, err = 0;
        struct rt_sigframe __user *frame;
 
        oldsp = rdusp();
-       frame = get_sigframe(ka, oldsp, sizeof(*frame));
+       frame = get_sigframe(ksig, oldsp, sizeof(*frame));
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
 
-       err |= copy_siginfo_to_user(&frame->info, info);
+       err |= copy_siginfo_to_user(&frame->info, &ksig->info);
 
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
@@ -421,9 +405,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        /* Set up to return from userspace.  If provided, use a stub
           already in userspace.  */
-       if (ka->ka_restorer) {
-               r26 = (unsigned long) ka->ka_restorer;
-       } else {
+       r26 = (unsigned long) ksig->ka.ka_restorer;
+       if (!r26) {
                err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0);
                err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn,
                                  frame->retcode+1);
@@ -437,8 +420,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        /* "Return" to the handler */
        regs->r26 = r26;
-       regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler;
-       regs->r16 = sig;                          /* a0: signal number */
+       regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+       regs->r16 = ksig->sig;                    /* a0: signal number */
        regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */
        regs->r18 = (unsigned long) &frame->uc;   /* a2: ucontext pointer */
        wrusp((unsigned long) frame);
@@ -456,22 +439,17 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
  * OK, we're invoking a handler.
  */
 static inline void
-handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
-             struct pt_regs * regs)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
        sigset_t *oldset = sigmask_to_save();
        int ret;
 
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               ret = setup_rt_frame(sig, ka, info, oldset, regs);
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+               ret = setup_rt_frame(ksig, oldset, regs);
        else
-               ret = setup_frame(sig, ka, oldset, regs);
+               ret = setup_frame(ksig, oldset, regs);
 
-       if (ret) {
-               force_sigsegv(sig, current);
-               return;
-       }
-       signal_delivered(sig, info, ka, regs, 0);
+       signal_setup_done(ret, ksig, 0);
 }
 
 static inline void
@@ -514,47 +492,38 @@ syscall_restart(unsigned long r0, unsigned long r19,
 static void
 do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)
 {
-       siginfo_t info;
-       int signr;
        unsigned long single_stepping = ptrace_cancel_bpt(current);
-       struct k_sigaction ka;
+       struct ksignal ksig;
 
        /* This lets the debugger run, ... */
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-
-       /* ... so re-check the single stepping. */
-       single_stepping |= ptrace_cancel_bpt(current);
-
-       if (signr > 0) {
+       if (get_signal(&ksig)) {
+               /* ... so re-check the single stepping. */
+               single_stepping |= ptrace_cancel_bpt(current);
                /* Whee!  Actually deliver the signal.  */
                if (r0)
-                       syscall_restart(r0, r19, regs, &ka);
-               handle_signal(signr, &ka, &info, regs);
-               if (single_stepping) 
-                       ptrace_set_bpt(current); /* re-set bpt */
-               return;
-       }
-
-       if (r0) {
-               switch (regs->r0) {
-               case ERESTARTNOHAND:
-               case ERESTARTSYS:
-               case ERESTARTNOINTR:
-                       /* Reset v0 and a3 and replay syscall.  */
-                       regs->r0 = r0;
-                       regs->r19 = r19;
-                       regs->pc -= 4;
-                       break;
-               case ERESTART_RESTARTBLOCK:
-                       /* Force v0 to the restart syscall and reply.  */
-                       regs->r0 = __NR_restart_syscall;
-                       regs->pc -= 4;
-                       break;
+                       syscall_restart(r0, r19, regs, &ksig.ka);
+               handle_signal(&ksig, regs);
+       } else {
+               single_stepping |= ptrace_cancel_bpt(current);
+               if (r0) {
+                       switch (regs->r0) {
+                       case ERESTARTNOHAND:
+                       case ERESTARTSYS:
+                       case ERESTARTNOINTR:
+                               /* Reset v0 and a3 and replay syscall.  */
+                               regs->r0 = r0;
+                               regs->r19 = r19;
+                               regs->pc -= 4;
+                               break;
+                       case ERESTART_RESTARTBLOCK:
+                               /* Set v0 to the restart_syscall and replay */
+                               regs->r0 = __NR_restart_syscall;
+                               regs->pc -= 4;
+                               break;
+                       }
                }
+               restore_saved_sigmask();
        }
-
-       /* If there's no signal to deliver, we just restore the saved mask.  */
-       restore_saved_sigmask();
        if (single_stepping)
                ptrace_set_bpt(current);        /* re-set breakpoint */
 }
index 38ec1f8df5a8e71bf7025ea594875667d9837858..a955d89ed83642cd5b5b62d7954edd8241637730 100644 (file)
@@ -56,6 +56,8 @@ config ARM
        select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
        select MODULES_USE_ELF_REL
        select CLONE_BACKWARDS
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
index 9a0ea6ab988f0ca973d9bae3d9b2057f03fe768f..c0eb412aff0497b1e6afc2d542cab424fd791edf 100644 (file)
@@ -16,23 +16,7 @@ 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;
-       __sigrestore_t sa_restorer;
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
 
 #include <asm/sigcontext.h>
 #endif
index 21a2700d295715faabf5083d7dfde05f7628cfa8..e4ddfb39ca34b0700592610d5c21de624ad95826 100644 (file)
@@ -26,8 +26,6 @@
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLD_SELECT
 
index a4fda4e7a372f4428a00a0871d142b67f9458313..0cc57611fc4f379b1e6087d4f8d6492dede8156f 100644 (file)
                CALL(sys_getcwd)
                CALL(sys_capget)
 /* 185 */      CALL(sys_capset)
-               CALL(sys_sigaltstack_wrapper)
+               CALL(sys_sigaltstack)
                CALL(sys_sendfile)
                CALL(sys_ni_syscall)            /* getpmsg */
                CALL(sys_ni_syscall)            /* putpmsg */
index a6c301e90a3b3fd6cc43508b73d3710244395164..3248cde504ed9e3995d2f14357e9e1875b3f8129 100644 (file)
@@ -514,11 +514,6 @@ sys_rt_sigreturn_wrapper:
                b       sys_rt_sigreturn
 ENDPROC(sys_rt_sigreturn_wrapper)
 
-sys_sigaltstack_wrapper:
-               ldr     r2, [sp, #S_OFF + S_SP]
-               b       do_sigaltstack
-ENDPROC(sys_sigaltstack_wrapper)
-
 sys_statfs64_wrapper:
                teq     r1, #88
                moveq   r1, #84
index 56f72d257ebdfcdfd8607fcc770eeecc61c24806..296786bdbb737870d8fa99479127f9bc5bd8c271 100644 (file)
@@ -45,48 +45,6 @@ const unsigned long sigreturn_codes[7] = {
        MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
 };
 
-/*
- * atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int 
-sys_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;
-}
-
 #ifdef CONFIG_CRUNCH
 static int preserve_crunch_context(struct crunch_sigframe __user *frame)
 {
@@ -300,7 +258,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigframe(regs, &frame->sig))
                goto badframe;
 
-       if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT)
+       if (restore_altstack(&frame->sig.uc.uc_stack))
                goto badframe;
 
        return regs->ARM_r0;
@@ -360,17 +318,11 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
 }
 
 static inline void __user *
-get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
+get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize)
 {
-       unsigned long sp = regs->ARM_sp;
+       unsigned long sp = sigsp(regs->ARM_sp, ksig);
        void __user *frame;
 
-       /*
-        * This is the X/Open sanctioned signal stack switching.
-        */
-       if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
-               sp = current->sas_ss_sp + current->sas_ss_size;
-
        /*
         * ATPCS B01 mandates 8-byte alignment
         */
@@ -385,11 +337,22 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
        return frame;
 }
 
+/*
+ * translate the signal
+ */
+static inline int map_sig(int sig)
+{
+       struct thread_info *thread = current_thread_info();
+       if (sig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
+               sig = thread->exec_domain->signal_invmap[sig];
+       return sig;
+}
+
 static int
-setup_return(struct pt_regs *regs, struct k_sigaction *ka,
-            unsigned long __user *rc, void __user *frame, int usig)
+setup_return(struct pt_regs *regs, struct ksignal *ksig,
+            unsigned long __user *rc, void __user *frame)
 {
-       unsigned long handler = (unsigned long)ka->sa.sa_handler;
+       unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler;
        unsigned long retcode;
        int thumb = 0;
        unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
@@ -399,7 +362,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
        /*
         * Maybe we need to deliver a 32-bit signal to a 26-bit task.
         */
-       if (ka->sa.sa_flags & SA_THIRTYTWO)
+       if (ksig->ka.sa.sa_flags & SA_THIRTYTWO)
                cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
 
 #ifdef CONFIG_ARM_THUMB
@@ -421,12 +384,12 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
        }
 #endif
 
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               retcode = (unsigned long)ka->sa.sa_restorer;
+       if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+               retcode = (unsigned long)ksig->ka.sa.sa_restorer;
        } else {
                unsigned int idx = thumb << 1;
 
-               if (ka->sa.sa_flags & SA_SIGINFO)
+               if (ksig->ka.sa.sa_flags & SA_SIGINFO)
                        idx += 3;
 
                if (__put_user(sigreturn_codes[idx],   rc) ||
@@ -451,7 +414,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
                }
        }
 
-       regs->ARM_r0 = usig;
+       regs->ARM_r0 = map_sig(ksig->sig);
        regs->ARM_sp = (unsigned long)frame;
        regs->ARM_lr = retcode;
        regs->ARM_pc = handler;
@@ -461,9 +424,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 }
 
 static int
-setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
+setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
-       struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
+       struct sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
        int err = 0;
 
        if (!frame)
@@ -476,36 +439,29 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg
 
        err |= setup_sigframe(frame, regs, set);
        if (err == 0)
-               err = setup_return(regs, ka, frame->retcode, frame, usig);
+               err = setup_return(regs, ksig, frame->retcode, frame);
 
        return err;
 }
 
 static int
-setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
-              sigset_t *set, struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
 {
-       struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
-       stack_t stack;
+       struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
        int err = 0;
 
        if (!frame)
                return 1;
 
-       err |= copy_siginfo_to_user(&frame->info, info);
+       err |= copy_siginfo_to_user(&frame->info, &ksig->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 = (void __user *)current->sas_ss_sp;
-       stack.ss_flags = sas_ss_flags(regs->ARM_sp);
-       stack.ss_size = current->sas_ss_size;
-       err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
-
+       err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp);
        err |= setup_sigframe(&frame->sig, regs, set);
        if (err == 0)
-               err = setup_return(regs, ka, frame->sig.retcode, frame, usig);
+               err = setup_return(regs, ksig, frame->sig.retcode, frame);
 
        if (err == 0) {
                /*
@@ -523,40 +479,25 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
 /*
  * OK, we're invoking a handler
  */    
-static void
-handle_signal(unsigned long sig, struct k_sigaction *ka,
-             siginfo_t *info, struct pt_regs *regs)
+static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
-       struct thread_info *thread = current_thread_info();
-       struct task_struct *tsk = current;
        sigset_t *oldset = sigmask_to_save();
-       int usig = sig;
        int ret;
 
-       /*
-        * translate the signal
-        */
-       if (usig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
-               usig = thread->exec_domain->signal_invmap[usig];
-
        /*
         * Set up the stack frame
         */
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               ret = setup_rt_frame(usig, ka, info, oldset, regs);
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+               ret = setup_rt_frame(ksig, oldset, regs);
        else
-               ret = setup_frame(usig, ka, oldset, regs);
+               ret = setup_frame(ksig, oldset, regs);
 
        /*
         * Check that the resulting registers are actually sane.
         */
        ret |= !valid_user_regs(regs);
 
-       if (ret != 0) {
-               force_sigsegv(sig, tsk);
-               return;
-       }
-       signal_delivered(sig, info, ka, regs, 0);
+       signal_setup_done(ret, ksig, 0);
 }
 
 /*
@@ -571,9 +512,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
 static int do_signal(struct pt_regs *regs, int syscall)
 {
        unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
-       struct k_sigaction ka;
-       siginfo_t info;
-       int signr;
+       struct ksignal ksig;
        int restart = 0;
 
        /*
@@ -605,33 +544,32 @@ static int do_signal(struct pt_regs *regs, int syscall)
         * Get the signal to deliver.  When running under ptrace, at this
         * point the debugger may change all our registers ...
         */
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
        /*
         * Depending on the signal settings we may need to revert the
         * decision to restart the system call.  But skip this if a
         * debugger has chosen to restart at a different PC.
         */
-       if (regs->ARM_pc != restart_addr)
-               restart = 0;
-       if (signr > 0) {
-               if (unlikely(restart)) {
+       if (get_signal(&ksig)) {
+               /* handler */
+               if (unlikely(restart) && regs->ARM_pc == restart_addr) {
                        if (retval == -ERESTARTNOHAND ||
                            retval == -ERESTART_RESTARTBLOCK
                            || (retval == -ERESTARTSYS
-                               && !(ka.sa.sa_flags & SA_RESTART))) {
+                               && !(ksig.ka.sa.sa_flags & SA_RESTART))) {
                                regs->ARM_r0 = -EINTR;
                                regs->ARM_pc = continue_addr;
                        }
                }
-
-               handle_signal(signr, &ka, &info, regs);
-               return 0;
+               handle_signal(&ksig, regs);
+       } else {
+               /* no handler */
+               restore_saved_sigmask();
+               if (unlikely(restart) && regs->ARM_pc == restart_addr) {
+                       regs->ARM_pc = continue_addr;
+                       return restart;
+               }
        }
-
-       restore_saved_sigmask();
-       if (unlikely(restart))
-               regs->ARM_pc = continue_addr;
-       return restart;
+       return 0;
 }
 
 asmlinkage int
index ab4aa54b36ef98d8e0c00d1de39e5151d319a2b2..f532ce5f3c5b70a5faeb269c19cd03faefed30ff 100644 (file)
@@ -205,6 +205,8 @@ config COMPAT
        depends on !ARM64_64K_PAGES
        select COMPAT_BINFMT_ELF
        select HAVE_UID16
+       select OLD_SIGSUSPEND3
+       select COMPAT_OLD_SIGACTION
        help
          This option enables support for a 32-bit EL0 running under a 64-bit
          kernel at EL1. AArch32-specific components such as system calls,
index 20d63b290665498c738f47d30209d335b05a2d43..48fe7c600e987b22011311ad83988d47905f02d1 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 744087fb521cca4cd0fcb2111fe37194f38b5921..82ce217e94cf07228e52ebbfae9e9bcdeb751de1 100644 (file)
 #define __ARCH_WANT_SYS_GETPGRP
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
-#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
index 5ef47ba3ed459f9f786cb79abddc2ecf762e5aaf..e60e386178d134d63caae39f0c272357de86c9b4 100644 (file)
@@ -93,7 +93,7 @@ __SYSCALL(68,  sys_ni_syscall)                        /* 68 was sys_sgetmask */
 __SYSCALL(69,  sys_ni_syscall)                 /* 69 was sys_ssetmask */
 __SYSCALL(70,  sys_setreuid16)
 __SYSCALL(71,  sys_setregid16)
-__SYSCALL(72,  compat_sys_sigsuspend)
+__SYSCALL(72,  sys_sigsuspend)
 __SYSCALL(73,  compat_sys_sigpending)
 __SYSCALL(74,  sys_sethostname)
 __SYSCALL(75,  compat_sys_setrlimit)
@@ -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 9c94f404ded68650802715455a78060e7d683e83..514d6098dbee983cb960893d34ddb4324f060618 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 abd756315cb54c901400065192786cde95b1d854..890a591f75dd1848e28e1ea62413775be5394c6d 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 41db148a7eb9c49cae876311600dfc960fd59ad3..7f4f3673f2bc0e1ad4f1d0dd5f978cbb1b7f4255 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/unistd32.h>
 
-struct compat_sigaction {
-       compat_uptr_t                   sa_handler;
-       compat_ulong_t                  sa_flags;
-       compat_uptr_t                   sa_restorer;
-       compat_sigset_t                 sa_mask;
-};
-
-struct compat_old_sigaction {
-       compat_uptr_t                   sa_handler;
-       compat_old_sigset_t             sa_mask;
-       compat_ulong_t                  sa_flags;
-       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;
@@ -339,127 +319,6 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame)
        return err ? -EFAULT : 0;
 }
 
-/*
- * atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int compat_sys_sigsuspend(int restart, compat_ulong_t oldmask,
-                                    compat_old_sigset_t mask)
-{
-       sigset_t blocked;
-
-       siginitset(&current->blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int compat_sys_sigaction(int sig,
-                                   const struct compat_old_sigaction __user *act,
-                                   struct compat_old_sigaction __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-       compat_old_sigset_t mask;
-       compat_uptr_t handler, restorer;
-
-       if (act) {
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(handler, &act->sa_handler) ||
-                   __get_user(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 = compat_ptr(handler);
-               new_ka.sa.sa_restorer = compat_ptr(restorer);
-               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(ptr_to_compat(old_ka.sa.sa_handler),
-                              &oact->sa_handler) ||
-                   __put_user(ptr_to_compat(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;
-}
-
-asmlinkage int compat_sys_rt_sigaction(int sig,
-                                      const struct compat_sigaction __user *act,
-                                      struct compat_sigaction __user *oact,
-                                      compat_size_t sigsetsize)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if (act) {
-               compat_uptr_t handler, restorer;
-
-               ret = get_user(handler, &act->sa_handler);
-               new_ka.sa.sa_handler = compat_ptr(handler);
-               ret |= get_user(restorer, &act->sa_restorer);
-               new_ka.sa.sa_restorer = compat_ptr(restorer);
-               ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask);
-               ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-               if (ret)
-                       return -EFAULT;
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-       if (!ret && oact) {
-               ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
-               ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
-               ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-       }
-       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 +421,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 +562,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(0, &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);
 
@@ -742,75 +595,6 @@ int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
        return err;
 }
 
-/*
- * RT signals don't have generic compat wrappers.
- * See arch/powerpc/kernel/signal_32.c
- */
-asmlinkage int compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
-                                        compat_sigset_t __user *oset,
-                                        compat_size_t sigsetsize)
-{
-       sigset_t s;
-       sigset_t __user *up;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (set) {
-               if (get_sigset_t(&s, set))
-                       return -EFAULT;
-       }
-
-       set_fs(KERNEL_DS);
-       /* This is valid because of the set_fs() */
-       up = (sigset_t __user *) &s;
-       ret = sys_rt_sigprocmask(how, set ? up : NULL, oset ? up : NULL,
-                                sigsetsize);
-       set_fs(old_fs);
-       if (ret)
-               return ret;
-       if (oset) {
-               if (put_sigset_t(oset, &s))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-asmlinkage int compat_sys_rt_sigpending(compat_sigset_t __user *set,
-                                       compat_size_t sigsetsize)
-{
-       sigset_t s;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       /* The __user pointer cast is valid because of the set_fs() */
-       ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
-       set_fs(old_fs);
-       if (!ret) {
-               if (put_sigset_t(set, &s))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-asmlinkage int compat_sys_rt_sigqueueinfo(int pid, int sig,
-                                         compat_siginfo_t __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       ret = copy_siginfo_from_user32(&info, uinfo);
-       if (unlikely(ret))
-               return ret;
-
-       set_fs (KERNEL_DS);
-       /* The __user pointer cast is valid because of the set_fs() */
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
-       set_fs (old_fs);
-       return ret;
-}
-
 void compat_setup_restart_syscall(struct pt_regs *regs)
 {
        regs->regs[7] = __NR_compat_restart_syscall;
index 8292a9b090f8d72ab570eaa4e24a4cb9739c252c..3fa98ff14f0eea5a536dd1bbc159d6161a0c9a0d 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 7ef59e9245effa59f360c097bcdd300fa2e0e334..6abb05721614ded2064ed3853ce10cb80a151637 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
index 9326d182e9e5d8d0f8b0f2511f67299a8f3eb7d3..d875eb6a3f3c2cd6cf28db5ffcf1f3e65fb0e66e 100644 (file)
@@ -23,16 +23,7 @@ typedef struct {
        unsigned long sig[_NSIG_WORDS];
 } sigset_t;
 
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
 
 #include <asm/sigcontext.h>
 #undef __HAVE_ARCH_SIG_BITOPS
index 0bdf6371574e76eeaebfd821cbff2dbdb94dd16d..dc4d5a931112ebe3b6bb9c9e32c7a81d434e1624 100644 (file)
@@ -37,8 +37,6 @@
 #define __ARCH_WANT_SYS_GETPGRP
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_GETPGRP
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index 5e01c3a40cedfbbd607ce6d23a8477e9bd9da470..b80c0b3d2babd316798c036b1e7247b48448ea9d 100644 (file)
 #include <asm/ucontext.h>
 #include <asm/syscalls.h>
 
-asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-                              struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->sp);
-}
-
 struct rt_sigframe
 {
        struct siginfo info;
@@ -91,7 +85,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n",
@@ -175,12 +169,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Set up the ucontext */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->sp),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size,
-                         &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 
index 275aab9731fda5ab5846b18454cdbbf0217df357..b5fc927cd39889a5c877e983b0af6516d6569b65 100644 (file)
@@ -20,12 +20,6 @@ __sys_rt_sigsuspend:
        mov     r10, sp
        rjmp    sys_rt_sigsuspend
 
-       .global __sys_sigaltstack
-       .type   __sys_sigaltstack,@function
-__sys_sigaltstack:
-       mov     r10, sp
-       rjmp    sys_sigaltstack
-
        .global __sys_rt_sigreturn
        .type   __sys_rt_sigreturn,@function
 __sys_rt_sigreturn:
index f27bb878da6b50fd8cd7bf53df2750797aad9dc8..017a904180c82b1c3979f7f91e552d9e45d5b177 100644 (file)
@@ -115,7 +115,7 @@ sys_call_table:
        .long   sys_statfs
        .long   sys_fstatfs             /* 100 */
        .long   sys_vhangup
-       .long   __sys_sigaltstack
+       .long   sys_sigaltstack
        .long   sys_syslog
        .long   sys_setitimer
        .long   sys_getitimer           /* 105 */
index e943cb1300482b69d3da8577fc9cc47cf6985e3a..04e83ea8d5cc277e1bd90e654ab8ccdaf7f55a61 100644 (file)
@@ -18,8 +18,6 @@
 #define __ARCH_WANT_SYS_GETPGRP
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_VFORK
 
 /*
index 84b4be05840ccc4b971a51637bb4a19e9cb0d5e8..b022af6c48f85ad91bb69ed66dbaa283cb0b6db7 100644 (file)
@@ -37,11 +37,6 @@ struct rt_sigframe {
        struct ucontext uc;
 };
 
-asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
-{
-       return do_sigaltstack(uss, uoss, rdusp());
-}
-
 static inline int
 rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *pr0)
 {
@@ -100,7 +95,7 @@ asmlinkage int sys_rt_sigreturn(void)
        if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->usp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return r0;
@@ -178,10 +173,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |=
-           __put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(rdusp()), &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
        err |= rt_setup_sigcontext(&frame->uc.uc_mcontext, regs);
        err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 
index 5239057de4c4cdb4363b328a9ce820c2afd0f81e..2721c90b0121f31c205bc90304f36915ccbb9d79 100644 (file)
@@ -598,18 +598,6 @@ ENTRY(enable_exception)
        NOP     5
 ENDPROC(enable_exception)
 
-ENTRY(sys_sigaltstack)
-#ifdef CONFIG_C6X_BIG_KERNEL
-       MVKL    .S1     do_sigaltstack,A0       ; branch to do_sigaltstack
-       MVKH    .S1     do_sigaltstack,A0
-       B       .S2X    A0
-#else
-       B       .S2     do_sigaltstack
-#endif
-       LDW     .D2T1   *+SP(REGS_SP+8),A6
-       NOP     4
-ENDPROC(sys_sigaltstack)
-
        ;;
        ;; Special system calls
        ;; return address is in B3
index c59a01dd9c0c627ee4afc7060b90deb0606811c1..0e5c187ac7d223d8243ab16455fb63f9a613f3f2 100644 (file)
@@ -50,6 +50,8 @@ config CRIS
        select GENERIC_CMOS_UPDATE
        select MODULES_USE_ELF_RELA
        select CLONE_BACKWARDS2
+       select OLD_SIGSUSPEND
+       select OLD_SIGACTION
 
 config HZ
        int
index 0bb477c13a4e08b6bd09ceee6e22e9a11ac2a6b0..61ce6273a8952ed6b6986b2dbadf651c0c9c5d47 100644 (file)
 
 void do_signal(int canrestart, struct pt_regs *regs);
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.  Define
- * dummy arguments to be able to reach the regs argument.  (Note that this
- * arrangement relies on old_sigset_t occupying one register.)
- */
-int sys_sigsuspend(old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-int sys_sigaction(int sig, const struct old_sigaction __user *act,
-       struct old_sigaction *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;
-}
-
-int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
-{
-       return do_sigaltstack(uss, uoss, rdusp());
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -150,11 +101,9 @@ badframe:
        return 1;
 }
 
-/* Define dummy arguments to be able to reach the regs argument.  */
-
-asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
-                             long srp, struct pt_regs *regs)
+asmlinkage int sys_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct sigframe __user *frame = (struct sigframe *)rdusp();
        sigset_t set;
 
@@ -188,11 +137,9 @@ badframe:
        return 0;
 }
 
-/* Define dummy arguments to be able to reach the regs argument.  */
-
-asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
-                                long mof, long srp, struct pt_regs *regs)
+asmlinkage int sys_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
        sigset_t set;
 
@@ -214,7 +161,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return regs->r10;
@@ -362,6 +309,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
+
        if (err)
                goto give_sigsegv;
 
index b60d1b65a4267ef5cbdb14758058b5c9ca6707a0..01d1375c9004cdaa89dc867c5b00c303ac618ff5 100644 (file)
@@ -51,59 +51,6 @@ struct rt_signal_frame {
 void do_signal(int restart, struct pt_regs *regs);
 void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
                      struct pt_regs *regs);
-/*
- * Swap in the new signal mask, and wait for a signal. Define some
- * dummy arguments to be able to reach the regs argument.
- */
-int
-sys_sigsuspend(old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-int
-sys_sigaction(int signal, const struct old_sigaction *act,
-             struct old_sigaction *oact)
-{
-       int retval;
-       struct k_sigaction newk;
-       struct k_sigaction oldk;
-
-       if (act) {
-               old_sigset_t mask;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(newk.sa.sa_handler, &act->sa_handler) ||
-                   __get_user(newk.sa.sa_restorer, &act->sa_restorer) ||
-                   __get_user(newk.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(mask, &act->sa_mask))
-                       return -EFAULT;
-
-               siginitset(&newk.sa.sa_mask, mask);
-       }
-
-       retval = do_sigaction(signal, act ? &newk : NULL, oact ? &oldk : NULL);
-
-       if (!retval && oact) {
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(oldk.sa.sa_handler, &oact->sa_handler) ||
-                   __put_user(oldk.sa.sa_restorer, &oact->sa_restorer) ||
-                   __put_user(oldk.sa.sa_flags, &oact->sa_flags) ||
-                   __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask))
-                       return -EFAULT;
-
-       }
-
-       return retval;
-}
-
-int
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
-{
-       return do_sigaltstack(uss, uoss, rdusp());
-}
 
 static int
 restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
@@ -135,11 +82,9 @@ badframe:
        return 1;
 }
 
-/* Define some dummy arguments to be able to reach the regs argument. */
-asmlinkage int
-sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
-             struct pt_regs *regs)
+asmlinkage int sys_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        sigset_t set;
        struct signal_frame __user *frame;
        unsigned long oldspc = regs->spc;
@@ -178,11 +123,9 @@ badframe:
        return 0;
 }
 
-/* Define some dummy variables to be able to reach the regs argument. */
-asmlinkage int
-sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
-                struct pt_regs *regs)
+asmlinkage int sys_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        sigset_t set;
        struct rt_signal_frame __user *frame;
        unsigned long oldspc = regs->spc;
@@ -209,7 +152,7 @@ sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        keep_debug_flags(oldccs, oldspc, regs);
@@ -371,6 +314,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
 
        if (err)
                goto give_sigsegv;
index c0cb1fd4644c46a35c53d23bb0252e24d407fce8..c11b8745cecee2b6899fb8b07ef3c24a1434e8ef 100644 (file)
@@ -16,23 +16,8 @@ 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);
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       void (*sa_restorer)(void);
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
+
 #include <asm/sigcontext.h>
 
 #endif
index 6d062bdf92d4a560b9ec746c434621a10694e28b..be57a988bfb9125c25d9cec62da4d4109d962376 100644 (file)
@@ -30,8 +30,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index 17df48fc8f44a419e1abd9051ccac1b4645e7ea9..2d0509d4cfeef1af71c913ff3c9c12ff1271d0fd 100644 (file)
@@ -11,6 +11,8 @@ config FRV
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select GENERIC_CPU_DEVICES
        select ARCH_WANT_IPC_PARSE_VERSION
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config ZONE_DMA
        bool
index 599500a31025e0f3e6254ec334ca67d3da3a4a56..eca0abcb79d6efb7ee2909174e97218d35999ffd 100644 (file)
@@ -3,11 +3,4 @@
 
 #include <uapi/asm/signal.h>
 
-struct old_sigaction {
-       __sighandler_t sa_handler;
-       old_sigset_t sa_mask;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-};
-
 #endif /* _ASM_SIGNAL_H */
index d685da17f5fb9954f1517e35cf6c931024e156ef..4cfcc7bba25a9e2ed9526a9279bef01c5535907e 100644 (file)
@@ -27,8 +27,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 /* #define __ARCH_WANT_SYS_SIGPENDING */
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index 535810a3217a25bf64e3f5d53059f8a5ff1a7ea4..d822700d4f15dacf49d96c612bc1ea6ac65c3c4b 100644 (file)
@@ -32,55 +32,6 @@ struct fdpic_func_descriptor {
        unsigned long   GOT;
 };
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int sys_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int sys_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;
-}
-
-asmlinkage
-int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
-{
-       return do_sigaltstack(uss, uoss, __frame->sp);
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -173,7 +124,7 @@ asmlinkage int sys_rt_sigreturn(void)
        if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, __frame->sp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return gr8;
@@ -345,9 +296,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        if (__put_user(0, &frame->uc.uc_flags) ||
            __put_user(NULL, &frame->uc.uc_link) ||
-           __put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) ||
-           __put_user(sas_ss_flags(__frame->sp), &frame->uc.uc_stack.ss_flags) ||
-           __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size))
+           __save_altstack(&frame->uc.uc_stack, __frame->sp))
                goto give_sigsegv;
 
        if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0]))
index 2d2efb653ee0a9ecefe1b89b69e1aae08ad73ff2..05b613af223abac904b02acd759207ee5d70aec6 100644 (file)
@@ -9,6 +9,8 @@ config H8300
        select GENERIC_IRQ_SHOW
        select GENERIC_CPU_DEVICES
        select MODULES_USE_ELF_RELA
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config SYMBOL_PREFIX
        string
index 66c81c67e55dd6f8acc08a46c10ed2f9d59782ac..6341e36386f8cef0068a5b733fca86c136636708 100644 (file)
@@ -16,23 +16,7 @@ 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);
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       void (*sa_restorer)(void);
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
 
 #include <asm/sigcontext.h>
 #undef __HAVE_ARCH_SIG_BITOPS
index aa38105959fb202ee1be37addaa215c9e3594bcc..6721856d841b353321fd1f12a81f4e85a5ec65cc 100644 (file)
@@ -29,8 +29,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index 0e81b96c642f9cb4736070e9fdcbd453da0f0564..a65ff3b763268f1d8b680c6466adbda1412cab40 100644 (file)
 #include <asm/traps.h>
 #include <asm/ucontext.h>
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(int unused1, int unused2, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int 
-sys_sigaction(int sig, const struct old_sigaction *act,
-             struct old_sigaction *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;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t *uss, stack_t *uoss)
-{
-       return do_sigaltstack(uss, uoss, rdusp());
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  *
@@ -136,9 +86,9 @@ struct rt_sigframe
 } __attribute__((aligned(2),packed));
 
 static inline int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc,
-                  int *pd0)
+restore_sigcontext(struct sigcontext *usc, int *pd0)
 {
+       struct pt_regs *regs = current_pt_regs();
        int err = 0;
        unsigned int ccr;
        unsigned int usp;
@@ -167,9 +117,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc,
        return err;
 }
 
-asmlinkage int do_sigreturn(unsigned long __unused,...)
+asmlinkage int sys_sigreturn(void)
 {
-       struct pt_regs *regs = (struct pt_regs *) (&__unused - 1);
        unsigned long usp = rdusp();
        struct sigframe *frame = (struct sigframe *)(usp - 4);
        sigset_t set;
@@ -185,7 +134,7 @@ asmlinkage int do_sigreturn(unsigned long __unused,...)
 
        set_current_blocked(&set);
        
-       if (restore_sigcontext(regs, &frame->sc, &er0))
+       if (restore_sigcontext(&frame->sc, &er0))
                goto badframe;
        return er0;
 
@@ -194,9 +143,8 @@ badframe:
        return 0;
 }
 
-asmlinkage int do_rt_sigreturn(unsigned long __unused,...)
+asmlinkage int sys_rt_sigreturn(void)
 {
-       struct pt_regs *regs = (struct pt_regs *) &__unused;
        unsigned long usp = rdusp();
        struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4);
        sigset_t set;
@@ -209,10 +157,10 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused,...)
 
        set_current_blocked(&set);
        
-       if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &er0))
+       if (restore_sigcontext(&frame->uc.uc_mcontext, &er0))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return er0;
@@ -358,11 +306,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(rdusp()),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
        err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
index b74dd0ade58dcc655b19b445780976a9acc18377..5c2168fb9b9ef8317891905a2c8be3b1147cf166 100644 (file)
@@ -334,18 +334,3 @@ SYMBOL_NAME_LABEL(sys_call_table)
        .long SYMBOL_NAME(sys_getcpu)
        .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_pwait */
        .long SYMBOL_NAME(sys_setns)            /* 320 */
-
-       .macro  call_sp addr
-       mov.l   #SYMBOL_NAME(\addr),er6
-       bra     SYMBOL_NAME(syscall_trampoline):8
-       .endm
-
-SYMBOL_NAME_LABEL(sys_sigreturn)
-       call_sp do_sigreturn
-
-SYMBOL_NAME_LABEL(sys_rt_sigreturn)
-       call_sp do_rt_sigreturn
-
-SYMBOL_NAME_LABEL(syscall_trampoline)
-       mov.l   sp,er0
-       jmp     @er6
index fe0d1373165d403e1c983626145fcf23c292cf5e..60fa2ca3202be2060f2b9065a51447ab0c34d6d9 100644 (file)
@@ -125,6 +125,7 @@ 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;
 
@@ -247,12 +248,6 @@ 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)
 {
@@ -288,14 +283,7 @@ asmlinkage int sys_rt_sigreturn(void)
         */
        regs->syscall_nr = __NR_rt_sigreturn;
 
-       /*
-        * 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)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return 0;
index 3a1b20e74c5cda3e2271f2a3f3253690ca93322d..c62afa4a0dc2a94828c2f38112aa9d2da86e141b 100644 (file)
@@ -26,16 +26,6 @@ typedef struct {
        unsigned long sig[_NSIG_WORDS];
 } sigset_t;
 
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
-
 #  include <asm/sigcontext.h>
 
 # endif /* !__ASSEMBLY__ */
index c3cc42a15af157b14fc7fd55da74f75d39d21616..096373800f73d8b8eeec961657d1f940a2fb9919 100644 (file)
@@ -27,9 +27,6 @@
 #define __IGNORE_vfork         /* clone() */
 #define __IGNORE_umount2       /* umount() */
 
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
-
 #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
 
 #include <linux/types.h>
@@ -47,12 +44,7 @@ asmlinkage unsigned long sys_mmap2(
                                int prot, int flags,
                                int fd, long pgoff);
 struct pt_regs;
-struct sigaction;
 asmlinkage long sys_ia64_pipe(void);
-asmlinkage long sys_rt_sigaction(int sig,
-                                const struct sigaction __user *act,
-                                struct sigaction __user *oact,
-                                size_t sigsetsize);
 
 /*
  * "Conditional" syscalls
index 680b73786be85077fe2a2424e3ecfd00ebe6ea43..3637e03d228217517d04e9c97c55a9077ea28f89 100644 (file)
 # 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))
index a5ba4a217fb96cf7aa0c83baa9ad3942239fdddf..ed3ded6601e81dca6716d62ea13f48ec55c2f0b7 100644 (file)
@@ -16,16 +16,7 @@ typedef struct {
        unsigned long sig[_NSIG_WORDS];
 } sigset_t;
 
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
 #include <asm/sigcontext.h>
 
 #undef __HAVE_ARCH_SIG_BITOPS
index 79b063caec85953d2f622b3b3f6357df8c3db41d..555629b052672ed9c7532455b311fcdd90eb436a 100644 (file)
@@ -20,8 +20,6 @@
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/
 #define __ARCH_WANT_SYS_OLDUMOUNT
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_CLONE
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
index 6e3c26a1607cdb6b505e4b25cab682a08ed04605..d503568cb75354102dadf3cac8b9407118e438c3 100644 (file)
 
 #define DEBUG_SIG 0
 
-asmlinkage int
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-               unsigned long r2, unsigned long r3, unsigned long r4,
-               unsigned long r5, unsigned long r6, struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->spu);
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -113,7 +104,7 @@ sys_rt_sigreturn(unsigned long r0, unsigned long r1,
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->spu) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return result;
@@ -213,10 +204,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->spu),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->spu);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
index 6710084e072abeb484cc00f93805352aa9d4099d..efb1ce1f14a331c7821504a7cccc4cbbfef92134 100644 (file)
@@ -18,6 +18,8 @@ config M68K
        select HAVE_MOD_ARCH_SPECIFIC
        select MODULES_USE_ELF_REL
        select MODULES_USE_ELF_RELA
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config RWSEM_GENERIC_SPINLOCK
        bool
index 9c8c46b06b0c550453532a7fde6e0bc4bac787b1..214320b5038440be179cd557479dddb7bd58eaa2 100644 (file)
@@ -16,23 +16,8 @@ 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;
-       __sigrestore_t sa_restorer;
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
+
 #include <asm/sigcontext.h>
 
 #ifndef CONFIG_CPU_HAS_NO_BITFIELDS
index f9337f61466050bd48aa8f993c3d59a647e262d6..6cd92671ca5e61c572f5300dbc0f6de054457ca1 100644 (file)
@@ -29,8 +29,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 
index 9a396cda3147d4f56508891ce70f9e6646a670bf..2a16df3d931283f0f55ac4c95571dbe3629678c3 100644 (file)
@@ -224,56 +224,6 @@ static inline void push_cache(unsigned long vaddr)
 
 #endif /* CONFIG_MMU */
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(int unused0, int unused1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int
-sys_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;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
-{
-       return do_sigaltstack(uss, uoss, rdusp());
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  *
@@ -765,8 +715,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
        err |= __get_user(temp, &uc->uc_formatvec);
 
        err |= rt_restore_fpu_state(uc);
+       err |= restore_altstack(&uc->uc_stack);
 
-       if (err || do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
+       if (err)
                goto badframe;
 
        if (mangle_kernel_stack(regs, temp, &uc->uc_extra))
@@ -1014,11 +965,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(rdusp()),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, rdusp());
        err |= rt_setup_ucontext(&frame->uc, regs);
        err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
 
index 10f8ac186855300af1fba9b374ddc581717b2356..b3778391d9cc6eb8513e590c0af79890cefc0ba8 100644 (file)
@@ -33,8 +33,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_CLONE
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_FORK
index 70da83a49670539829365a7012395de497a348be..7e394fc2c43944c787dfa415b9697ec53f043831 100644 (file)
@@ -124,6 +124,7 @@ ret_from_intr:
        lwi     r11, r1, PT_MODE
        bneid   r11, no_intr_resched
 
+3:
        lwi     r6, r31, TS_THREAD_INFO /* get thread info */
        lwi     r19, r6, TI_FLAGS       /* get flags in thread info */
                                /* do an extra work if any bits are set */
@@ -132,11 +133,13 @@ ret_from_intr:
        beqi    r11, 1f
        bralid  r15, schedule
        nop
+       bri     3b
 1:     andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME
        beqid   r11, no_intr_resched
        addk    r5, r1, r0
        bralid  r15, do_notify_resume
        addk    r6, r0, r0
+       bri     3b
 
 no_intr_resched:
        /* Disable interrupts, we are now committed to the state restore */
@@ -280,6 +283,7 @@ ENTRY(_user_exception)
        /* Figure out which function to use for this system call. */
        /* Note Microblaze barrel shift is optional, so don't rely on it */
        add     r12, r12, r12                   /* convert num -> ptr */
+       addik   r30, r0, 1                      /* restarts allowed */
        add     r12, r12, r12
        lwi     r12, r12, sys_call_table        /* Get function pointer */
        addik   r15, r0, ret_to_user-8          /* set return address */
@@ -369,6 +373,7 @@ ENTRY(_debug_exception)
        bralid  r15, send_sig
        add     r7, r0, r0                      /* 3rd param zero */
 
+       addik   r30, r0, 1                      /* restarts allowed ??? */
        /* Restore r3/r4 to work around how ret_to_user works */
        lwi     r3, r1, PT_R3
        lwi     r4, r1, PT_R4
@@ -482,18 +487,26 @@ ENTRY(ret_from_kernel_thread)
        addk    r3, r0, r0
 
 work_pending:
+       lwi     r11, r1, PT_MODE
+       bneid   r11, 2f
+3:
        enable_irq
-
        andi    r11, r19, _TIF_NEED_RESCHED
        beqi    r11, 1f
        bralid  r15, schedule
        nop
+       bri     4f
 1:     andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME
        beqi    r11, no_work_pending
-       addk    r5, r1, r0
+       addk    r5, r30, r0
        bralid  r15, do_notify_resume
        addik   r6, r0, 1
-       bri     no_work_pending
+       addk    r30, r0, r0     /* no restarts from now on */
+4:
+       disable_irq
+       lwi     r6, r31, TS_THREAD_INFO /* get thread info */
+       lwi     r19, r6, TI_FLAGS /* get flags in thread info */
+       bri     3b
 
 ENTRY(ret_to_user)
        disable_irq
@@ -507,6 +520,7 @@ ENTRY(ret_to_user)
 no_work_pending:
        disable_irq
 
+2:
        /* save r31 */
        swi     r31, r0, PER_CPU(CURRENT_SAVE)
        /* save mode indicator */
@@ -559,6 +573,7 @@ no_work_pending:
        nop
 
 sys_rt_sigreturn_wrapper:
+       addk    r30, r0, r0             /* no restarts for this one */
        brid    sys_rt_sigreturn
        addk    r5, r1, r0
 
index c217367dfc7b31d14ecf138f2cee3371e8aa0251..0536bc021cc6c66667f0cbb66601c86b0ace9c10 100644 (file)
@@ -354,6 +354,7 @@ C_ENTRY(_user_exception):
        /* Note Microblaze barrel shift is optional, so don't rely on it */
        add     r12, r12, r12;                  /* convert num -> ptr */
        add     r12, r12, r12;
+       addi    r30, r0, 1                      /* restarts allowed */
 
 #ifdef DEBUG
        /* Trac syscalls and stored them to syscall_debug_table */
@@ -401,26 +402,27 @@ C_ENTRY(ret_from_trap):
         * trigger rescheduling. */
        /* get thread info from current task */
        lwi     r11, CURRENT_TASK, TS_THREAD_INFO;
-       lwi     r11, r11, TI_FLAGS;             /* get flags in thread info */
-       andi    r11, r11, _TIF_NEED_RESCHED;
+       lwi     r19, r11, TI_FLAGS;             /* get flags in thread info */
+       andi    r11, r19, _TIF_NEED_RESCHED;
        beqi    r11, 5f;
 
        bralid  r15, schedule;  /* Call scheduler */
        nop;                            /* delay slot */
+       bri     1b
 
        /* Maybe handle a signal */
-5:     /* get thread info from current task*/
-       lwi     r11, CURRENT_TASK, TS_THREAD_INFO;
-       lwi     r11, r11, TI_FLAGS;     /* get flags in thread info */
-       andi    r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
-       beqi    r11, 1f;                /* Signals to handle, handle them */
+5:     
+       andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
+       beqi    r11, 4f;                /* Signals to handle, handle them */
 
        addik   r5, r1, 0;              /* Arg 1: struct pt_regs *regs */
        bralid  r15, do_notify_resume;  /* Handle any signals */
-       addi    r6, r0, 1;              /* Arg 2: int in_syscall */
+       add     r6, r30, r0;            /* Arg 2: int in_syscall */
+       add     r30, r0, r0             /* no more restarts */
+       bri     1b
 
 /* Finally, return to user state.  */
-1:     set_bip;                        /*  Ints masked for state restore */
+4:     set_bip;                        /*  Ints masked for state restore */
        swi     CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
        VM_OFF;
        tophys(r1,r1);
@@ -464,6 +466,7 @@ C_ENTRY(ret_from_kernel_thread):
        add     r3, r0, r0
 
 C_ENTRY(sys_rt_sigreturn_wrapper):
+       addik   r30, r0, 0              /* no restarts */
        brid    sys_rt_sigreturn        /* Do real work */
        addik   r5, r1, 0;              /* add user context as 1st arg */
 
@@ -571,20 +574,20 @@ C_ENTRY(ret_from_exc):
 
        /* We're returning to user mode, so check for various conditions that
           trigger rescheduling. */
+1:
        lwi     r11, CURRENT_TASK, TS_THREAD_INFO;      /* get thread info */
-       lwi     r11, r11, TI_FLAGS;     /* get flags in thread info */
-       andi    r11, r11, _TIF_NEED_RESCHED;
+       lwi     r19, r11, TI_FLAGS;     /* get flags in thread info */
+       andi    r11, r19, _TIF_NEED_RESCHED;
        beqi    r11, 5f;
 
 /* Call the scheduler before returning from a syscall/trap. */
        bralid  r15, schedule;  /* Call scheduler */
        nop;                            /* delay slot */
+       bri     1b
 
        /* Maybe handle a signal */
-5:     lwi     r11, CURRENT_TASK, TS_THREAD_INFO;      /* get thread info */
-       lwi     r11, r11, TI_FLAGS;     /* get flags in thread info */
-       andi    r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
-       beqi    r11, 1f;                /* Signals to handle, handle them */
+5:     andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
+       beqi    r11, 4f;                /* Signals to handle, handle them */
 
        /*
         * Handle a signal return; Pending signals should be in r18.
@@ -600,9 +603,10 @@ C_ENTRY(ret_from_exc):
        addik   r5, r1, 0;              /* Arg 1: struct pt_regs *regs */
        bralid  r15, do_notify_resume;  /* Handle any signals */
        addi    r6, r0, 0;              /* Arg 2: int in_syscall */
+       bri     1b
 
 /* Finally, return to user state.  */
-1:     set_bip;                        /* Ints masked for state restore */
+4:     set_bip;                        /* Ints masked for state restore */
        swi     CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
        VM_OFF;
        tophys(r1,r1);
@@ -682,22 +686,23 @@ ret_from_irq:
        lwi     r11, r1, PT_MODE;
        bnei    r11, 2f;
 
+1:
        lwi     r11, CURRENT_TASK, TS_THREAD_INFO;
-       lwi     r11, r11, TI_FLAGS; /* MS: get flags from thread info */
-       andi    r11, r11, _TIF_NEED_RESCHED;
+       lwi     r19, r11, TI_FLAGS; /* MS: get flags from thread info */
+       andi    r11, r19, _TIF_NEED_RESCHED;
        beqi    r11, 5f
        bralid  r15, schedule;
        nop; /* delay slot */
+       bri     1b
 
     /* Maybe handle a signal */
-5:     lwi     r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */
-       lwi     r11, r11, TI_FLAGS; /* get flags in thread info */
-       andi    r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
+5:     andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
        beqid   r11, no_intr_resched
 /* Handle a signal return; Pending signals should be in r18. */
        addik   r5, r1, 0; /* Arg 1: struct pt_regs *regs */
        bralid  r15, do_notify_resume;  /* Handle any signals */
        addi    r6, r0, 0; /* Arg 2: int in_syscall */
+       bri     1b
 
 /* Finally, return to user state. */
 no_intr_resched:
@@ -815,28 +820,29 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
        lwi     r11, r1, PT_MODE;
        bnei    r11, 2f;
 /* MS: Return to user space - gdb */
+1:
        /* Get current task ptr into r11 */
        lwi     r11, CURRENT_TASK, TS_THREAD_INFO;      /* get thread info */
-       lwi     r11, r11, TI_FLAGS;     /* get flags in thread info */
-       andi    r11, r11, _TIF_NEED_RESCHED;
+       lwi     r19, r11, TI_FLAGS;     /* get flags in thread info */
+       andi    r11, r19, _TIF_NEED_RESCHED;
        beqi    r11, 5f;
 
        /* Call the scheduler before returning from a syscall/trap. */
        bralid  r15, schedule;  /* Call scheduler */
        nop;                            /* delay slot */
+       bri     1b
 
        /* Maybe handle a signal */
-5:     lwi     r11, CURRENT_TASK, TS_THREAD_INFO;      /* get thread info */
-       lwi     r11, r11, TI_FLAGS;     /* get flags in thread info */
-       andi    r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
-       beqi    r11, 1f;                /* Signals to handle, handle them */
+5:     andi    r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME;
+       beqi    r11, 4f;                /* Signals to handle, handle them */
 
        addik   r5, r1, 0;              /* Arg 1: struct pt_regs *regs */
        bralid  r15, do_notify_resume;  /* Handle any signals */
        addi  r6, r0, 0;        /* Arg 2: int in_syscall */
+       bri     1b
 
 /* Finally, return to user state.  */
-1:     swi     CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
+4:     swi     CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */
        VM_OFF;
        tophys(r1,r1);
        /* MS: Restore all regs */
index ab1b9db661f3ced3173c29e305f7cbc726054f71..b050219c42e6d819d28c11d4144dfd8916f383db 100644 (file)
@@ -164,29 +164,6 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
                tracehook_report_syscall_exit(regs, step);
 }
 
-#if 0
-static asmlinkage void syscall_trace(void)
-{
-       if (!test_thread_flag(TIF_SYSCALL_TRACE))
-               return;
-       if (!(current->ptrace & PT_PTRACED))
-               return;
-       /* The 0x80 provides a way for the tracing parent to distinguish
-        between a syscall stop and SIGTRAP delivery */
-       ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
-                               ? 0x80 : 0));
-       /*
-        * this isn't the same as continuing with a signal, but it will do
-        * for normal use. strace only continues with a signal if the
-        * stopping signal is not SIGTRAP. -brl
-        */
-       if (current->exit_code) {
-               send_sig(current->exit_code, current, 1);
-               current->exit_code = 0;
-       }
-}
-#endif
-
 void ptrace_disable(struct task_struct *child)
 {
        /* nothing to do */
index ac3d0a0f4814ea3d115c79d61f687a081f08691b..9f7a8bde068626aa05100aecf9753c70369dfdfd 100644 (file)
 #include <asm/cacheflush.h>
 #include <asm/syscalls.h>
 
-asmlinkage long
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-               struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->r1);
-}
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -109,9 +102,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval))
                goto badframe;
 
-       /* It is more difficult to avoid calling this function than to
-        call it and ignore errors. */
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return rval;
@@ -194,11 +185,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext. */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp,
-                       &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->r1),
-                       &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->r1);
        err |= setup_sigcontext(&frame->uc.uc_mcontext,
                        regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
@@ -356,15 +343,6 @@ static void do_signal(struct pt_regs *regs, int in_syscall)
 
 asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall)
 {
-       /*
-        * We want the common case to go fast, which
-        * is why we may in certain cases get here from
-        * kernel mode. Just return without doing anything
-        * if so.
-        */
-       if (kernel_mode(regs))
-               return;
-
        if (test_thread_flag(TIF_SIGPENDING))
                do_signal(regs, in_syscall);
 
index 5d7170bfeb28818b3a3b6f0a101b129f44c91955..198641589bb5f50172eaadf1d207961d0d802331 100644 (file)
@@ -40,6 +40,7 @@ config MIPS
        select HAVE_MOD_ARCH_SPECIFIC
        select MODULES_USE_ELF_REL if MODULES
        select MODULES_USE_ELF_RELA if MODULES && 64BIT
+       select CLONE_BACKWARDS
 
 menu "Machine selection"
 
index 3c5d1464b7bde4d93f5d4345fbedd31ccda7e47a..ebaae9649f8a11814df408332ed35f5a50a327c8 100644 (file)
@@ -288,6 +288,14 @@ struct compat_shmid64_ds {
        compat_ulong_t  __unused2;
 };
 
+/* MIPS has unusual order of fields in stack_t */
+typedef struct compat_sigaltstack {
+       compat_uptr_t                   ss_sp;
+       compat_size_t                   ss_size;
+       int                             ss_flags;
+} compat_stack_t;
+#define compat_sigaltstack compat_sigaltstack
+
 static inline int is_compat_task(void)
 {
        return test_thread_flag(TIF_32BIT_ADDR);
index cf4a08062d1d899c34c3487e56009fad7a1f4b5b..197f6367c201c122171b7e81cbcebc328a683a7f 100644 (file)
@@ -21,4 +21,6 @@
 #include <asm/sigcontext.h>
 #include <asm/siginfo.h>
 
+#define __ARCH_HAS_ODD_SIGACTION
+
 #endif /* _ASM_SIGNAL_H */
index 0cd719fabb515b9644310c5e1e6165965b9431ca..91831800c48074a4a56bcdd881fb6035d0c00ba8 100644 (file)
 #define save_static_function(symbol)                                   \
 __asm__(                                                               \
        ".text\n\t"                                                     \
-       ".globl\t" #symbol "\n\t"                                       \
+       ".globl\t__" #symbol "\n\t"                                     \
        ".align\t2\n\t"                                                 \
-       ".type\t" #symbol ", @function\n\t"                             \
-       ".ent\t" #symbol ", 0\n"                                        \
+       ".type\t__" #symbol ", @function\n\t"                           \
+       ".ent\t__" #symbol ", 0\n__"                                    \
        #symbol":\n\t"                                                  \
        ".frame\t$29, 0, $31\n\t"                                       \
        "sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t"  \
@@ -35,9 +35,9 @@ __asm__(                                                              \
        "sw\t$22,"__str(PT_R22)"($29)\n\t"                              \
        "sw\t$23,"__str(PT_R23)"($29)\n\t"                              \
        "sw\t$30,"__str(PT_R30)"($29)\n\t"                              \
-       "j\t_" #symbol "\n\t"                                           \
-       ".end\t" #symbol "\n\t"                                         \
-       ".size\t" #symbol",. - " #symbol)
+       "j\t" #symbol "\n\t"                                            \
+       ".end\t__" #symbol "\n\t"                                       \
+       ".size\t__" #symbol",. - __" #symbol)
 
 #define nabi_no_regargs
 
@@ -48,10 +48,10 @@ __asm__(                                                            \
 #define save_static_function(symbol)                                   \
 __asm__(                                                               \
        ".text\n\t"                                                     \
-       ".globl\t" #symbol "\n\t"                                       \
+       ".globl\t__" #symbol "\n\t"                                     \
        ".align\t2\n\t"                                                 \
-       ".type\t" #symbol ", @function\n\t"                             \
-       ".ent\t" #symbol ", 0\n"                                        \
+       ".type\t__" #symbol ", @function\n\t"                           \
+       ".ent\t__" #symbol ", 0\n__"                                    \
        #symbol":\n\t"                                                  \
        ".frame\t$29, 0, $31\n\t"                                       \
        "sd\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t"  \
@@ -63,9 +63,9 @@ __asm__(                                                              \
        "sd\t$22,"__str(PT_R22)"($29)\n\t"                              \
        "sd\t$23,"__str(PT_R23)"($29)\n\t"                              \
        "sd\t$30,"__str(PT_R30)"($29)\n\t"                              \
-       "j\t_" #symbol "\n\t"                                           \
-       ".end\t" #symbol "\n\t"                                         \
-       ".size\t" #symbol",. - " #symbol)
+       "j\t" #symbol "\n\t"                                            \
+       ".end\t__" #symbol "\n\t"                                       \
+       ".size\t__" #symbol",. - __" #symbol)
 
 #define nabi_no_regargs                                                        \
        unsigned long __dummy0,                                         \
index 9e47cc11aa263ba3991d680736bce6aeea41447e..64f661e328796f55a0d52e144850e64cf94c4187 100644 (file)
@@ -35,7 +35,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
 # ifdef CONFIG_32BIT
 #  define __ARCH_WANT_STAT64
 #  define __ARCH_WANT_SYS_TIME
@@ -43,6 +42,8 @@
 # ifdef CONFIG_MIPS32_O32
 #  define __ARCH_WANT_COMPAT_SYS_TIME
 # endif
+#define __ARCH_WANT_SYS_FORK
+#define __ARCH_WANT_SYS_CLONE
 
 /* whitelists for checksyscalls */
 #define __IGNORE_select
index 770732cb8d0387e6ce692b0eae45d205681608d1..6783c887a678d4756d12de9e69e4d9b68cf666ed 100644 (file)
@@ -96,15 +96,13 @@ typedef unsigned long old_sigset_t;         /* at least 32 bits */
 
 #include <asm-generic/signal-defs.h>
 
+#ifndef __KERNEL__
 struct sigaction {
        unsigned int    sa_flags;
        __sighandler_t  sa_handler;
        sigset_t        sa_mask;
 };
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#endif
 
 /* IRIX compatible stack_t  */
 typedef struct sigaltstack {
index 7adab86c632ce32efdb6550c87f6f6024fb5006f..253bd8ad7446de164090e0b23c361aac0992d5db 100644 (file)
@@ -119,22 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
        return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
 }
 
-SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid,
-       struct compat_timespec __user *, interval)
-{
-       struct timespec t;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t);
-       set_fs(old_fs);
-       if (put_user (t.tv_sec, &interval->tv_sec) ||
-           __put_user(t.tv_nsec, &interval->tv_nsec))
-               return -EFAULT;
-       return ret;
-}
-
 #ifdef CONFIG_SYSVIPC
 
 SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
@@ -295,27 +279,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
                             merge_64(len_a4, len_a5));
 }
 
-save_static_function(sys32_clone);
-static int noinline __used
-_sys32_clone(nabi_no_regargs struct pt_regs regs)
-{
-       unsigned long clone_flags;
-       unsigned long newsp;
-       int __user *parent_tidptr, *child_tidptr;
-
-       clone_flags = regs.regs[4];
-       newsp = regs.regs[5];
-       if (!newsp)
-               newsp = regs.regs[29];
-       parent_tidptr = (int __user *) regs.regs[6];
-
-       /* Use __dummy4 instead of getting it off the stack, so that
-          syscall() works.  */
-       child_tidptr = (int __user *) __dummy4;
-       return do_fork(clone_flags, newsp, 0,
-                      parent_tidptr, child_tidptr);
-}
-
 asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf,
        size_t len)
 {
@@ -328,10 +291,3 @@ SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,
        return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4),
                                 dfd, pathname);
 }
-
-SYSCALL_DEFINE6(32_futex, u32 __user *, uaddr, int, op, u32, val,
-               struct compat_timespec __user *, utime, u32 __user *, uaddr2,
-               u32, val3)
-{
-       return compat_sys_futex(uaddr, op, val, utime, uaddr2, val3);
-}
index a11c6f9fdd5e0f2e05b306936cb98464f88a130d..a33d2ef8f2734f1d461f48148a8be853cde8ee01 100644 (file)
@@ -156,7 +156,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
        *childregs = *regs;
        childregs->regs[7] = 0; /* Clear error flag */
        childregs->regs[2] = 0; /* Child gets zero as return value */
-       childregs->regs[29] = usp;
+       if (usp)
+               childregs->regs[29] = usp;
        ti->addr_limit = USER_DS;
 
        p->thread.reg29 = (unsigned long) childregs;
index d20a4bc9ed05c90191f82a120eb2648d75e2f846..80ff9422215f3aa6683578b06627a4fc7fe1ad0c 100644 (file)
@@ -226,7 +226,7 @@ einval:     li      v0, -ENOSYS
        .macro  syscalltable
        sys     sys_syscall             8       /* 4000 */
        sys     sys_exit                1
-       sys     sys_fork                0
+       sys     __sys_fork              0
        sys     sys_read                3
        sys     sys_write               3
        sys     sys_open                3       /* 4005 */
@@ -344,7 +344,7 @@ einval:     li      v0, -ENOSYS
        sys     sys_ipc                 6
        sys     sys_fsync               1
        sys     sys_sigreturn           0
-       sys     sys_clone               0       /* 4120 */
+       sys     __sys_clone             6       /* 4120 */
        sys     sys_setdomainname       2
        sys     sys_newuname            1
        sys     sys_ni_syscall          0       /* sys_modify_ldt */
index b64f642da073f7f7d48ab9a1d54a8f2e749032db..9444ad9ea575d4b4dac301c5cdb76571488503c5 100644 (file)
@@ -170,8 +170,8 @@ sys_call_table:
        PTR     sys_socketpair
        PTR     sys_setsockopt
        PTR     sys_getsockopt
-       PTR     sys_clone                       /* 5055 */
-       PTR     sys_fork
+       PTR     __sys_clone                     /* 5055 */
+       PTR     __sys_fork
        PTR     sys_execve
        PTR     sys_exit
        PTR     sys_wait4
index c29ac197f44694821b3a411954a7d6861e0ba33c..3b18a8e292155fe4a26abec5c6d2a8e536b71109 100644 (file)
@@ -117,8 +117,8 @@ EXPORT(sysn32_call_table)
        PTR     sys_mprotect                    /* 6010 */
        PTR     sys_munmap
        PTR     sys_brk
-       PTR     sys_32_rt_sigaction
-       PTR     sys_32_rt_sigprocmask
+       PTR     compat_sys_rt_sigaction
+       PTR     compat_sys_rt_sigprocmask
        PTR     compat_sys_ioctl                /* 6015 */
        PTR     sys_pread64
        PTR     sys_pwrite64
@@ -159,8 +159,8 @@ EXPORT(sysn32_call_table)
        PTR     sys_socketpair
        PTR     compat_sys_setsockopt
        PTR     sys_getsockopt
-       PTR     sys_clone                       /* 6055 */
-       PTR     sys_fork
+       PTR     __sys_clone                     /* 6055 */
+       PTR     __sys_fork
        PTR     compat_sys_execve
        PTR     sys_exit
        PTR     compat_sys_wait4
@@ -229,11 +229,11 @@ EXPORT(sysn32_call_table)
        PTR     sys_getsid
        PTR     sys_capget
        PTR     sys_capset
-       PTR     sys_32_rt_sigpending            /* 6125 */
+       PTR     compat_sys_rt_sigpending        /* 6125 */
        PTR     compat_sys_rt_sigtimedwait
-       PTR     sys_32_rt_sigqueueinfo
-       PTR     sysn32_rt_sigsuspend
-       PTR     sys32_sigaltstack
+       PTR     compat_sys_rt_sigqueueinfo
+       PTR     compat_sys_rt_sigsuspend
+       PTR     compat_sys_sigaltstack
        PTR     compat_sys_utime                /* 6130 */
        PTR     sys_mknod
        PTR     sys_32_personality
@@ -249,7 +249,7 @@ EXPORT(sysn32_call_table)
        PTR     sys_sched_getscheduler
        PTR     sys_sched_get_priority_max
        PTR     sys_sched_get_priority_min
-       PTR     sys_32_sched_rr_get_interval    /* 6145 */
+       PTR     compat_sys_sched_rr_get_interval        /* 6145 */
        PTR     sys_mlock
        PTR     sys_munlock
        PTR     sys_mlockall
@@ -298,7 +298,7 @@ EXPORT(sysn32_call_table)
        PTR     sys_fremovexattr
        PTR     sys_tkill
        PTR     sys_ni_syscall
-       PTR     sys_32_futex
+       PTR     compat_sys_futex
        PTR     compat_sys_sched_setaffinity    /* 6195 */
        PTR     compat_sys_sched_getaffinity
        PTR     sys_cacheflush
index cf3e75e466506bc6b73e371818712580bb9d7918..063cd0d6ddd22c1a87adba66be35ed279f144662 100644 (file)
@@ -194,7 +194,7 @@ einval:     li      v0, -ENOSYS
 sys_call_table:
        PTR     sys32_syscall                   /* 4000 */
        PTR     sys_exit
-       PTR     sys_fork
+       PTR     __sys_fork
        PTR     sys_read
        PTR     sys_write
        PTR     compat_sys_open                 /* 4005 */
@@ -312,7 +312,7 @@ sys_call_table:
        PTR     sys_32_ipc
        PTR     sys_fsync
        PTR     sys32_sigreturn
-       PTR     sys32_clone                     /* 4120 */
+       PTR     __sys_clone                     /* 4120 */
        PTR     sys_setdomainname
        PTR     sys_newuname
        PTR     sys_ni_syscall                  /* sys_modify_ldt */
@@ -357,7 +357,7 @@ sys_call_table:
        PTR     sys_sched_yield
        PTR     sys_sched_get_priority_max
        PTR     sys_sched_get_priority_min
-       PTR     sys_32_sched_rr_get_interval    /* 4165 */
+       PTR     compat_sys_sched_rr_get_interval        /* 4165 */
        PTR     compat_sys_nanosleep
        PTR     sys_mremap
        PTR     sys_accept
@@ -386,19 +386,19 @@ sys_call_table:
        PTR     sys_getresgid
        PTR     sys_prctl
        PTR     sys32_rt_sigreturn
-       PTR     sys_32_rt_sigaction
-       PTR     sys_32_rt_sigprocmask           /* 4195 */
-       PTR     sys_32_rt_sigpending
+       PTR     compat_sys_rt_sigaction
+       PTR     compat_sys_rt_sigprocmask       /* 4195 */
+       PTR     compat_sys_rt_sigpending
        PTR     compat_sys_rt_sigtimedwait
-       PTR     sys_32_rt_sigqueueinfo
-       PTR     sys32_rt_sigsuspend
+       PTR     compat_sys_rt_sigqueueinfo
+       PTR     compat_sys_rt_sigsuspend
        PTR     sys_32_pread                    /* 4200 */
        PTR     sys_32_pwrite
        PTR     sys_chown
        PTR     sys_getcwd
        PTR     sys_capget
        PTR     sys_capset                      /* 4205 */
-       PTR     sys32_sigaltstack
+       PTR     compat_sys_sigaltstack
        PTR     sys_32_sendfile
        PTR     sys_ni_syscall
        PTR     sys_ni_syscall
@@ -430,7 +430,7 @@ sys_call_table:
        PTR     sys_fremovexattr                /* 4235 */
        PTR     sys_tkill
        PTR     sys_sendfile64
-       PTR     sys_32_futex
+       PTR     compat_sys_futex
        PTR     compat_sys_sched_setaffinity
        PTR     compat_sys_sched_getaffinity    /* 4240 */
        PTR     compat_sys_io_setup
@@ -470,7 +470,7 @@ sys_call_table:
        PTR     compat_sys_mq_notify            /* 4275 */
        PTR     compat_sys_mq_getsetattr
        PTR     sys_ni_syscall                  /* sys_vserver */
-       PTR     sys_32_waitid
+       PTR     compat_sys_waitid
        PTR     sys_ni_syscall                  /* available, was setaltroot */
        PTR     sys_add_key                     /* 4280 */
        PTR     sys_request_key
index b6aa77035019bc4913468fbf551f21ef9e9898aa..95b019d92f50b20b04f03d14878ca729fabe7e8d 100644 (file)
@@ -247,35 +247,12 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
  */
 
 #ifdef CONFIG_TRAD_SIGNALS
-asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
+SYSCALL_DEFINE1(sigsuspend, sigset_t __user *, uset)
 {
-       sigset_t newset;
-       sigset_t __user *uset;
-
-       uset = (sigset_t __user *) regs.regs[4];
-       if (copy_from_user(&newset, uset, sizeof(sigset_t)))
-               return -EFAULT;
-       return sigsuspend(&newset);
+       return sys_rt_sigsuspend(uset, sizeof(sigset_t));
 }
 #endif
 
-asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
-{
-       sigset_t newset;
-       sigset_t __user *unewset;
-       size_t sigsetsize;
-
-       /* XXX Don't preclude handling different sized sigset_t's.  */
-       sigsetsize = regs.regs[5];
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       unewset = (sigset_t __user *) regs.regs[4];
-       if (copy_from_user(&newset, unewset, sizeof(newset)))
-               return -EFAULT;
-       return sigsuspend(&newset);
-}
-
 #ifdef CONFIG_TRAD_SIGNALS
 SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
        struct sigaction __user *, oact)
@@ -317,15 +294,6 @@ SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
 }
 #endif
 
-asmlinkage int sys_sigaltstack(nabi_no_regargs struct pt_regs regs)
-{
-       const stack_t __user *uss = (const stack_t __user *) regs.regs[4];
-       stack_t __user *uoss = (stack_t __user *) regs.regs[5];
-       unsigned long usp = regs.regs[29];
-
-       return do_sigaltstack(uss, uoss, usp);
-}
-
 #ifdef CONFIG_TRAD_SIGNALS
 asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
@@ -382,9 +350,8 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        else if (sig)
                force_sig(sig, current);
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]);
+       if (restore_altstack(&frame->rs_uc.uc_stack))
+               goto badframe;
 
        /*
         * Don't let your children do this ...
@@ -461,12 +428,7 @@ static int setup_rt_frame(void *sig_return, struct k_sigaction *ka,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->rs_uc.uc_flags);
        err |= __put_user(NULL, &frame->rs_uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp,
-                         &frame->rs_uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[29]),
-                         &frame->rs_uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size,
-                         &frame->rs_uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
        err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
        err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
 
index da1b56a39ac77815b4989183fd07821286468dfe..ad7c2be0c33dfee94565743e222e6a5d57dd6e65 100644 (file)
@@ -55,23 +55,10 @@ extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 __user
 typedef unsigned int __sighandler32_t;
 typedef void (*vfptr_t)(void);
 
-struct sigaction32 {
-       unsigned int            sa_flags;
-       __sighandler32_t        sa_handler;
-       compat_sigset_t         sa_mask;
-};
-
-/* IRIX compatible stack_t  */
-typedef struct sigaltstack32 {
-       s32 ss_sp;
-       compat_size_t ss_size;
-       int ss_flags;
-} stack32_t;
-
 struct ucontext32 {
        u32                 uc_flags;
        s32                 uc_link;
-       stack32_t           uc_stack;
+       compat_stack_t      uc_stack;
        struct sigcontext32 uc_mcontext;
        compat_sigset_t     uc_sigmask;   /* mask last for extensibility */
 };
@@ -280,36 +267,13 @@ static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
  * Atomically swap in the new signal mask, and wait for a signal.
  */
 
-asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sys32_sigsuspend(compat_sigset_t __user *uset)
 {
-       compat_sigset_t __user *uset;
-       sigset_t newset;
-
-       uset = (compat_sigset_t __user *) regs.regs[4];
-       if (get_sigset(&newset, uset))
-               return -EFAULT;
-       return sigsuspend(&newset);
-}
-
-asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
-{
-       compat_sigset_t __user *uset;
-       sigset_t newset;
-       size_t sigsetsize;
-
-       /* XXX Don't preclude handling different sized sigset_t's.  */
-       sigsetsize = regs.regs[5];
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       uset = (compat_sigset_t __user *) regs.regs[4];
-       if (get_sigset(&newset, uset))
-               return -EFAULT;
-       return sigsuspend(&newset);
+       return compat_sys_rt_sigsuspend(uset, sizeof(compat_sigset_t));
 }
 
-SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
-       struct sigaction32 __user *, oact)
+SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *, act,
+       struct compat_sigaction __user *, oact)
 {
        struct k_sigaction new_ka, old_ka;
        int ret;
@@ -350,45 +314,6 @@ SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
        return ret;
 }
 
-asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
-{
-       const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
-       stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
-       unsigned long usp = regs.regs[29];
-       stack_t kss, koss;
-       int ret, err = 0;
-       mm_segment_t old_fs = get_fs();
-       s32 sp;
-
-       if (uss) {
-               if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
-                       return -EFAULT;
-               err |= __get_user(sp, &uss->ss_sp);
-               kss.ss_sp = (void __user *) (long) sp;
-               err |= __get_user(kss.ss_size, &uss->ss_size);
-               err |= __get_user(kss.ss_flags, &uss->ss_flags);
-               if (err)
-                       return -EFAULT;
-       }
-
-       set_fs(KERNEL_DS);
-       ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
-                            uoss ? (stack_t __user *)&koss : NULL, usp);
-       set_fs(old_fs);
-
-       if (!ret && uoss) {
-               if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
-                       return -EFAULT;
-               sp = (int) (unsigned long) koss.ss_sp;
-               err |= __put_user(sp, &uoss->ss_sp);
-               err |= __put_user(koss.ss_size, &uoss->ss_size);
-               err |= __put_user(koss.ss_flags, &uoss->ss_flags);
-               if (err)
-                       return -EFAULT;
-       }
-       return ret;
-}
-
 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
 {
        int err;
@@ -490,10 +415,7 @@ badframe:
 asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct rt_sigframe32 __user *frame;
-       mm_segment_t old_fs;
        sigset_t set;
-       stack_t st;
-       s32 sp;
        int sig;
 
        frame = (struct rt_sigframe32 __user *) regs.regs[29];
@@ -510,22 +432,9 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        else if (sig)
                force_sig(sig, current);
 
-       /* The ucontext contains a stack32_t, so we must convert!  */
-       if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
-               goto badframe;
-       st.ss_sp = (void __user *)(long) sp;
-       if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
-               goto badframe;
-       if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
+       if (compat_restore_altstack(&frame->rs_uc.uc_stack))
                goto badframe;
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
-       set_fs(old_fs);
-
        /*
         * Don't let your children do this ...
         */
@@ -590,7 +499,6 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
 {
        struct rt_sigframe32 __user *frame;
        int err = 0;
-       s32 sp;
 
        frame = get_sigframe(ka, regs, sizeof(*frame));
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
@@ -602,13 +510,7 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->rs_uc.uc_flags);
        err |= __put_user(0, &frame->rs_uc.uc_link);
-       sp = (int) (long) current->sas_ss_sp;
-       err |= __put_user(sp,
-                         &frame->rs_uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[29]),
-                         &frame->rs_uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size,
-                         &frame->rs_uc.uc_stack.ss_size);
+       err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
        err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
        err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
 
@@ -656,131 +558,6 @@ struct mips_abi mips_abi_32 = {
        .restart        = __NR_O32_restart_syscall
 };
 
-SYSCALL_DEFINE4(32_rt_sigaction, int, sig,
-       const struct sigaction32 __user *, act,
-       struct sigaction32 __user *, oact, unsigned int, sigsetsize)
-{
-       struct k_sigaction new_sa, old_sa;
-       int ret = -EINVAL;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               goto out;
-
-       if (act) {
-               s32 handler;
-               int err = 0;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)))
-                       return -EFAULT;
-               err |= __get_user(handler, &act->sa_handler);
-               new_sa.sa.sa_handler = (void __user *)(s64)handler;
-               err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
-               err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
-               if (err)
-                       return -EFAULT;
-       }
-
-       ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
-
-       if (!ret && oact) {
-               int err = 0;
-
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
-                       return -EFAULT;
-
-               err |= __put_user((u32)(u64)old_sa.sa.sa_handler,
-                                  &oact->sa_handler);
-               err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags);
-               err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask);
-               if (err)
-                       return -EFAULT;
-       }
-out:
-       return ret;
-}
-
-SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set,
-       compat_sigset_t __user *, oset, unsigned int, sigsetsize)
-{
-       sigset_t old_set, new_set;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (set && get_sigset(&new_set, set))
-               return -EFAULT;
-
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
-                                oset ? (sigset_t __user *)&old_set : NULL,
-                                sigsetsize);
-       set_fs(old_fs);
-
-       if (!ret && oset && put_sigset(&old_set, oset))
-               return -EFAULT;
-
-       return ret;
-}
-
-SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset,
-       unsigned int, sigsetsize)
-{
-       int ret;
-       sigset_t set;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
-       set_fs(old_fs);
-
-       if (!ret && put_sigset(&set, uset))
-               return -EFAULT;
-
-       return ret;
-}
-
-SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig,
-       compat_siginfo_t __user *, uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (copy_from_user(&info, uinfo, 3*sizeof(int)) ||
-           copy_from_user(info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
-               return -EFAULT;
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
-       set_fs(old_fs);
-       return ret;
-}
-
-SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid,
-            compat_siginfo_t __user *, uinfo, int, options,
-            struct compat_rusage __user *, uru)
-{
-       siginfo_t info;
-       struct rusage ru;
-       long ret;
-       mm_segment_t old_fs = get_fs();
-
-       info.si_signo = 0;
-       set_fs(KERNEL_DS);
-       ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options,
-                        uru ? (struct rusage __user *) &ru : NULL);
-       set_fs(old_fs);
-
-       if (ret < 0 || info.si_signo == 0)
-               return ret;
-
-       if (uru && (ret = put_compat_rusage(&ru, uru)))
-               return ret;
-
-       BUG_ON(info.si_code & __SI_MASK);
-       info.si_code |= __SI_CHLD;
-       return copy_siginfo_to_user32(uinfo, &info);
-}
-
 static int signal32_init(void)
 {
        if (cpu_has_fpu) {
index 3574c145511be486b0feb82177ced3c80679d180..5f4ef2ae6199bb1a7863909f73e297589c75fde8 100644 (file)
 extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *);
 extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *);
 
-
-/* IRIX compatible stack_t  */
-typedef struct sigaltstack32 {
-       s32 ss_sp;
-       compat_size_t ss_size;
-       int ss_flags;
-} stack32_t;
-
 struct ucontextn32 {
        u32                 uc_flags;
        s32                 uc_link;
-       stack32_t           uc_stack;
+       compat_stack_t      uc_stack;
        struct sigcontext   uc_mcontext;
        compat_sigset_t     uc_sigmask;   /* mask last for extensibility */
 };
@@ -73,34 +65,10 @@ struct rt_sigframe_n32 {
        struct ucontextn32 rs_uc;
 };
 
-extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat);
-
-asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
-{
-       compat_sigset_t __user *unewset;
-       compat_sigset_t uset;
-       size_t sigsetsize;
-       sigset_t newset;
-
-       /* XXX Don't preclude handling different sized sigset_t's.  */
-       sigsetsize = regs.regs[5];
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       unewset = (compat_sigset_t __user *) regs.regs[4];
-       if (copy_from_user(&uset, unewset, sizeof(uset)))
-               return -EFAULT;
-       sigset_from_compat(&newset, &uset);
-       return sigsuspend(&newset);
-}
-
 asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct rt_sigframe_n32 __user *frame;
-       mm_segment_t old_fs;
        sigset_t set;
-       stack_t st;
-       s32 sp;
        int sig;
 
        frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
@@ -117,23 +85,9 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        else if (sig)
                force_sig(sig, current);
 
-       /* The ucontext contains a stack32_t, so we must convert!  */
-       if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
-               goto badframe;
-       st.ss_sp = (void __user *)(long) sp;
-       if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
-               goto badframe;
-       if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
+       if (compat_restore_altstack(&frame->rs_uc.uc_stack))
                goto badframe;
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
-       set_fs(old_fs);
-
-
        /*
         * Don't let your children do this ...
         */
@@ -153,7 +107,6 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,
 {
        struct rt_sigframe_n32 __user *frame;
        int err = 0;
-       s32 sp;
 
        frame = get_sigframe(ka, regs, sizeof(*frame));
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
@@ -165,13 +118,7 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->rs_uc.uc_flags);
        err |= __put_user(0, &frame->rs_uc.uc_link);
-       sp = (int) (long) current->sas_ss_sp;
-       err |= __put_user(sp,
-                         &frame->rs_uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[29]),
-                         &frame->rs_uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size,
-                         &frame->rs_uc.uc_stack.ss_size);
+       err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
        err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
        err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
 
index 201cb76b4df9d85abf01e2d45aea5b941a612378..b32466a1a1d24a7782024d7000c75116340ccff0 100644 (file)
  * argument.  Historically that used to be expensive in Linux.  These days
  * the performance advantage is negligible.
  */
-asmlinkage int sysm_pipe(nabi_no_regargs volatile struct pt_regs regs)
+asmlinkage int sysm_pipe(void)
 {
        int fd[2];
-       int error, res;
-
-       error = do_pipe_flags(fd, 0);
-       if (error) {
-               res = error;
-               goto out;
-       }
-       regs.regs[3] = fd[1];
-       res = fd[0];
-out:
-       return res;
+       int error = do_pipe_flags(fd, 0);
+       if (error)
+               return error;
+       current_pt_regs()->regs[3] = fd[1];
+       return fd[0];
 }
 
 SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
@@ -89,43 +83,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
 }
 
 save_static_function(sys_fork);
-static int __used noinline
-_sys_fork(nabi_no_regargs struct pt_regs regs)
-{
-       return do_fork(SIGCHLD, regs.regs[29], 0, NULL, NULL);
-}
-
 save_static_function(sys_clone);
-static int __used noinline
-_sys_clone(nabi_no_regargs struct pt_regs regs)
-{
-       unsigned long clone_flags;
-       unsigned long newsp;
-       int __user *parent_tidptr, *child_tidptr;
-
-       clone_flags = regs.regs[4];
-       newsp = regs.regs[5];
-       if (!newsp)
-               newsp = regs.regs[29];
-       parent_tidptr = (int __user *) regs.regs[6];
-#ifdef CONFIG_32BIT
-       /* We need to fetch the fifth argument off the stack.  */
-       child_tidptr = NULL;
-       if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) {
-               int __user *__user *usp = (int __user *__user *) regs.regs[29];
-               if (regs.regs[2] == __NR_syscall) {
-                       if (get_user (child_tidptr, &usp[5]))
-                               return -EFAULT;
-               }
-               else if (get_user (child_tidptr, &usp[4]))
-                       return -EFAULT;
-       }
-#else
-       child_tidptr = (int __user *) regs.regs[8];
-#endif
-       return do_fork(clone_flags, newsp, 0,
-                      parent_tidptr, child_tidptr);
-}
 
 SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
 {
@@ -138,10 +96,10 @@ SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
        return 0;
 }
 
-static inline int mips_atomic_set(struct pt_regs *regs,
-       unsigned long addr, unsigned long new)
+static inline int mips_atomic_set(unsigned long addr, unsigned long new)
 {
        unsigned long old, tmp;
+       struct pt_regs *regs;
        unsigned int err;
 
        if (unlikely(addr & 3))
@@ -222,6 +180,7 @@ static inline int mips_atomic_set(struct pt_regs *regs,
        if (unlikely(err))
                return err;
 
+       regs = current_pt_regs();
        regs->regs[2] = old;
        regs->regs[7] = 0;      /* No error */
 
@@ -235,22 +194,14 @@ static inline int mips_atomic_set(struct pt_regs *regs,
        : "r" (regs));
 
        /* unreached.  Honestly.  */
-       while (1);
+       unreachable();
 }
 
-save_static_function(sys_sysmips);
-static int __used noinline
-_sys_sysmips(nabi_no_regargs struct pt_regs regs)
+SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
 {
-       long cmd, arg1, arg2;
-
-       cmd = regs.regs[4];
-       arg1 = regs.regs[5];
-       arg2 = regs.regs[6];
-
        switch (cmd) {
        case MIPS_ATOMIC_SET:
-               return mips_atomic_set(&regs, arg1, arg2);
+               return mips_atomic_set(arg1, arg2);
 
        case MIPS_FIXADE:
                if (arg1 & ~3)
index e70001cfa05b1ee650b132f9163e72766f2fbb5c..ad0caea0bfea71a14f793dc37772114f60194456 100644 (file)
@@ -10,6 +10,8 @@ config MN10300
        select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
        select GENERIC_CLOCKEVENTS
        select MODULES_USE_ELF_RELA
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config AM33_2
        def_bool n
index d280e9780793eb1d012f19ff86842f69182be344..214ff5e9fe601c169b79c3f41d8d79bbf1b8c5f7 100644 (file)
@@ -26,23 +26,8 @@ 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;
-       __sigrestore_t sa_restorer;
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
+
 #include <asm/sigcontext.h>
 
 #endif /* _ASM_SIGNAL_H */
index e6d2ed4ba68f5ac01557e4a4375da4dc016bdb04..7f9d9adfa51ed3433b44d91d6e5d89c7ac5b767a 100644 (file)
@@ -41,8 +41,6 @@
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index f570b3085ef90004d2150eca7f86107ea232cf1e..9dfac5cd16e67d537ae91d17c38dca84a820d996 100644 (file)
 
 #define DEBUG_SIG 0
 
-/*
- * atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage long sys_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-/*
- * set signal action syscall
- */
-asmlinkage long sys_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 (verify_area(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 (verify_area(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;
-}
-
-/*
- * set alternate signal stack syscall
- */
-asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t *uoss)
-{
-       return do_sigaltstack(uss, uoss, current_frame()->sp);
-}
-
 /*
  * do a signal return; undo the signal stack.
  */
@@ -193,8 +140,7 @@ asmlinkage long sys_rt_sigreturn(void)
        if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, current_frame()->sp) ==
-           -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return d0;
@@ -359,9 +305,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* create the ucontext.  */
        if (__put_user(0, &frame->uc.uc_flags) ||
            __put_user(0, &frame->uc.uc_link) ||
-           __put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) ||
-           __put_user(sas_ss_flags(regs->sp), &frame->uc.uc_stack.ss_flags) ||
-           __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size) ||
+           __save_altstack(&frame->uc.uc_stack, regs->sp) ||
            setup_sigcontext(&frame->uc.uc_mcontext,
                             &frame->fpuctx, regs, set->sig[0]) ||
            __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)))
index 5e5b30601bbf58e42cc54fbca7ffc285025db929..54afd0a129fe225bff0e12c90624db17fb400941 100644 (file)
@@ -1083,10 +1083,6 @@ ENTRY(__sys_fork)
        l.j     _fork_save_extra_regs_and_call
         l.addi r3,r1,0
 
-ENTRY(sys_sigaltstack)
-       l.j     _sys_sigaltstack
-        l.addi r5,r1,0
-
 ENTRY(sys_rt_sigreturn)
        l.j     _sys_rt_sigreturn
         l.addi r3,r1,0
index ddedc8a77861ac4372832be8e59ce60d54d616f7..ae167f7e081aa0368cb571093df8f16a9dcf71d9 100644 (file)
 
 #define DEBUG_SIG 0
 
-asmlinkage long
-_sys_sigaltstack(const stack_t *uss, stack_t *uoss, struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->sp);
-}
-
 struct rt_sigframe {
        struct siginfo *pinfo;
        void *puc;
@@ -103,9 +97,7 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return regs->gpr[11];
@@ -205,10 +197,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->sp), &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
 
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
index b1a7c4c4a53a5d4956cafcca8eb37799b3fa49fa..81a5457739712673d60a210b5b4080fbe91f7381 100644 (file)
@@ -20,15 +20,13 @@ typedef struct {
        unsigned long sig[_NSIG_WORDS];
 } sigset_t;
 
+#ifndef __KERNEL__
 struct sigaction {
        __sighandler_t sa_handler;
        unsigned long sa_flags;
        sigset_t sa_mask;               /* mask last for extensibility */
 };
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#endif
 
 #include <asm/sigcontext.h>
 
index 74f801ebbe773926ae52e161e7342e1b3287d07d..ae9a46cbfd92b0256cf7520d395494300f3538d5 100644 (file)
@@ -161,9 +161,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)       \
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
-#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 #define __ARCH_WANT_SYS_CLONE
index 7c9648919c91f2de6c33890e500841b5f9dff6bc..f33201bf8977208358b87c92911cb149a68f618a 100644 (file)
@@ -1748,44 +1748,6 @@ ENTRY(sys_rt_sigreturn_wrapper)
        LDREG   PT_GR28(%r1),%r28  /* reload original r28 for syscall_exit */
 ENDPROC(sys_rt_sigreturn_wrapper)
 
-ENTRY(sys_sigaltstack_wrapper)
-       /* Get the user stack pointer */
-       LDREG   TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
-       ldo     TASK_REGS(%r1),%r24     /* get pt regs */
-       LDREG   TASK_PT_GR30(%r24),%r24
-       STREG   %r2, -RP_OFFSET(%r30)
-#ifdef CONFIG_64BIT
-       ldo     FRAME_SIZE(%r30), %r30
-       BL      do_sigaltstack,%r2
-       ldo     -16(%r30),%r29          /* Reference param save area */
-#else
-       BL      do_sigaltstack,%r2
-       ldo     FRAME_SIZE(%r30), %r30
-#endif
-
-       ldo     -FRAME_SIZE(%r30), %r30
-       LDREG   -RP_OFFSET(%r30), %r2
-       bv      %r0(%r2)
-       nop
-ENDPROC(sys_sigaltstack_wrapper)
-
-#ifdef CONFIG_64BIT
-ENTRY(sys32_sigaltstack_wrapper)
-       /* Get the user stack pointer */
-       LDREG   TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24
-       LDREG   TASK_PT_GR30(%r24),%r24
-       STREG   %r2, -RP_OFFSET(%r30)
-       ldo     FRAME_SIZE(%r30), %r30
-       BL      do_sigaltstack32,%r2
-       ldo     -16(%r30),%r29          /* Reference param save area */
-
-       ldo     -FRAME_SIZE(%r30), %r30
-       LDREG   -RP_OFFSET(%r30), %r2
-       bv      %r0(%r2)
-       nop
-ENDPROC(sys32_sigaltstack_wrapper)
-#endif
-
 ENTRY(syscall_exit)
        /* NOTE: HP-UX syscalls also come through here
         * after hpux_syscall_exit fixes up return
index 52c85b2f502e189149865c9bf172f8c3663c1dcf..98e9e7126565816d67e4c2ad48cf1f94106c7f01 100644 (file)
@@ -143,7 +143,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
                        goto give_sigsegv;
                DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
                                usp, &compat_frame->uc.uc_stack);
-               if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT)
+               if (compat_restore_altstack(&compat_frame->uc.uc_stack))
                        goto give_sigsegv;
        } else
 #endif
@@ -154,7 +154,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
                        goto give_sigsegv;
                DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
                                usp, &frame->uc.uc_stack);
-               if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
+               if (restore_altstack(&frame->uc.uc_stack))
                        goto give_sigsegv;
        }
                
@@ -262,15 +262,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        if (is_compat_task()) {
                DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
                err |= copy_siginfo_to_user32(&compat_frame->info, info);
-               DBG(1,"SETUP_RT_FRAME: 1\n");
-               compat_val = (compat_int_t)current->sas_ss_sp;
-               err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
-               DBG(1,"SETUP_RT_FRAME: 2\n");
-               compat_val = (compat_int_t)current->sas_ss_size;
-               err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
-               DBG(1,"SETUP_RT_FRAME: 3\n");
-               compat_val = sas_ss_flags(regs->gr[30]);                
-               err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);             
+               err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
                DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
                DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
                err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 
@@ -282,10 +274,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        {       
                DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
                err |= copy_siginfo_to_user(&frame->info, info);
-               err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-               err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-               err |= __put_user(sas_ss_flags(regs->gr[30]),
-                                 &frame->uc.uc_stack.ss_flags);
+               err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
                DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
                DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
                err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
index 2ddcabb616cecaca1c1e19088e30e5213dc0706f..33eca1b04926ad09184d703e9c2fcb55cd127069 100644 (file)
@@ -60,136 +60,6 @@ sigset_64to32(compat_sigset_t *s32, sigset_t *s64)
        s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL;
 }
 
-static int
-put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
-{
-       compat_sigset_t s;
-
-       if (sz != sizeof(compat_sigset_t))
-               return -EINVAL;
-       sigset_64to32(&s, set);
-
-       return copy_to_user(up, &s, sizeof s);
-}
-
-static int
-get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
-{
-       compat_sigset_t s;
-       int r;
-
-       if (sz != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if ((r = copy_from_user(&s, up, sz)) == 0) {
-               sigset_32to64(set, &s);
-       }
-
-       return r;
-}
-
-int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset,
-                                   unsigned int sigsetsize)
-{
-       sigset_t old_set, new_set;
-       int ret;
-
-       if (set) {
-               ret = get_sigset32(set, &new_set, sigsetsize);
-               if (ret)
-                       return ret;
-       }
-       
-       KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL,
-                                oset ? (sigset_t __user *)&old_set : NULL, sigsetsize);
-
-       if (!ret && oset && put_sigset32(oset, &old_set, sigsetsize))
-               return -EFAULT;
-
-       return ret;
-}
-
-
-int sys32_rt_sigpending(compat_sigset_t __user *uset, unsigned int sigsetsize)
-{
-       int ret;
-       sigset_t set;
-
-       KERNEL_SYSCALL(ret, sys_rt_sigpending, (sigset_t __user *)&set, sigsetsize);
-
-       if (!ret && put_sigset32(uset, &set, sigsetsize))
-               return -EFAULT;
-
-       return ret;
-}
-
-long
-sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigaction32 __user *oact,
-                 size_t sigsetsize)
-{
-       struct k_sigaction32 new_sa32, old_sa32;
-       struct k_sigaction new_sa, old_sa;
-       int ret = -EINVAL;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if (act) {
-               if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa))
-                       return -EFAULT;
-               new_sa.sa.sa_handler = (__sighandler_t)(unsigned long)new_sa32.sa.sa_handler;
-               new_sa.sa.sa_flags = new_sa32.sa.sa_flags;
-               sigset_32to64(&new_sa.sa.sa_mask, &new_sa32.sa.sa_mask);
-       }
-
-       ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
-
-       if (!ret && oact) {
-               sigset_64to32(&old_sa32.sa.sa_mask, &old_sa.sa.sa_mask);
-               old_sa32.sa.sa_flags = old_sa.sa.sa_flags;
-               old_sa32.sa.sa_handler = (__sighandler_t32)(unsigned long)old_sa.sa.sa_handler;
-               if (copy_to_user(oact, &old_sa32.sa, sizeof old_sa32.sa))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-int 
-do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp)
-{
-       compat_stack_t ss32, oss32;
-       stack_t ss, oss;
-       stack_t *ssp = NULL, *ossp = NULL;
-       int ret;
-
-       if (uss32) {
-               if (copy_from_user(&ss32, uss32, sizeof ss32))
-                       return -EFAULT;
-
-               ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp;
-               ss.ss_flags = ss32.ss_flags;
-               ss.ss_size = ss32.ss_size;
-
-               ssp = &ss;
-       }
-
-       if (uoss32)
-               ossp = &oss;
-
-       KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp);
-
-       if (!ret && uoss32) {
-               oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp;
-               oss32.ss_flags = oss.ss_flags;
-               oss32.ss_size = oss.ss_size;
-               if (copy_to_user(uoss32, &oss32, sizeof *uoss32))
-                       return -EFAULT;
-       }
-
-       return ret;
-}
-
 long
 restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf,
                struct pt_regs *regs)
@@ -506,22 +376,3 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
        }
        return err;
 }
-
-asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig,
-       struct compat_siginfo __user *uinfo)
-{
-       siginfo_t info;
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-
-       /* Not even root can pretend to send signals from the kernel.
-          Nor can they impersonate a kill(), which adds source info.  */
-       if (info.si_code >= 0)
-               return -EPERM;
-       info.si_signo = sig;
-
-       /* POSIX.1b doesn't mention process groups.  */
-       return kill_proc_info(sig, &info, pid);
-}
-
index 08a88b5349a277d4ed97d522526abb4ef4ed8096..72ab41a51f3297de6465b18bbaeac05a8d532303 100644 (file)
 
 #include <linux/compat.h>
 
-typedef compat_uptr_t compat_sighandler_t;
-
-typedef struct compat_sigaltstack {
-        compat_uptr_t ss_sp;
-        compat_int_t ss_flags;
-        compat_size_t ss_size;
-} compat_stack_t;
-
-/* Most things should be clean enough to redefine this at will, if care
-   is taken to make libc match.  */
-
-struct compat_sigaction {
-        compat_sighandler_t sa_handler;
-        compat_uint_t sa_flags;
-        compat_sigset_t sa_mask;               /* mask last for extensibility */
-};
-
 /* 32-bit ucontext as seen from an 64-bit kernel */
 struct compat_ucontext {
         compat_uint_t uc_flags;
@@ -51,10 +34,6 @@ struct compat_ucontext {
 
 /* ELF32 signal handling */
 
-struct k_sigaction32 {
-       struct compat_sigaction sa;
-};
-
 int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from);
 int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from);
 
@@ -102,8 +81,6 @@ struct compat_rt_sigframe {
 
 void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
 void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
-int do_sigaltstack32 (const compat_stack_t __user *uss32, 
-               compat_stack_t __user *uoss32, unsigned long sp);
 long restore_sigcontext32(struct compat_sigcontext __user *sc, 
                struct compat_regfile __user *rf,
                struct pt_regs *regs);
index 06c2090cfaba340fa5f99e1d7e2fc10188a7ff3b..60dd470f39f88d505c694119c4a96a87812f8b17 100644 (file)
     set_fs (old_fs); \
 }
 
-#ifdef CONFIG_COMPAT
-
-typedef __u32 __sighandler_t32;
-
-struct sigaction32 {
-       __sighandler_t32 sa_handler;
-       unsigned int sa_flags;
-       compat_sigset_t sa_mask;                /* mask last for extensibility */
-};
-
-#endif
-
 #endif
index 129fd472c471c9399832c39e66651dfc3d96a751..fc9cab1cc2df10453b584697cce9b5ee2b242a2c 100644 (file)
        ENTRY_SAME(mremap)
        ENTRY_SAME(setresuid)
        ENTRY_SAME(getresuid)           /* 165 */
-       ENTRY_DIFF(sigaltstack_wrapper)
+       ENTRY_COMP(sigaltstack)
        ENTRY_SAME(ni_syscall)          /* query_module */
        ENTRY_SAME(poll)
        /* structs contain pointers and an in_addr... */
        ENTRY_SAME(prctl)
        /* signals need a careful review */
        ENTRY_SAME(rt_sigreturn_wrapper)
-       ENTRY_DIFF(rt_sigaction)
-       ENTRY_DIFF(rt_sigprocmask)      /* 175 */
-       ENTRY_DIFF(rt_sigpending)
+       ENTRY_COMP(rt_sigaction)
+       ENTRY_COMP(rt_sigprocmask)      /* 175 */
+       ENTRY_COMP(rt_sigpending)
        ENTRY_COMP(rt_sigtimedwait)
        /* even though the struct siginfo_t is different, it appears like
         * all the paths use values which should be same wide and narrow.
index a5255f242be91424ab745bf039e6ae87a3b779af..5c7470689a10eebe7626cefc89cb2e6ece3deedc 100644 (file)
@@ -143,6 +143,8 @@ config PPC
        select MODULES_USE_ELF_RELA
        select CLONE_BACKWARDS
        select ARCH_USE_BUILTIN_BSWAP
+       select OLD_SIGSUSPEND
+       select OLD_SIGACTION if PPC32
 
 config EARLY_PRINTK
        bool
@@ -153,6 +155,7 @@ config COMPAT
        default y if PPC64
        select COMPAT_BINFMT_ELF
        select ARCH_WANT_OLD_COMPAT_IPC
+       select COMPAT_OLD_SIGACTION
 
 config SYSVIPC_COMPAT
        bool
index a101637725a2485ba8651cae932f25d68440af78..fbe66c463891417b846864077732eda44eed68f6 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _ASM_POWERPC_SIGNAL_H
 #define _ASM_POWERPC_SIGNAL_H
 
+#define __ARCH_HAS_SA_RESTORER
 #include <uapi/asm/signal.h>
 
 #endif /* _ASM_POWERPC_SIGNAL_H */
index b5308d3e6d391fc36568f95e2a64aeec865e3a68..23be8f1e7e64bf5b71ee1489b11c22dd9f926a78 100644 (file)
@@ -5,11 +5,8 @@
 #include <linux/compiler.h>
 #include <linux/linkage.h>
 #include <linux/types.h>
-#include <asm/signal.h>
 
-struct pt_regs;
 struct rtas_args;
-struct sigaction;
 
 asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
                unsigned long prot, unsigned long flags,
@@ -17,20 +14,8 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
 asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,
                unsigned long prot, unsigned long flags,
                unsigned long fd, unsigned long pgoff);
-asmlinkage long sys_pipe(int __user *fildes);
-asmlinkage long sys_pipe2(int __user *fildes, int flags);
-asmlinkage long sys_rt_sigaction(int sig,
-               const struct sigaction __user *act,
-               struct sigaction __user *oact, size_t sigsetsize);
 asmlinkage long ppc64_personality(unsigned long personality);
 asmlinkage int ppc_rtas(struct rtas_args __user *uargs);
-asmlinkage time_t sys64_time(time_t __user * tloc);
-
-asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset,
-               size_t sigsetsize);
-asmlinkage long sys_sigaltstack(const stack_t __user *uss,
-               stack_t __user *uoss, unsigned long r5, unsigned long r6,
-               unsigned long r7, unsigned long r8, struct pt_regs *regs);
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_POWERPC_SYSCALLS_H */
index 97909d3b1d7b0b63f602dacbbcc97c681b35db67..d906f33441c66ccbe6b79171351f091e3747e13b 100644 (file)
@@ -10,8 +10,8 @@ SYSCALL_SPU(read)
 SYSCALL_SPU(write)
 COMPAT_SYS_SPU(open)
 SYSCALL_SPU(close)
-COMPAT_SYS_SPU(waitpid)
-COMPAT_SYS_SPU(creat)
+SYSCALL_SPU(waitpid)
+SYSCALL_SPU(creat)
 SYSCALL_SPU(link)
 SYSCALL_SPU(unlink)
 COMPAT_SYS(execve)
@@ -36,13 +36,13 @@ SYSCALL(pause)
 COMPAT_SYS(utime)
 SYSCALL(ni_syscall)
 SYSCALL(ni_syscall)
-COMPAT_SYS_SPU(access)
-COMPAT_SYS_SPU(nice)
+SYSCALL_SPU(access)
+SYSCALL_SPU(nice)
 SYSCALL(ni_syscall)
 SYSCALL_SPU(sync)
-COMPAT_SYS_SPU(kill)
+SYSCALL_SPU(kill)
 SYSCALL_SPU(rename)
-COMPAT_SYS_SPU(mkdir)
+SYSCALL_SPU(mkdir)
 SYSCALL_SPU(rmdir)
 SYSCALL_SPU(dup)
 SYSCALL_SPU(pipe)
@@ -60,10 +60,10 @@ SYSCALL(ni_syscall)
 COMPAT_SYS_SPU(ioctl)
 COMPAT_SYS_SPU(fcntl)
 SYSCALL(ni_syscall)
-COMPAT_SYS_SPU(setpgid)
+SYSCALL_SPU(setpgid)
 SYSCALL(ni_syscall)
 SYSX(sys_ni_syscall,sys_olduname, sys_olduname)
-COMPAT_SYS_SPU(umask)
+SYSCALL_SPU(umask)
 SYSCALL_SPU(chroot)
 COMPAT_SYS(ustat)
 SYSCALL_SPU(dup2)
@@ -72,23 +72,24 @@ SYSCALL_SPU(getpgrp)
 SYSCALL_SPU(setsid)
 SYS32ONLY(sigaction)
 SYSCALL_SPU(sgetmask)
-COMPAT_SYS_SPU(ssetmask)
+SYSCALL_SPU(ssetmask)
 SYSCALL_SPU(setreuid)
 SYSCALL_SPU(setregid)
+#define compat_sys_sigsuspend sys_sigsuspend
 SYS32ONLY(sigsuspend)
 COMPAT_SYS(sigpending)
-COMPAT_SYS_SPU(sethostname)
+SYSCALL_SPU(sethostname)
 COMPAT_SYS_SPU(setrlimit)
 COMPAT_SYS(old_getrlimit)
 COMPAT_SYS_SPU(getrusage)
 COMPAT_SYS_SPU(gettimeofday)
 COMPAT_SYS_SPU(settimeofday)
-COMPAT_SYS_SPU(getgroups)
-COMPAT_SYS_SPU(setgroups)
+SYSCALL_SPU(getgroups)
+SYSCALL_SPU(setgroups)
 SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select)
 SYSCALL_SPU(symlink)
 OLDSYS(lstat)
-COMPAT_SYS_SPU(readlink)
+SYSCALL_SPU(readlink)
 SYSCALL(uselib)
 SYSCALL(swapon)
 SYSCALL(reboot)
@@ -99,14 +100,14 @@ COMPAT_SYS_SPU(truncate)
 COMPAT_SYS_SPU(ftruncate)
 SYSCALL_SPU(fchmod)
 SYSCALL_SPU(fchown)
-COMPAT_SYS_SPU(getpriority)
-COMPAT_SYS_SPU(setpriority)
+SYSCALL_SPU(getpriority)
+SYSCALL_SPU(setpriority)
 SYSCALL(ni_syscall)
 COMPAT_SYS(statfs)
 COMPAT_SYS(fstatfs)
 SYSCALL(ni_syscall)
 COMPAT_SYS_SPU(socketcall)
-COMPAT_SYS_SPU(syslog)
+SYSCALL_SPU(syslog)
 COMPAT_SYS_SPU(setitimer)
 COMPAT_SYS_SPU(getitimer)
 COMPAT_SYS_SPU(newstat)
@@ -124,7 +125,7 @@ COMPAT_SYS(ipc)
 SYSCALL_SPU(fsync)
 SYS32ONLY(sigreturn)
 PPC_SYS(clone)
-COMPAT_SYS_SPU(setdomainname)
+SYSCALL_SPU(setdomainname)
 SYSCALL_SPU(newuname)
 SYSCALL(ni_syscall)
 COMPAT_SYS_SPU(adjtimex)
@@ -135,10 +136,10 @@ SYSCALL(init_module)
 SYSCALL(delete_module)
 SYSCALL(ni_syscall)
 SYSCALL(quotactl)
-COMPAT_SYS_SPU(getpgid)
+SYSCALL_SPU(getpgid)
 SYSCALL_SPU(fchdir)
 SYSCALL_SPU(bdflush)
-COMPAT_SYS(sysfs)
+SYSCALL_SPU(sysfs)
 SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality)
 SYSCALL(ni_syscall)
 SYSCALL_SPU(setfsuid)
@@ -150,21 +151,21 @@ SYSCALL_SPU(flock)
 SYSCALL_SPU(msync)
 COMPAT_SYS_SPU(readv)
 COMPAT_SYS_SPU(writev)
-COMPAT_SYS_SPU(getsid)
+SYSCALL_SPU(getsid)
 SYSCALL_SPU(fdatasync)
 COMPAT_SYS(sysctl)
 SYSCALL_SPU(mlock)
 SYSCALL_SPU(munlock)
 SYSCALL_SPU(mlockall)
 SYSCALL_SPU(munlockall)
-COMPAT_SYS_SPU(sched_setparam)
-COMPAT_SYS_SPU(sched_getparam)
-COMPAT_SYS_SPU(sched_setscheduler)
-COMPAT_SYS_SPU(sched_getscheduler)
+SYSCALL_SPU(sched_setparam)
+SYSCALL_SPU(sched_getparam)
+SYSCALL_SPU(sched_setscheduler)
+SYSCALL_SPU(sched_getscheduler)
 SYSCALL_SPU(sched_yield)
-COMPAT_SYS_SPU(sched_get_priority_max)
-COMPAT_SYS_SPU(sched_get_priority_min)
-SYSX_SPU(sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval_wrapper,sys_sched_rr_get_interval)
+SYSCALL_SPU(sched_get_priority_max)
+SYSCALL_SPU(sched_get_priority_min)
+COMPAT_SYS_SPU(sched_rr_get_interval)
 COMPAT_SYS_SPU(nanosleep)
 SYSCALL_SPU(mremap)
 SYSCALL_SPU(setresuid)
@@ -174,7 +175,7 @@ SYSCALL_SPU(poll)
 SYSCALL(ni_syscall)
 SYSCALL_SPU(setresgid)
 SYSCALL_SPU(getresgid)
-COMPAT_SYS_SPU(prctl)
+SYSCALL_SPU(prctl)
 COMPAT_SYS(rt_sigreturn)
 COMPAT_SYS(rt_sigaction)
 COMPAT_SYS(rt_sigprocmask)
@@ -253,7 +254,7 @@ COMPAT_SYS_SPU(clock_gettime)
 COMPAT_SYS_SPU(clock_getres)
 COMPAT_SYS_SPU(clock_nanosleep)
 SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
-COMPAT_SYS_SPU(tgkill)
+SYSCALL_SPU(tgkill)
 COMPAT_SYS_SPU(utimes)
 COMPAT_SYS_SPU(statfs64)
 COMPAT_SYS_SPU(fstatfs64)
@@ -276,8 +277,8 @@ COMPAT_SYS(add_key)
 COMPAT_SYS(request_key)
 COMPAT_SYS(keyctl)
 COMPAT_SYS(waitid)
-COMPAT_SYS(ioprio_set)
-COMPAT_SYS(ioprio_get)
+SYSCALL(ioprio_set)
+SYSCALL(ioprio_get)
 SYSCALL(inotify_init)
 SYSCALL(inotify_add_watch)
 SYSCALL(inotify_rm_watch)
index 1d4864a40e3560fa4a61f2b7f5d22eb5607dcdc1..f25b5c45c4359632d2b5259438173f493bfb6810 100644 (file)
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #ifdef CONFIG_PPC32
 #define __ARCH_WANT_OLD_STAT
 #endif
 #ifdef CONFIG_PPC64
 #define __ARCH_WANT_COMPAT_SYS_TIME
-#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_NEWFSTATAT
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
-#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
 #endif
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
index e079fb39d5bcfc3952301b0f78b700b3d1988bbf..6c69ee94fd8d1d0bc4e7ab716ee46e45733de421 100644 (file)
@@ -90,6 +90,7 @@ typedef struct {
 
 #include <asm-generic/signal-defs.h>
 
+#ifndef __KERNEL__
 struct old_sigaction {
        __sighandler_t sa_handler;
        old_sigset_t sa_mask;
@@ -103,10 +104,7 @@ struct sigaction {
        __sigrestore_t sa_restorer;
        sigset_t sa_mask;               /* mask last for extensibility */
 };
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#endif
 
 typedef struct sigaltstack {
        void __user *ss_sp;
index 02fb0ee26093f53c07c494c3a1766bb267dca0de..a27c914d5802b30d41087b98e389b2836d542cdd 100644 (file)
 
 /* These are here to support 32-bit syscalls on a 64-bit kernel. */
 
-#define __old_sigaction32      old_sigaction32
-
-struct __old_sigaction32 {
-       compat_uptr_t           sa_handler;
-       compat_old_sigset_t     sa_mask;
-       unsigned int            sa_flags;
-       compat_uptr_t           sa_restorer;     /* not used by Linux/SPARC yet */
-};
-
-
-
-struct sigaction32 {
-       compat_uptr_t  sa_handler;      /* Really a pointer, but need to deal with 32 bits */
-       unsigned int sa_flags;
-       compat_uptr_t sa_restorer;      /* Another 32 bit pointer */
-       compat_sigset_t sa_mask;                /* A 32 bit mask */
-};
-
-typedef struct sigaltstack_32 {
-       unsigned int ss_sp;
-       int ss_flags;
-       compat_size_t ss_size;
-} stack_32_t;
-
 struct pt_regs32 {
        unsigned int gpr[32];
        unsigned int nip;
@@ -75,7 +51,7 @@ struct mcontext32 {
 struct ucontext32 { 
        unsigned int            uc_flags;
        unsigned int            uc_link;
-       stack_32_t              uc_stack;
+       compat_stack_t          uc_stack;
        int                     uc_pad[7];
        compat_uptr_t           uc_regs;        /* points to uc_mcontext field */
        compat_sigset_t         uc_sigmask;     /* mask last for extensibility */
index 3003d890e9ef525f0c85fbb62ede18390ba82702..cf12eae02de5a694e2ba0e5298bfd8f082b688f9 100644 (file)
@@ -170,10 +170,3 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
                tracehook_notify_resume(regs);
        }
 }
-
-long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-               unsigned long r5, unsigned long r6, unsigned long r7,
-               unsigned long r8, struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->gpr[1]);
-}
index e4a88d340de687fdedc80638e836d01e6791439e..3acb28e245b411d65ebcc8c68bfeec802e7f4737 100644 (file)
 #undef DEBUG_SIG
 
 #ifdef CONFIG_PPC64
-#define sys_sigsuspend compat_sys_sigsuspend
-#define sys_rt_sigsuspend      compat_sys_rt_sigsuspend
 #define sys_rt_sigreturn       compat_sys_rt_sigreturn
-#define sys_sigaction  compat_sys_sigaction
 #define sys_swapcontext        compat_sys_swapcontext
 #define sys_sigreturn  compat_sys_sigreturn
 
@@ -69,6 +66,8 @@
 #define mcontext       mcontext32
 #define ucontext       ucontext32
 
+#define __save_altstack __compat_save_altstack
+
 /*
  * Userspace code may pass a ucontext which doesn't include VSX added
  * at the end.  We need to check for this case.
@@ -131,23 +130,6 @@ static inline int get_sigset_t(sigset_t *set,
        return 0;
 }
 
-static inline int get_old_sigaction(struct k_sigaction *new_ka,
-               struct old_sigaction __user *act)
-{
-       compat_old_sigset_t mask;
-       compat_uptr_t handler, restorer;
-
-       if (get_user(handler, &act->sa_handler) ||
-           __get_user(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 = compat_ptr(handler);
-       new_ka->sa.sa_restorer = compat_ptr(restorer);
-       siginitset(&new_ka->sa.sa_mask, mask);
-       return 0;
-}
-
 #define to_user_ptr(p)         ptr_to_compat(p)
 #define from_user_ptr(p)       compat_ptr(p)
 
@@ -197,21 +179,6 @@ static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
        return copy_from_user(set, uset, sizeof(*uset));
 }
 
-static inline int get_old_sigaction(struct k_sigaction *new_ka,
-               struct old_sigaction __user *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);
-       return 0;
-}
-
 #define to_user_ptr(p)         ((unsigned long)(p))
 #define from_user_ptr(p)       ((void __user *)(p))
 
@@ -235,50 +202,8 @@ static inline int restore_general_regs(struct pt_regs *regs,
                return -EFAULT;
        return 0;
 }
-
-#endif /* CONFIG_PPC64 */
-
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-long sys_sigsuspend(old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-long sys_sigaction(int sig, struct old_sigaction __user *act,
-               struct old_sigaction __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-#ifdef CONFIG_PPC64
-       if (sig < 0)
-               sig = -sig;
 #endif
 
-       if (act) {
-               if (get_old_sigaction(&new_ka, act))
-                       return -EFAULT;
-       }
-
-       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(to_user_ptr(old_ka.sa.sa_handler),
-                           &oact->sa_handler) ||
-                   __put_user(to_user_ptr(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;
-}
-
 /*
  * When we have signals to deliver, we set up on the
  * user stack, going down from the original stack pointer:
@@ -951,89 +876,6 @@ static long restore_tm_user_regs(struct pt_regs *regs,
 #endif
 
 #ifdef CONFIG_PPC64
-long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act,
-               struct sigaction32 __user *oact, size_t sigsetsize)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if (act) {
-               compat_uptr_t handler;
-
-               ret = get_user(handler, &act->sa_handler);
-               new_ka.sa.sa_handler = compat_ptr(handler);
-               ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask);
-               ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-               if (ret)
-                       return -EFAULT;
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-       if (!ret && oact) {
-               ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler);
-               ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
-               ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-       }
-       return ret;
-}
-
-/*
- * Note: it is necessary to treat how as an unsigned int, with the
- * corresponding cast to a signed int to insure that the proper
- * conversion (sign extension) between the register representation
- * of a signed int (msr in 32-bit mode) and the register representation
- * of a signed int (msr in 64-bit mode) is performed.
- */
-long compat_sys_rt_sigprocmask(u32 how, compat_sigset_t __user *set,
-               compat_sigset_t __user *oset, size_t sigsetsize)
-{
-       sigset_t s;
-       sigset_t __user *up;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (set) {
-               if (get_sigset_t(&s, set))
-                       return -EFAULT;
-       }
-
-       set_fs(KERNEL_DS);
-       /* This is valid because of the set_fs() */
-       up = (sigset_t __user *) &s;
-       ret = sys_rt_sigprocmask((int)how, set ? up : NULL, oset ? up : NULL,
-                                sigsetsize);
-       set_fs(old_fs);
-       if (ret)
-               return ret;
-       if (oset) {
-               if (put_sigset_t(oset, &s))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-long compat_sys_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize)
-{
-       sigset_t s;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       /* The __user pointer cast is valid because of the set_fs() */
-       ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
-       set_fs(old_fs);
-       if (!ret) {
-               if (put_sigset_t(set, &s))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-
 int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s)
 {
        int err;
@@ -1102,79 +944,6 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
 
        return 0;
 }
-
-/*
- * Note: it is necessary to treat pid and sig as unsigned ints, with the
- * corresponding cast to a signed int to insure that the proper conversion
- * (sign extension) between the register representation of a signed int
- * (msr in 32-bit mode) and the register representation of a signed int
- * (msr in 64-bit mode) is performed.
- */
-long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       ret = copy_siginfo_from_user32(&info, uinfo);
-       if (unlikely(ret))
-               return ret;
-
-       set_fs (KERNEL_DS);
-       /* The __user pointer cast is valid becasuse of the set_fs() */
-       ret = sys_rt_sigqueueinfo((int)pid, (int)sig, (siginfo_t __user *) &info);
-       set_fs (old_fs);
-       return ret;
-}
-/*
- *  Start Alternate signal stack support
- *
- *  System Calls
- *       sigaltatck               compat_sys_sigaltstack
- */
-
-int compat_sys_sigaltstack(u32 __new, u32 __old, int r5,
-                     int r6, int r7, int r8, struct pt_regs *regs)
-{
-       stack_32_t __user * newstack = compat_ptr(__new);
-       stack_32_t __user * oldstack = compat_ptr(__old);
-       stack_t uss, uoss;
-       int ret;
-       mm_segment_t old_fs;
-       unsigned long sp;
-       compat_uptr_t ss_sp;
-
-       /*
-        * set sp to the user stack on entry to the system call
-        * the system call router sets R9 to the saved registers
-        */
-       sp = regs->gpr[1];
-
-       /* Put new stack info in local 64 bit stack struct */
-       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,
-               sp);
-       set_fs(old_fs);
-       /* Copy the stack information to the user output buffer */
-       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;
-}
 #endif /* CONFIG_PPC64 */
 
 /*
@@ -1202,10 +971,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
        /* Put the siginfo & fill in most of the ucontext */
        if (copy_siginfo_to_user(&rt_sf->info, info)
            || __put_user(0, &rt_sf->uc.uc_flags)
-           || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp)
-           || __put_user(sas_ss_flags(regs->gpr[1]),
-                         &rt_sf->uc.uc_stack.ss_flags)
-           || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size)
+           || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1])
            || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
                    &rt_sf->uc.uc_regs)
            || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset))
@@ -1494,14 +1260,11 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
         * change it.  -- paulus
         */
 #ifdef CONFIG_PPC64
-       /*
-        * We use the compat_sys_ version that does the 32/64 bits conversion
-        * and takes userland pointer directly. What about error checking ?
-        * nobody does any...
-        */
-       compat_sys_sigaltstack((u32)(u64)&rt_sf->uc.uc_stack, 0, 0, 0, 0, 0, regs);
+       if (compat_restore_altstack(&rt_sf->uc.uc_stack))
+               goto bad;
 #else
-       do_sigaltstack(&rt_sf->uc.uc_stack, NULL, regs->gpr[1]);
+       if (restore_altstack(&rt_sf->uc.uc_stack))
+               goto bad;
 #endif
        set_thread_flag(TIF_RESTOREALL);
        return 0;
@@ -1617,7 +1380,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx,
         * always done it up until now so it is probably better not to
         * change it.  -- paulus
         */
-       do_sigaltstack(&ctx->uc_stack, NULL, regs->gpr[1]);
+       restore_altstack(&ctx->uc_stack);
 
        set_thread_flag(TIF_RESTOREALL);
  out:
index 7a76ee48a952db2b1409c397f7c0e0acfc9f2edd..995f8543cb57ed869b603fee7c5d178c1d1af066 100644 (file)
@@ -676,10 +676,8 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
        if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext))
                goto badframe;
 
-       /* do_sigaltstack expects a __user pointer and won't modify
-        * what's in there anyway
-        */
-       do_sigaltstack(&uc->uc_stack, NULL, regs->gpr[1]);
+       if (restore_altstack(&uc->uc_stack))
+               goto badframe;
 
        set_thread_flag(TIF_RESTOREALL);
        return 0;
@@ -723,10 +721,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
 
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
-       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->gpr[1]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]);
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
        if (MSR_TM_ACTIVE(regs->msr)) {
                /* The ucontext_t passed to userland points to the second
index 8a93778ed9f5ac86178d0e8a397acefc8a55a729..dbc44ba5b078b23bbcc84dbf0fdadf01f76c8b40 100644 (file)
@@ -61,16 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
        return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x));
 }
 
-/* Note: it is necessary to treat option as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sysfs(u32 option, u32 arg1, u32 arg2)
-{
-       return sys_sysfs((int)option, arg1, arg2);
-}
-
 #ifdef CONFIG_SYSVIPC
 long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr,
               u32 fifth)
@@ -156,125 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
                            (off_t __user *)offset, count);
 }
 
-/* Note: it is necessary to treat option as an unsigned int, 
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_prctl(u32 option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
-{
-       return sys_prctl((int)option,
-                        (unsigned long) arg2,
-                        (unsigned long) arg3,
-                        (unsigned long) arg4,
-                        (unsigned long) arg5);
-}
-
-/* Note: it is necessary to treat pid as an unsigned int, 
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_rr_get_interval_wrapper(u32 pid,
-                                                        struct compat_timespec __user *interval)
-{
-       return compat_sys_sched_rr_get_interval((int)pid, interval);
-}
-
-/* Note: it is necessary to treat mode as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_access(const char __user * filename, u32 mode)
-{
-       return sys_access(filename, (int)mode);
-}
-
-
-/* Note: it is necessary to treat mode as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_creat(const char __user * pathname, u32 mode)
-{
-       return sys_creat(pathname, (int)mode);
-}
-
-
-/* Note: it is necessary to treat pid and options as unsigned ints,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_waitpid(u32 pid, unsigned int __user * stat_addr, u32 options)
-{
-       return sys_waitpid((int)pid, stat_addr, (int)options);
-}
-
-
-/* Note: it is necessary to treat gidsetsize as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_getgroups(u32 gidsetsize, gid_t __user *grouplist)
-{
-       return sys_getgroups((int)gidsetsize, grouplist);
-}
-
-
-/* Note: it is necessary to treat pid as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_getpgid(u32 pid)
-{
-       return sys_getpgid((int)pid);
-}
-
-
-
-/* Note: it is necessary to treat pid as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_getsid(u32 pid)
-{
-       return sys_getsid((int)pid);
-}
-
-
-/* Note: it is necessary to treat pid and sig as unsigned ints,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_kill(u32 pid, u32 sig)
-{
-       return sys_kill((int)pid, (int)sig);
-}
-
-
-/* Note: it is necessary to treat mode as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_mkdir(const char __user * pathname, u32 mode)
-{
-       return sys_mkdir(pathname, (int)mode);
-}
-
-long compat_sys_nice(u32 increment)
-{
-       /* sign extend increment */
-       return sys_nice((int)increment);
-}
-
 off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin)
 {
        /* sign extend n */
@@ -293,172 +164,6 @@ long compat_sys_ftruncate(int fd, u32 length)
        return sys_ftruncate(fd, (int)length);
 }
 
-/* Note: it is necessary to treat bufsiz as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_readlink(const char __user * path, char __user * buf, u32 bufsiz)
-{
-       return sys_readlink(path, buf, (int)bufsiz);
-}
-
-/* Note: it is necessary to treat option as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_get_priority_max(u32 policy)
-{
-       return sys_sched_get_priority_max((int)policy);
-}
-
-
-/* Note: it is necessary to treat policy as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_get_priority_min(u32 policy)
-{
-       return sys_sched_get_priority_min((int)policy);
-}
-
-
-/* Note: it is necessary to treat pid as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_getparam(u32 pid, struct sched_param __user *param)
-{
-       return sys_sched_getparam((int)pid, param);
-}
-
-
-/* Note: it is necessary to treat pid as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_getscheduler(u32 pid)
-{
-       return sys_sched_getscheduler((int)pid);
-}
-
-
-/* Note: it is necessary to treat pid as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_setparam(u32 pid, struct sched_param __user *param)
-{
-       return sys_sched_setparam((int)pid, param);
-}
-
-
-/* Note: it is necessary to treat pid and policy as unsigned ints,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_sched_setscheduler(u32 pid, u32 policy, struct sched_param __user *param)
-{
-       return sys_sched_setscheduler((int)pid, (int)policy, param);
-}
-
-
-/* Note: it is necessary to treat len as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_setdomainname(char __user *name, u32 len)
-{
-       return sys_setdomainname(name, (int)len);
-}
-
-
-/* Note: it is necessary to treat gidsetsize as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_setgroups(u32 gidsetsize, gid_t __user *grouplist)
-{
-       return sys_setgroups((int)gidsetsize, grouplist);
-}
-
-
-asmlinkage long compat_sys_sethostname(char __user *name, u32 len)
-{
-       /* sign extend len */
-       return sys_sethostname(name, (int)len);
-}
-
-
-/* Note: it is necessary to treat pid and pgid as unsigned ints,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_setpgid(u32 pid, u32 pgid)
-{
-       return sys_setpgid((int)pid, (int)pgid);
-}
-
-long compat_sys_getpriority(u32 which, u32 who)
-{
-       /* sign extend which and who */
-       return sys_getpriority((int)which, (int)who);
-}
-
-long compat_sys_setpriority(u32 which, u32 who, u32 niceval)
-{
-       /* sign extend which, who and niceval */
-       return sys_setpriority((int)which, (int)who, (int)niceval);
-}
-
-long compat_sys_ioprio_get(u32 which, u32 who)
-{
-       /* sign extend which and who */
-       return sys_ioprio_get((int)which, (int)who);
-}
-
-long compat_sys_ioprio_set(u32 which, u32 who, u32 ioprio)
-{
-       /* sign extend which, who and ioprio */
-       return sys_ioprio_set((int)which, (int)who, (int)ioprio);
-}
-
-/* Note: it is necessary to treat newmask as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_ssetmask(u32 newmask)
-{
-       return sys_ssetmask((int) newmask);
-}
-
-asmlinkage long compat_sys_syslog(u32 type, char __user * buf, u32 len)
-{
-       /* sign extend len */
-       return sys_syslog(type, buf, (int)len);
-}
-
-
-/* Note: it is necessary to treat mask as an unsigned int,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long compat_sys_umask(u32 mask)
-{
-       return sys_umask((int)mask);
-}
-
 unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
                          unsigned long prot, unsigned long flags,
                          unsigned long fd, unsigned long pgoff)
@@ -467,12 +172,6 @@ unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
        return sys_mmap(addr, len, prot, flags, fd, pgoff << 12);
 }
 
-long compat_sys_tgkill(u32 tgid, u32 pid, int sig)
-{
-       /* sign extend tgid, pid */
-       return sys_tgkill((int)tgid, (int)pid, sig);
-}
-
 /* 
  * long long munging:
  * The 32 bit ABI passes long longs in an odd even register pair.
index b220e152aefa23ca6b691f0bf7d441ff998a0a31..f09ae7b0b4c5638958a2a051a25f0455074f411a 100644 (file)
@@ -137,6 +137,8 @@ config S390
        select INIT_ALL_POSSIBLE
        select KTIME_SCALAR if 32BIT
        select MODULES_USE_ELF_RELA
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
        select SYSCTL_EXCEPTION_TRACE
        select USE_GENERIC_SMP_HELPERS if SMP
        select VIRT_CPU_ACCOUNTING
@@ -249,6 +251,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 db7ddfaf5b795facb665ebc22f91c0f72b7a5ba0..abf9e57359431da40b5412f2099d932e3a1b3e4b 100644 (file)
@@ -21,22 +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);
-};
-
-struct sigaction {
-        __sighandler_t sa_handler;
-        unsigned long sa_flags;
-        void (*sa_restorer)(void);
-        sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-        struct sigaction sa;
-};
-
+#define __ARCH_HAS_SA_RESTORER
 #endif
index 636530872516a64c8f30e42cf9a0bab4cee511bf..a6667a952969efc6cc3ba901a919fa554ab70be3 100644 (file)
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 # ifndef CONFIG_64BIT
 #   define __ARCH_WANT_STAT64
 #   define __ARCH_WANT_SYS_TIME
 # endif
 # ifdef CONFIG_COMPAT
 #   define __ARCH_WANT_COMPAT_SYS_TIME
-#   define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 # endif
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
index 65cca95843e112d170c40535a95030a087614adb..19f26de27fae8e6fe808e798c565048e510c0d88 100644 (file)
@@ -352,86 +352,6 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned
                return sys_ftruncate(fd, (high << 32) | low);
 }
 
-asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid,
-                               struct compat_timespec __user *interval)
-{
-       struct timespec t;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       
-       set_fs (KERNEL_DS);
-       ret = sys_sched_rr_get_interval(pid,
-                                       (struct timespec __force __user *) &t);
-       set_fs (old_fs);
-       if (put_compat_timespec(&t, interval))
-               return -EFAULT;
-       return ret;
-}
-
-asmlinkage long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
-                       compat_sigset_t __user *oset, size_t sigsetsize)
-{
-       sigset_t s;
-       compat_sigset_t s32;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       
-       if (set) {
-               if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-               s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
-       }
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigprocmask(how,
-                                set ? (sigset_t __force __user *) &s : NULL,
-                                oset ? (sigset_t __force __user *) &s : NULL,
-                                sigsetsize);
-       set_fs (old_fs);
-       if (ret) return ret;
-       if (oset) {
-               s32.sig[1] = (s.sig[0] >> 32);
-               s32.sig[0] = s.sig[0];
-               if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set,
-                               size_t sigsetsize)
-{
-       sigset_t s;
-       compat_sigset_t s32;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-               
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigpending((sigset_t __force __user *) &s, sigsetsize);
-       set_fs (old_fs);
-       if (!ret) {
-               s32.sig[1] = (s.sig[0] >> 32);
-               s32.sig[0] = s.sig[0];
-               if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-asmlinkage long
-sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __force __user *) &info);
-       set_fs (old_fs);
-       return ret;
-}
-
 asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
                                size_t count, u32 poshi, u32 poslo)
 {
index d4d0239970ac1f9b3953a38f62fc6a2f6f2b23b7..00d92a5a6f6c05377968ebc5cd0aace6d3305c45 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
 {
@@ -68,24 +61,12 @@ struct sigcontext32
 };
 
 /* asm/signal.h */
-struct sigaction32 {
-       __u32           sa_handler;             /* pointer */
-       __u32           sa_flags;
-        __u32          sa_restorer;            /* pointer */
-       compat_sigset_t sa_mask;        /* mask last for extensibility */
-};
-
-typedef struct {
-       __u32                   ss_sp;          /* pointer */
-       int                     ss_flags;
-       compat_size_t           ss_size;
-} stack_t32;
 
 /* asm/ucontext.h */
 struct ucontext32 {
        __u32                   uc_flags;
        __u32                   uc_link;        /* pointer */   
-       stack_t32               uc_stack;
+       compat_stack_t          uc_stack;
        _sigregs32              uc_mcontext;
        compat_sigset_t         uc_sigmask;     /* mask last for extensibility */
 };
@@ -93,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);
@@ -119,12 +98,6 @@ long sys32_ipc(u32 call, int first, int second, int third, u32 ptr);
 long sys32_truncate64(const char __user * path, unsigned long high,
                      unsigned long low);
 long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low);
-long sys32_sched_rr_get_interval(compat_pid_t pid,
-                                struct compat_timespec __user *interval);
-long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
-                         compat_sigset_t __user *oset, size_t sigsetsize);
-long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
-long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
 long sys32_init_module(void __user *umod, unsigned long len,
                       const char __user *uargs);
 long sys32_delete_module(const char __user *name_user, unsigned int flags);
@@ -149,9 +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);
-long sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
-                       struct sigaction32 __user *oact, size_t sigsetsize);
-long sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss);
 #endif /* _ASM_S390X_S390_H */
index 593fcc9253fc433650e54fbc8f8f829f5d961e98..3e71194c19027913599219c90d60a8e7b9e917b5 100644 (file)
@@ -157,122 +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;
-}
-
-asmlinkage long
-sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
-          struct sigaction32 __user *oact,  size_t sigsetsize)
-{
-       struct k_sigaction new_ka, old_ka;
-       unsigned long sa_handler;
-       int ret;
-       compat_sigset_t set32;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if (act) {
-               ret = get_user(sa_handler, &act->sa_handler);
-               ret |= __copy_from_user(&set32, &act->sa_mask,
-                                       sizeof(compat_sigset_t));
-               new_ka.sa.sa_mask.sig[0] =
-                       set32.sig[0] | (((long)set32.sig[1]) << 32);
-               ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-               
-               if (ret)
-                       return -EFAULT;
-               new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
-               set32.sig[0] = old_ka.sa.sa_mask.sig[0];
-               ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
-               ret |= __copy_to_user(&oact->sa_mask, &set32,
-                                     sizeof(compat_sigset_t));
-               ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-       }
-
-       return ret;
-}
-
-asmlinkage long
-sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss)
-{
-       struct pt_regs *regs = task_pt_regs(current);
-       stack_t kss, koss;
-       unsigned long ss_sp;
-       int ret, err = 0;
-       mm_segment_t old_fs = get_fs();
-
-       if (uss) {
-               if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
-                       return -EFAULT;
-               err |= __get_user(ss_sp, &uss->ss_sp);
-               err |= __get_user(kss.ss_size, &uss->ss_size);
-               err |= __get_user(kss.ss_flags, &uss->ss_flags);
-               if (err)
-                       return -EFAULT;
-               kss.ss_sp = (void __user *) ss_sp;
-       }
-
-       set_fs (KERNEL_DS);
-       ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL),
-                            (stack_t __force __user *) (uoss ? &koss : NULL),
-                            regs->gprs[15]);
-       set_fs (old_fs);
-
-       if (!ret && uoss) {
-               if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
-                       return -EFAULT;
-               ss_sp = (unsigned long) koss.ss_sp;
-               err |= __put_user(ss_sp, &uoss->ss_sp);
-               err |= __put_user(koss.ss_size, &uoss->ss_size);
-               err |= __put_user(koss.ss_flags, &uoss->ss_flags);
-               if (err)
-                       return -EFAULT;
-       }
-       return ret;
-}
-
 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
 {
        _s390_regs_common32 regs32;
@@ -380,10 +264,6 @@ asmlinkage long sys32_rt_sigreturn(void)
        struct pt_regs *regs = task_pt_regs(current);
        rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
        sigset_t set;
-       stack_t st;
-       __u32 ss_sp;
-       int err;
-       mm_segment_t old_fs = get_fs();
 
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
@@ -394,15 +274,8 @@ asmlinkage long sys32_rt_sigreturn(void)
                goto badframe;
        if (restore_sigregs_gprs_high(regs, frame->gprs_high))
                goto badframe;
-       err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
-       st.ss_sp = compat_ptr(ss_sp);
-       err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
-       err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
-       if (err)
+       if (compat_restore_altstack(&frame->uc.uc_stack))
                goto badframe; 
-       set_fs (KERNEL_DS);
-       do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]);
-       set_fs (old_fs);
        return regs->gprs[2];
 badframe:
        force_sig(SIGSEGV, current);
@@ -530,10 +403,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->gprs[15]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __compat_save_altstack(&frame->uc.uc_stack, regs->gprs[15]);
        err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
        err |= save_sigregs_gprs_high(regs, frame->gprs_high);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
index 9b9a805656b505e803a2bb9bb4da21e9c8f6f59c..c14faf39ae36daafdd1bee5db4f476cc334b78bf 100644 (file)
@@ -24,12 +24,6 @@ ENTRY(sys32_write_wrapper)
        llgfr   %r4,%r4                 # size_t
        jg      sys32_write             # branch to system call
 
-ENTRY(sys32_open_wrapper)
-       llgtr   %r2,%r2                 # const char *
-       lgfr    %r3,%r3                 # int
-       lgfr    %r4,%r4                 # int
-       jg      compat_sys_open         # branch to system call
-
 ENTRY(sys32_close_wrapper)
        llgfr   %r2,%r2                 # unsigned int
        jg      sys_close               # branch to system call
@@ -226,12 +220,6 @@ ENTRY(sys32_dup2_wrapper)
 
 #sys32_setsid_wrapper                  # void
 
-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
-
 ENTRY(sys32_setreuid16_wrapper)
        llgfr   %r2,%r2                 # __kernel_old_uid_emu31_t
        llgfr   %r3,%r3                 # __kernel_old_uid_emu31_t
@@ -396,17 +384,6 @@ ENTRY(sys32_syslog_wrapper)
        lgfr    %r4,%r4                 # int
        jg      sys_syslog              # branch to system call
 
-ENTRY(compat_sys_setitimer_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct itimerval_emu31 *
-       llgtr   %r4,%r4                 # struct itimerval_emu31 *
-       jg      compat_sys_setitimer    # branch to system call
-
-ENTRY(compat_sys_getitimer_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct itimerval_emu31 *
-       jg      compat_sys_getitimer    # branch to system call
-
 ENTRY(compat_sys_newstat_wrapper)
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # struct stat_emu31 *
@@ -424,13 +401,6 @@ ENTRY(compat_sys_newfstat_wrapper)
 
 #sys32_vhangup_wrapper                 # void
 
-ENTRY(compat_sys_wait4_wrapper)
-       lgfr    %r2,%r2                 # pid_t
-       llgtr   %r3,%r3                 # unsigned int *
-       lgfr    %r4,%r4                 # int
-       llgtr   %r5,%r5                 # struct rusage *
-       jg      compat_sys_wait4        # branch to system call
-
 ENTRY(sys32_swapoff_wrapper)
        llgtr   %r2,%r2                 # const char *
        jg      sys_swapoff             # branch to system call
@@ -474,12 +444,6 @@ ENTRY(sys32_mprotect_wrapper)
        llgfr   %r4,%r4                 # unsigned long
        jg      sys_mprotect            # branch to system call
 
-ENTRY(compat_sys_sigprocmask_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # compat_old_sigset_t *
-       llgtr   %r4,%r4                 # compat_old_sigset_t *
-       jg      compat_sys_sigprocmask          # branch to system call
-
 ENTRY(sys_init_module_wrapper)
        llgtr   %r2,%r2                 # void *
        llgfr   %r3,%r3                 # unsigned long
@@ -628,11 +592,6 @@ ENTRY(sys32_sched_get_priority_min_wrapper)
        lgfr    %r2,%r2                 # int
        jg      sys_sched_get_priority_min      # branch to system call
 
-ENTRY(sys32_sched_rr_get_interval_wrapper)
-       lgfr    %r2,%r2                 # pid_t
-       llgtr   %r3,%r3                 # struct compat_timespec *
-       jg      sys32_sched_rr_get_interval     # branch to system call
-
 ENTRY(compat_sys_nanosleep_wrapper)
        llgtr   %r2,%r2                 # struct compat_timespec *
        llgtr   %r3,%r3                 # struct compat_timespec *
@@ -686,43 +645,6 @@ ENTRY(sys32_prctl_wrapper)
 
 #sys32_rt_sigreturn_wrapper            # done in rt_sigreturn_glue
 
-ENTRY(sys32_rt_sigaction_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # const struct sigaction_emu31 *
-       llgtr   %r4,%r4                 # const struct sigaction_emu31 *
-       llgfr   %r5,%r5                 # size_t
-       jg      sys32_rt_sigaction      # branch to system call
-
-ENTRY(sys32_rt_sigprocmask_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # old_sigset_emu31 *
-       llgtr   %r4,%r4                 # old_sigset_emu31 *
-       llgfr   %r5,%r5                 # size_t
-       jg      sys32_rt_sigprocmask    # branch to system call
-
-ENTRY(sys32_rt_sigpending_wrapper)
-       llgtr   %r2,%r2                 # sigset_emu31 *
-       llgfr   %r3,%r3                 # size_t
-       jg      sys32_rt_sigpending     # branch to system call
-
-ENTRY(compat_sys_rt_sigtimedwait_wrapper)
-       llgtr   %r2,%r2                 # const sigset_emu31_t *
-       llgtr   %r3,%r3                 # siginfo_emu31_t *
-       llgtr   %r4,%r4                 # const struct compat_timespec *
-       llgfr   %r5,%r5                 # size_t
-       jg      compat_sys_rt_sigtimedwait      # branch to system call
-
-ENTRY(sys32_rt_sigqueueinfo_wrapper)
-       lgfr    %r2,%r2                 # int
-       lgfr    %r3,%r3                 # int
-       llgtr   %r4,%r4                 # siginfo_emu31_t *
-       jg      sys32_rt_sigqueueinfo   # branch to system call
-
-ENTRY(compat_sys_rt_sigsuspend_wrapper)
-       llgtr   %r2,%r2                 # compat_sigset_t *
-       llgfr   %r3,%r3                 # compat_size_t
-       jg      compat_sys_rt_sigsuspend
-
 ENTRY(sys32_pread64_wrapper)
        llgfr   %r2,%r2                 # unsigned int
        llgtr   %r3,%r3                 # char *
@@ -760,11 +682,6 @@ ENTRY(sys32_capset_wrapper)
        llgtr   %r3,%r3                 # const cap_user_data_t
        jg      sys_capset              # branch to system call
 
-ENTRY(sys32_sigaltstack_wrapper)
-       llgtr   %r2,%r2                 # const stack_emu31_t *
-       llgtr   %r3,%r3                 # stack_emu31_t *
-       jg      sys32_sigaltstack
-
 ENTRY(sys32_sendfile_wrapper)
        lgfr    %r2,%r2                 # int
        lgfr    %r3,%r3                 # int
@@ -921,16 +838,6 @@ ENTRY(sys32_fstat64_wrapper)
        llgtr   %r3,%r3                 # struct stat64 *
        jg      sys32_fstat64           # branch to system call
 
-ENTRY(compat_sys_futex_wrapper)
-       llgtr   %r2,%r2                 # u32 *
-       lgfr    %r3,%r3                 # int
-       lgfr    %r4,%r4                 # int
-       llgtr   %r5,%r5                 # struct compat_timespec *
-       llgtr   %r6,%r6                 # u32 *
-       lgf     %r0,164(%r15)           # int
-       stg     %r0,160(%r15)
-       jg      compat_sys_futex        # branch to system call
-
 ENTRY(sys32_setxattr_wrapper)
        llgtr   %r2,%r2                 # char *
        llgtr   %r3,%r3                 # char *
@@ -1216,14 +1123,6 @@ ENTRY(sys32_remap_file_pages_wrapper)
        llgfr   %r6,%r6                 # unsigned long
        jg      sys_remap_file_pages
 
-ENTRY(compat_sys_waitid_wrapper)
-       lgfr    %r2,%r2                 # int
-       lgfr    %r3,%r3                 # pid_t
-       llgtr   %r4,%r4                 # siginfo_emu31_t *
-       lgfr    %r5,%r5                 # int
-       llgtr   %r6,%r6                 # struct rusage_emu31 *
-       jg      compat_sys_waitid
-
 ENTRY(compat_sys_kexec_load_wrapper)
        llgfr   %r2,%r2                 # unsigned long
        llgfr   %r3,%r3                 # unsigned long
@@ -1253,13 +1152,6 @@ ENTRY(sys_inotify_rm_watch_wrapper)
        llgfr   %r3,%r3                 # u32
        jg      sys_inotify_rm_watch
 
-ENTRY(compat_sys_openat_wrapper)
-       llgfr   %r2,%r2                 # unsigned int
-       llgtr   %r3,%r3                 # const char *
-       lgfr    %r4,%r4                 # int
-       lgfr    %r5,%r5                 # int
-       jg      compat_sys_openat
-
 ENTRY(sys_mkdirat_wrapper)
        lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # const char *
@@ -1362,17 +1254,6 @@ ENTRY(sys_unshare_wrapper)
        llgfr   %r2,%r2                 # unsigned long
        jg      sys_unshare
 
-ENTRY(compat_sys_set_robust_list_wrapper)
-       llgtr   %r2,%r2                 # struct compat_robust_list_head *
-       llgfr   %r3,%r3                 # size_t
-       jg      compat_sys_set_robust_list
-
-ENTRY(compat_sys_get_robust_list_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # compat_uptr_t_t *
-       llgtr   %r4,%r4                 # compat_size_t *
-       jg      compat_sys_get_robust_list
-
 ENTRY(sys_splice_wrapper)
        lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # loff_t *
@@ -1458,18 +1339,6 @@ ENTRY(sys_timerfd_create_wrapper)
        lgfr    %r3,%r3                 # int
        jg      sys_timerfd_create
 
-ENTRY(compat_sys_timerfd_settime_wrapper)
-       lgfr    %r2,%r2                 # int
-       lgfr    %r3,%r3                 # int
-       llgtr   %r4,%r4                 # struct compat_itimerspec *
-       llgtr   %r5,%r5                 # struct compat_itimerspec *
-       jg      compat_sys_timerfd_settime
-
-ENTRY(compat_sys_timerfd_gettime_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct compat_itimerspec *
-       jg      compat_sys_timerfd_gettime
-
 ENTRY(compat_sys_signalfd4_wrapper)
        lgfr    %r2,%r2                 # int
        llgtr   %r3,%r3                 # compat_sigset_t *
@@ -1550,13 +1419,6 @@ ENTRY(compat_sys_pwritev_wrapper)
        llgfr   %r6,%r6                 # u32
        jg      compat_sys_pwritev      # branch to system call
 
-ENTRY(compat_sys_rt_tgsigqueueinfo_wrapper)
-       lgfr    %r2,%r2                 # compat_pid_t
-       lgfr    %r3,%r3                 # compat_pid_t
-       lgfr    %r4,%r4                 # int
-       llgtr   %r5,%r5                 # struct compat_siginfo *
-       jg      compat_sys_rt_tgsigqueueinfo_wrapper # branch to system call
-
 ENTRY(sys_perf_event_open_wrapper)
        llgtr   %r2,%r2                 # const struct perf_event_attr *
        lgfr    %r3,%r3                 # pid_t
@@ -1607,12 +1469,6 @@ ENTRY(sys_name_to_handle_at_wrapper)
        lgfr    %r6,%r6                 # int
        jg      sys_name_to_handle_at
 
-ENTRY(compat_sys_open_by_handle_at_wrapper)
-       lgfr    %r2,%r2                 # int
-       llgtr   %r3,%r3                 # struct file_handle __user *
-       lgfr    %r4,%r4                 # int
-       jg      compat_sys_open_by_handle_at
-
 ENTRY(compat_sys_clock_adjtime_wrapper)
        lgfr    %r2,%r2                 # clockid_t (int)
        llgtr   %r3,%r3                 # struct compat_timex __user *
index 2711936fe70624e9a4f7be2e7980e4a8745a013d..c3a736a3ed4458f0187d8f041f62fb1e590d877e 100644 (file)
@@ -73,10 +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_sigsuspend(int history0, int history1, old_sigset_t mask);
-long sys_sigaction(int sig, const struct old_sigaction __user *act,
-                  struct old_sigaction __user *oact);
-long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss);
 long sys_sigreturn(void);
 long sys_rt_sigreturn(void);
 long sys32_sigreturn(void);
index c3ff70a7b2472b5e91626d9aea6f366e217ace46..9c6e747a5e1eacce6bf4a9bf9730550b5137f98f 100644 (file)
@@ -48,54 +48,6 @@ typedef struct
        struct ucontext uc;
 } rt_sigframe;
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-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;
-}
-
-SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss,
-               stack_t __user *, uoss)
-{
-       struct pt_regs *regs = task_pt_regs(current);
-       return do_sigaltstack(uss, uoss, regs->gprs[15]);
-}
-
 /* Returns non-zero on fault. */
 static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
 {
@@ -190,8 +142,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
        set_current_blocked(&set);
        if (restore_sigregs(regs, &frame->uc.uc_mcontext))
                goto badframe;
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL,
-                          regs->gprs[15]) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
        return regs->gprs[2];
 badframe:
@@ -325,10 +276,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->gprs[15]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->gprs[15]);
        err |= save_sigregs(regs, &frame->uc.uc_mcontext);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
index 6a6c61f94dd32244d62a9d25985ed8844dfb988b..aaac708aa1102ee242bc20d98ac6e80a243766c7 100644 (file)
@@ -13,7 +13,7 @@ SYSCALL(sys_exit,sys_exit,sys32_exit_wrapper)
 SYSCALL(sys_fork,sys_fork,sys_fork)
 SYSCALL(sys_read,sys_read,sys32_read_wrapper)
 SYSCALL(sys_write,sys_write,sys32_write_wrapper)
-SYSCALL(sys_open,sys_open,sys32_open_wrapper)                  /* 5 */
+SYSCALL(sys_open,sys_open,compat_sys_open)                     /* 5 */
 SYSCALL(sys_close,sys_close,sys32_close_wrapper)
 SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
 SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
@@ -75,7 +75,7 @@ SYSCALL(sys_dup2,sys_dup2,sys32_dup2_wrapper)
 SYSCALL(sys_getppid,sys_getppid,sys_getppid)
 SYSCALL(sys_getpgrp,sys_getpgrp,sys_getpgrp)                   /* 65 */
 SYSCALL(sys_setsid,sys_setsid,sys_setsid)
-SYSCALL(sys_sigaction,sys_sigaction,sys32_sigaction_wrapper)
+SYSCALL(sys_sigaction,sys_sigaction,compat_sys_sigaction)
 NI_SYSCALL                                                     /* old sgetmask syscall*/
 NI_SYSCALL                                                     /* old ssetmask syscall*/
 SYSCALL(sys_setreuid16,sys_ni_syscall,sys32_setreuid16_wrapper)        /* old setreuid16 syscall */
@@ -112,8 +112,8 @@ SYSCALL(sys_fstatfs,sys_fstatfs,compat_sys_fstatfs_wrapper) /* 100 */
 NI_SYSCALL                                                     /* ioperm for i386 */
 SYSCALL(sys_socketcall,sys_socketcall,compat_sys_socketcall_wrapper)
 SYSCALL(sys_syslog,sys_syslog,sys32_syslog_wrapper)
-SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer_wrapper)
-SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer_wrapper)      /* 105 */
+SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer)
+SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer)      /* 105 */
 SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)
 SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)
 SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)
@@ -122,7 +122,7 @@ SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,sys32_lookup_dcookie_wrapper) /* 1
 SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
 NI_SYSCALL                                                     /* old "idle" system call */
 NI_SYSCALL                                                     /* vm86old for i386 */
-SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4_wrapper)
+SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4)
 SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)         /* 115 */
 SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper)
 SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper)
@@ -134,7 +134,7 @@ SYSCALL(sys_newuname,sys_newuname,sys32_newuname_wrapper)
 NI_SYSCALL                                                     /* modify_ldt for i386 */
 SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper)
 SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper)      /* 125 */
-SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask_wrapper)
+SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask)
 NI_SYSCALL                                                     /* old "create module" */
 SYSCALL(sys_init_module,sys_init_module,sys_init_module_wrapper)
 SYSCALL(sys_delete_module,sys_delete_module,sys_delete_module_wrapper)
@@ -169,7 +169,7 @@ SYSCALL(sys_sched_getscheduler,sys_sched_getscheduler,sys32_sched_getscheduler_w
 SYSCALL(sys_sched_yield,sys_sched_yield,sys_sched_yield)
 SYSCALL(sys_sched_get_priority_max,sys_sched_get_priority_max,sys32_sched_get_priority_max_wrapper)
 SYSCALL(sys_sched_get_priority_min,sys_sched_get_priority_min,sys32_sched_get_priority_min_wrapper)    /* 160 */
-SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,sys32_sched_rr_get_interval_wrapper)
+SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval)
 SYSCALL(sys_nanosleep,sys_nanosleep,compat_sys_nanosleep_wrapper)
 SYSCALL(sys_mremap,sys_mremap,sys32_mremap_wrapper)
 SYSCALL(sys_setresuid16,sys_ni_syscall,sys32_setresuid16_wrapper)      /* old setresuid16 syscall */
@@ -182,19 +182,19 @@ SYSCALL(sys_setresgid16,sys_ni_syscall,sys32_setresgid16_wrapper) /* 170 old set
 SYSCALL(sys_getresgid16,sys_ni_syscall,sys32_getresgid16_wrapper)      /* old getresgid16 syscall */
 SYSCALL(sys_prctl,sys_prctl,sys32_prctl_wrapper)
 SYSCALL(sys_rt_sigreturn,sys_rt_sigreturn,sys32_rt_sigreturn)
-SYSCALL(sys_rt_sigaction,sys_rt_sigaction,sys32_rt_sigaction_wrapper)
-SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,sys32_rt_sigprocmask_wrapper)    /* 175 */
-SYSCALL(sys_rt_sigpending,sys_rt_sigpending,sys32_rt_sigpending_wrapper)
-SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait_wrapper)
-SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,sys32_rt_sigqueueinfo_wrapper)
-SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend_wrapper)
+SYSCALL(sys_rt_sigaction,sys_rt_sigaction,compat_sys_rt_sigaction)
+SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,compat_sys_rt_sigprocmask) /* 175 */
+SYSCALL(sys_rt_sigpending,sys_rt_sigpending,compat_sys_rt_sigpending)
+SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait)
+SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,compat_sys_rt_sigqueueinfo)
+SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend)
 SYSCALL(sys_pread64,sys_pread64,sys32_pread64_wrapper)         /* 180 */
 SYSCALL(sys_pwrite64,sys_pwrite64,sys32_pwrite64_wrapper)
 SYSCALL(sys_chown16,sys_ni_syscall,sys32_chown16_wrapper)      /* old chown16 syscall */
 SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)
 SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)
 SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)            /* 185 */
-SYSCALL(sys_sigaltstack,sys_sigaltstack,sys32_sigaltstack_wrapper)
+SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack)
 SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper)
 NI_SYSCALL                                                     /* streams1 */
 NI_SYSCALL                                                     /* streams2 */
@@ -246,7 +246,7 @@ SYSCALL(sys_lremovexattr,sys_lremovexattr,sys32_lremovexattr_wrapper)
 SYSCALL(sys_fremovexattr,sys_fremovexattr,sys32_fremovexattr_wrapper)  /* 235 */
 SYSCALL(sys_gettid,sys_gettid,sys_gettid)
 SYSCALL(sys_tkill,sys_tkill,sys_tkill_wrapper)
-SYSCALL(sys_futex,sys_futex,compat_sys_futex_wrapper)
+SYSCALL(sys_futex,sys_futex,compat_sys_futex)
 SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper)
 SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper)   /* 240 */
 SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill_wrapper)
@@ -289,14 +289,14 @@ SYSCALL(sys_kexec_load,sys_kexec_load,compat_sys_kexec_load_wrapper)
 SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key_wrapper)
 SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper)
 SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl_wrapper)               /* 280 */
-SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper)
+SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid)
 SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper)
 SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper)
 SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init)
 SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper)     /* 285 */
 SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,sys_inotify_rm_watch_wrapper)
 NI_SYSCALL                                                     /* 287 sys_migrate_pages */
-SYSCALL(sys_openat,sys_openat,compat_sys_openat_wrapper)
+SYSCALL(sys_openat,sys_openat,compat_sys_openat)
 SYSCALL(sys_mkdirat,sys_mkdirat,sys_mkdirat_wrapper)
 SYSCALL(sys_mknodat,sys_mknodat,sys_mknodat_wrapper)   /* 290 */
 SYSCALL(sys_fchownat,sys_fchownat,sys_fchownat_wrapper)
@@ -312,8 +312,8 @@ SYSCALL(sys_faccessat,sys_faccessat,sys_faccessat_wrapper)  /* 300 */
 SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6_wrapper)
 SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll_wrapper)
 SYSCALL(sys_unshare,sys_unshare,sys_unshare_wrapper)
-SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list_wrapper)
-SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list_wrapper)
+SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list)
+SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)
 SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)
 SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)
 SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
@@ -328,8 +328,8 @@ SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
 NI_SYSCALL                                             /* 317 old sys_timer_fd */
 SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper)
 SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper)
-SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime_wrapper) /* 320 */
-SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime_wrapper)
+SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */
+SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime)
 SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper)
 SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper)
 SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
@@ -338,13 +338,13 @@ SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper)
 SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper)
 SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper)
 SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper)
-SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo_wrapper) /* 330 */
+SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */
 SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper)
 SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper)
 SYSCALL(sys_fanotify_mark,sys_fanotify_mark,sys_fanotify_mark_wrapper)
 SYSCALL(sys_prlimit64,sys_prlimit64,sys_prlimit64_wrapper)
 SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,sys_name_to_handle_at_wrapper) /* 335 */
-SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at_wrapper)
+SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at)
 SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper)
 SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper)
 SYSCALL(sys_setns,sys_setns,sys_setns_wrapper)
index acaeed6809562c70444b015d3e8c621c57421edd..98d1df92fbd13df31cfa1e2ebbfcbd5322008d16 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef _ASM_SCORE_SYSCALLS_H
 #define _ASM_SCORE_SYSCALLS_H
 
-asmlinkage long score_sigaltstack(struct pt_regs *regs);
 asmlinkage long score_rt_sigreturn(struct pt_regs *regs);
 
 #include <asm-generic/syscalls.h>
index 1557ca1a29519d6e93a5fbf5c201da9fc3907cfd..7234ed09b7b7ef5e815b749d8f364921a04b6500 100644 (file)
@@ -491,8 +491,3 @@ ENTRY(sys_rt_sigreturn)
        mv      r4, r0
        la      r8, score_rt_sigreturn
        br      r8
-
-ENTRY(sys_sigaltstack)
-       mv      r4, r0
-       la      r8, score_sigaltstack
-       br      r8
index 02353bde92d883c3aeb0557ba423e0e3c16edfad..a00fba32b0ebe4fb414a8f21b4ab326b3980149b 100644 (file)
@@ -133,16 +133,6 @@ static void __user *get_sigframe(struct k_sigaction *ka,
        return (void __user*)((sp - frame_size) & ~7);
 }
 
-asmlinkage long
-score_sigaltstack(struct pt_regs *regs)
-{
-       const stack_t __user *uss = (const stack_t __user *) regs->regs[4];
-       stack_t __user *uoss = (stack_t __user *) regs->regs[5];
-       unsigned long usp = regs->regs[0];
-
-       return do_sigaltstack(uss, uoss, usp);
-}
-
 asmlinkage long
 score_rt_sigreturn(struct pt_regs *regs)
 {
@@ -167,9 +157,7 @@ score_rt_sigreturn(struct pt_regs *regs)
        else if (sig)
                force_sig(sig, current);
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       if (do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs->regs[0]) == -EFAULT)
+       if (restore_altstack(&frame->rs_uc.uc_stack))
                goto badframe;
        regs->is_syscall = 0;
 
@@ -209,12 +197,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        err |= copy_siginfo_to_user(&frame->rs_info, info);
        err |= __put_user(0, &frame->rs_uc.uc_flags);
        err |= __put_user(NULL, &frame->rs_uc.uc_link);
-       err |= __put_user((void __user *)current->sas_ss_sp,
-                               &frame->rs_uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[0]),
-                               &frame->rs_uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size,
-                               &frame->rs_uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[0]);
        err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
        err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
 
index 479146c180cba2df6d856b2d82b959bf1f812a15..ef6717a64bc722399ecfa85cb9ae861949402ab5 100644 (file)
@@ -39,6 +39,8 @@ config SUPERH
        select GENERIC_STRNLEN_USER
        select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER
        select MODULES_USE_ELF_RELA
+       select OLD_SIGSUSPEND
+       select OLD_SIGACTION
        help
          The SuperH is a RISC processor targeted for use in embedded systems
          and consumer electronics; it was also used in the Sega Dreamcast
index cc25485996bbca01f9772e93f4b923674d2e71e9..4f97df87d7d54d970177f97e6d771fa518fb4bab 100644 (file)
@@ -9,12 +9,6 @@
 
 struct pt_regs;
 
-asmlinkage int sys_sigsuspend(old_sigset_t mask);
-asmlinkage int sys_sigaction(int sig, const struct old_sigaction __user *act,
-                            struct old_sigaction __user *oact);
-asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-                              unsigned long r6, unsigned long r7,
-                              struct pt_regs __regs);
 asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
                             unsigned long r6, unsigned long r7,
                             struct pt_regs __regs);
index 012004ed33305b84b32f1609932ec0b0bbc321a1..5e90fa2b7eed348cadae62e3dd0523c2954ddee7 100644 (file)
@@ -4,7 +4,6 @@
 #  include <asm/unistd_64.h>
 # endif
 
-# define __ARCH_WANT_SYS_RT_SIGSUSPEND
 # define __ARCH_WANT_OLD_READDIR
 # define __ARCH_WANT_OLD_STAT
 # define __ARCH_WANT_STAT64
@@ -27,7 +26,6 @@
 # define __ARCH_WANT_SYS_OLDUMOUNT
 # define __ARCH_WANT_SYS_SIGPENDING
 # define __ARCH_WANT_SYS_SIGPROCMASK
-# define __ARCH_WANT_SYS_RT_SIGACTION
 # define __ARCH_WANT_SYS_FORK
 # define __ARCH_WANT_SYS_VFORK
 # define __ARCH_WANT_SYS_CLONE
index 9ac530a90bcef1eeec9c14fa4a914ab0953b2f6c..cb96d02f55a43f4cd2b854f60579a10ccc10447b 100644 (file)
@@ -5,11 +5,13 @@
 
 #include <asm-generic/signal.h>
 
+#ifndef __KERNEL__
 struct old_sigaction {
        __sighandler_t sa_handler;
        old_sigset_t sa_mask;
        unsigned long sa_flags;
        void (*sa_restorer)(void);
 };
+#endif
 
 #endif /* __ASM_SH_SIGNAL_H */
index 2f1f65356c0c39005a605c77f285e614019d387b..6af6e7c5cac8f402db4b834482ac4a7107f8af9d 100644 (file)
@@ -46,60 +46,6 @@ struct fdpic_func_descriptor {
  */
 #define UNWINDGUARD 64
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int
-sys_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;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-               unsigned long r6, unsigned long r7,
-               struct pt_regs __regs)
-{
-       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
-
-       return do_sigaltstack(uss, uoss, regs->regs[15]);
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -257,8 +203,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL,
-                          regs->regs[15]) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return r0;
@@ -423,11 +368,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[15]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->regs[15]);
        err |= setup_sigcontext(&frame->uc.uc_mcontext,
                                regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
index d867cd95a62261c7ae25a91b4ce5d36b179b8f0f..23d4c71c91afb032c341b2c3b41da7220ed2f38b 100644 (file)
@@ -127,58 +127,6 @@ static void do_signal(struct pt_regs *regs)
        restore_saved_sigmask();
 }
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int
-sys_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;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
-               unsigned long r4, unsigned long r5, unsigned long r6,
-               unsigned long r7,
-               struct pt_regs * regs)
-{
-       return do_sigaltstack(uss, uoss, REF_REG_SP);
-}
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -364,9 +312,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
                goto badframe;
        regs->pc -= 4;
 
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, REF_REG_SP) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return (int) ret;
@@ -560,11 +506,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        /* Create the ucontext.  */
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->regs[REG_SP]);
        err |= setup_sigcontext(&frame->uc.uc_mcontext,
                                regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
index 9bff3db17c8c8ad66952ec3d0d557e2f5433e311..58fb1e3f631d4699ebac0ba263a6b50c8ef4ba45 100644 (file)
@@ -40,12 +40,15 @@ config SPARC
        select GENERIC_STRNCPY_FROM_USER
        select GENERIC_STRNLEN_USER
        select MODULES_USE_ELF_RELA
+       select ODD_RT_SIGACTION
+       select OLD_SIGSUSPEND
 
 config SPARC32
        def_bool !64BIT
        select GENERIC_ATOMIC64
        select CLZ_TAB
        select HAVE_UID16
+       select OLD_SIGACTION
 
 config SPARC64
        def_bool 64BIT
@@ -543,6 +546,7 @@ config COMPAT
        select COMPAT_BINFMT_ELF
        select HAVE_UID16
        select ARCH_WANT_OLD_COMPAT_IPC
+       select COMPAT_OLD_SIGACTION
 
 config SYSVIPC_COMPAT
        bool
index b759eab9b51c1e05ecc414bfbf2a21486fe6e179..9ed1f128b4d1c0f562fb9cd67cc66beef6d17d67 100644 (file)
@@ -18,12 +18,6 @@ struct __old_sigaction32 {
        unsigned int            sa_flags;
        unsigned                sa_restorer;     /* not used by Linux/SPARC yet */
 };
-
-typedef struct sigaltstack32 {
-       u32                     ss_sp;
-       int                     ss_flags;
-       compat_size_t           ss_size;
-} stack_t32;
 #endif
 
 #endif /* !(_COMPAT_SIGNAL_H) */
index 77b85850d54399b9afe94d7e96d9c0c33828507b..c33ce3f2ba84e36c7795aa2b39e008b9acc230aa 100644 (file)
  */
 #define SA_STATIC_ALLOC         0x8000
 
-struct k_sigaction {
-       struct                  __new_sigaction sa;
-       void                    __user *ka_restorer;
-};
+#define __ARCH_HAS_KA_RESTORER
+#define __ARCH_HAS_SA_RESTORER
 
 #endif /* !(__ASSEMBLY__) */
 #endif /* !(__SPARC_SIGNAL_H) */
index 87ce24c5eb95a479d35f5709b3d85f1bbf4c3076..5356810bd7e758369fda84af123c28d9c15d7486 100644 (file)
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #ifdef __32bit_syscall_numbers__
 #define __ARCH_WANT_SYS_IPC
 #else
 #define __ARCH_WANT_COMPAT_SYS_TIME
-#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
-#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
 #endif
 
 /*
index c4ffd6c971069cd19e2bfc2b1058c364bef44713..f387400fcfdf1562b5a586552d3b4ce46de28f2f 100644 (file)
@@ -153,6 +153,7 @@ struct sigstack {
 
 #include <asm-generic/signal-defs.h>
 
+#ifndef __KERNEL__
 struct __new_sigaction {
        __sighandler_t          sa_handler;
        unsigned long           sa_flags;
@@ -166,6 +167,7 @@ struct __old_sigaction {
        unsigned long           sa_flags;
        void                    (*sa_restorer)(void);  /* not used by Linux/SPARC yet */
 };
+#endif
 
 typedef struct sigaltstack {
        void                    __user *ss_sp;
index 21fd1a8f47d2c57c3f403a7a5ab47eeb88d6cf54..e2a030045089f8c06acc55167e332e4ab13a1da5 100644 (file)
@@ -819,14 +819,6 @@ sys_sparc_pipe:
        call    sparc_pipe
         mov    %l5, %o7
 
-       .align  4
-       .globl  sys_sigaltstack
-sys_sigaltstack:
-       mov     %o7, %l5
-       mov     %fp, %o2
-       call    do_sigaltstack
-        mov    %l5, %o7
-
        .align  4
        .globl  sys_sigstack
 sys_sigstack:
index 53e48f721ce3e0ceb122ac42550178e74886ad0e..cd5dc4d411d1fb90d4b51251f42fb5ea716c0508 100644 (file)
@@ -61,7 +61,7 @@ struct rt_signal_frame32 {
        compat_sigset_t         mask;
        /* __siginfo_fpu_t * */ u32 fpu_save;
        unsigned int            insns[2];
-       stack_t32               stack;
+       compat_stack_t          stack;
        unsigned int            extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
        /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
        siginfo_extra_v8plus_t  v8plus;
@@ -230,13 +230,11 @@ segv:
 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
 {
        struct rt_signal_frame32 __user *sf;
-       unsigned int psr, pc, npc, u_ss_sp;
+       unsigned int psr, pc, npc;
        compat_uptr_t fpu_save;
        compat_uptr_t rwin_save;
-       mm_segment_t old_fs;
        sigset_t set;
        compat_sigset_t seta;
-       stack_t st;
        int err, i;
        
        /* Always make any pending restarted system calls return -EINTR */
@@ -295,20 +293,10 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
        if (!err && fpu_save)
                err |= restore_fpu_state(regs, compat_ptr(fpu_save));
        err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
-       err |= __get_user(u_ss_sp, &sf->stack.ss_sp);
-       st.ss_sp = compat_ptr(u_ss_sp);
-       err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
-       err |= __get_user(st.ss_size, &sf->stack.ss_size);
+       err |= compat_restore_altstack(&sf->stack);
        if (err)
                goto segv;
                
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf);
-       set_fs(old_fs);
-       
        err |= __get_user(rwin_save, &sf->rwin_save);
        if (!err && rwin_save) {
                if (restore_rwin_state(compat_ptr(rwin_save)))
@@ -335,7 +323,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen)
        return 0;
 }
 
-static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
+static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
 {
        unsigned long sp;
        
@@ -350,12 +338,7 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns
                return (void __user *) -1L;
 
        /* This is the X/Open sanctioned signal stack switching.  */
-       if (sa->sa_flags & SA_ONSTACK) {
-               if (sas_ss_flags(sp) == 0)
-                       sp = current->sas_ss_sp + current->sas_ss_size;
-       }
-
-       sp -= framesize;
+       sp = sigsp(sp, ksig) - framesize;
 
        /* Always align the stack frame.  This handles two cases.  First,
         * sigaltstack need not be mindful of platform specific stack
@@ -426,8 +409,8 @@ out_irqs_on:
 
 }
 
-static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
-                        int signo, sigset_t *oldset)
+static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
+                        sigset_t *oldset)
 {
        struct signal_frame32 __user *sf;
        int i, err, wsaved;
@@ -449,10 +432,12 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                sigframe_size += sizeof(__siginfo_rwin_t);
 
        sf = (struct signal_frame32 __user *)
-               get_sigframe(&ka->sa, regs, sigframe_size);
+               get_sigframe(ksig, regs, sigframe_size);
        
-       if (invalid_frame_pointer(sf, sigframe_size))
-               goto sigill;
+       if (invalid_frame_pointer(sf, sigframe_size)) {
+               do_exit(SIGILL);
+               return -EINVAL;
+       }
 
        tail = (sf + 1);
 
@@ -526,16 +511,16 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
        }       
        if (err)
-               goto sigsegv;
+               return err;
 
        /* 3. signal handler back-trampoline and parameters */
        regs->u_regs[UREG_FP] = (unsigned long) sf;
-       regs->u_regs[UREG_I0] = signo;
+       regs->u_regs[UREG_I0] = ksig->sig;
        regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
        regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
 
        /* 4. signal handler */
-       regs->tpc = (unsigned long) ka->sa.sa_handler;
+       regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
        regs->tnpc = (regs->tpc + 4);
        if (test_thread_flag(TIF_32BIT)) {
                regs->tpc &= 0xffffffff;
@@ -543,8 +528,8 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
        }
 
        /* 5. return to kernel instructions */
-       if (ka->ka_restorer) {
-               regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
+       if (ksig->ka.ka_restorer) {
+               regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
        } else {
                unsigned long address = ((unsigned long)&(sf->insns[0]));
 
@@ -553,23 +538,14 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
                err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
                if (err)
-                       goto sigsegv;
+                       return err;
                flush_signal_insns(address);
        }
        return 0;
-
-sigill:
-       do_exit(SIGILL);
-       return -EINVAL;
-
-sigsegv:
-       force_sigsegv(signo, current);
-       return -EFAULT;
 }
 
-static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
-                           unsigned long signr, sigset_t *oldset,
-                           siginfo_t *info)
+static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
+                           sigset_t *oldset)
 {
        struct rt_signal_frame32 __user *sf;
        int i, err, wsaved;
@@ -591,10 +567,12 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                sigframe_size += sizeof(__siginfo_rwin_t);
 
        sf = (struct rt_signal_frame32 __user *)
-               get_sigframe(&ka->sa, regs, sigframe_size);
+               get_sigframe(ksig, regs, sigframe_size);
        
-       if (invalid_frame_pointer(sf, sigframe_size))
-               goto sigill;
+       if (invalid_frame_pointer(sf, sigframe_size)) {
+               do_exit(SIGILL);
+               return -EINVAL;
+       }
 
        tail = (sf + 1);
 
@@ -639,12 +617,10 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
        }
 
        /* Update the siginfo structure.  */
-       err |= copy_siginfo_to_user32(&sf->info, info);
+       err |= copy_siginfo_to_user32(&sf->info, &ksig->info);
        
        /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
+       err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
 
        switch (_NSIG_WORDS) {
        case 4: seta.sig[7] = (oldset->sig[3] >> 32);
@@ -674,16 +650,16 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
        }
        if (err)
-               goto sigsegv;
+               return err;
        
        /* 3. signal handler back-trampoline and parameters */
        regs->u_regs[UREG_FP] = (unsigned long) sf;
-       regs->u_regs[UREG_I0] = signr;
+       regs->u_regs[UREG_I0] = ksig->sig;
        regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
        regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
 
        /* 4. signal handler */
-       regs->tpc = (unsigned long) ka->sa.sa_handler;
+       regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
        regs->tnpc = (regs->tpc + 4);
        if (test_thread_flag(TIF_32BIT)) {
                regs->tpc &= 0xffffffff;
@@ -691,8 +667,8 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
        }
 
        /* 5. return to kernel instructions */
-       if (ka->ka_restorer)
-               regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
+       if (ksig->ka.ka_restorer)
+               regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
        else {
                unsigned long address = ((unsigned long)&(sf->insns[0]));
 
@@ -704,36 +680,25 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                /* t 0x10 */
                err |= __put_user(0x91d02010, &sf->insns[1]);
                if (err)
-                       goto sigsegv;
+                       return err;
 
                flush_signal_insns(address);
        }
        return 0;
-
-sigill:
-       do_exit(SIGILL);
-       return -EINVAL;
-
-sigsegv:
-       force_sigsegv(signr, current);
-       return -EFAULT;
 }
 
-static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
-                                 siginfo_t *info,
-                                 sigset_t *oldset, struct pt_regs *regs)
+static inline void handle_signal32(struct ksignal *ksig, 
+                                 struct pt_regs *regs)
 {
+       sigset_t *oldset = sigmask_to_save();
        int err;
 
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               err = setup_rt_frame32(ka, regs, signr, oldset, info);
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+               err = setup_rt_frame32(ksig, regs, oldset);
        else
-               err = setup_frame32(ka, regs, signr, oldset);
-
-       if (err)
-               return;
+               err = setup_frame32(ksig, regs, oldset);
 
-       signal_delivered(signr, info, ka, regs, 0);
+       signal_setup_done(err, ksig, 0);
 }
 
 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
@@ -763,50 +728,41 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
  */
 void do_signal32(sigset_t *oldset, struct pt_regs * regs)
 {
-       struct k_sigaction ka;
-       unsigned long orig_i0;
-       int restart_syscall;
-       siginfo_t info;
-       int signr;
-       
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+       struct ksignal ksig;
+       unsigned long orig_i0 = 0;
+       int restart_syscall = 0;
+       bool has_handler = get_signal(&ksig);
 
-       restart_syscall = 0;
-       orig_i0 = 0;
        if (pt_regs_is_syscall(regs) &&
            (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
                restart_syscall = 1;
                orig_i0 = regs->u_regs[UREG_G6];
        }
 
-       if (signr > 0) {
+       if (has_handler) {
                if (restart_syscall)
-                       syscall_restart32(orig_i0, regs, &ka.sa);
-               handle_signal32(signr, &ka, &info, oldset, regs);
-               return;
-       }
-       if (restart_syscall &&
-           (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
-            regs->u_regs[UREG_I0] == ERESTARTSYS ||
-            regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
-               /* replay the system call when we are done */
-               regs->u_regs[UREG_I0] = orig_i0;
-               regs->tpc -= 4;
-               regs->tnpc -= 4;
-               pt_regs_clear_syscall(regs);
-       }
-       if (restart_syscall &&
-           regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
-               regs->u_regs[UREG_G1] = __NR_restart_syscall;
-               regs->tpc -= 4;
-               regs->tnpc -= 4;
-               pt_regs_clear_syscall(regs);
+                       syscall_restart32(orig_i0, regs, &ksig.ka.sa);
+               handle_signal32(&ksig, regs);
+       } else {
+               if (restart_syscall) {
+                       switch (regs->u_regs[UREG_I0]) {
+                       case ERESTARTNOHAND:
+                       case ERESTARTSYS:
+                       case ERESTARTNOINTR:
+                               /* replay the system call when we are done */
+                               regs->u_regs[UREG_I0] = orig_i0;
+                               regs->tpc -= 4;
+                               regs->tnpc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       case ERESTART_RESTARTBLOCK:
+                               regs->u_regs[UREG_G1] = __NR_restart_syscall;
+                               regs->tpc -= 4;
+                               regs->tnpc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       }
+               }
+               restore_saved_sigmask();
        }
-
-       /* If there's no signal to deliver, we just put the saved sigmask
-        * back
-        */
-       restore_saved_sigmask();
 }
 
 struct sigstack32 {
@@ -856,29 +812,3 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
 out:
        return ret;
 }
-
-asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
-{
-       stack_t uss, uoss;
-       u32 u_ss_sp = 0;
-       int ret;
-       mm_segment_t old_fs;
-       stack_t32 __user *uss32 = compat_ptr(ussa);
-       stack_t32 __user *uoss32 = compat_ptr(uossa);
-       
-       if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) ||
-                   __get_user(uss.ss_flags, &uss32->ss_flags) ||
-                   __get_user(uss.ss_size, &uss32->ss_size)))
-               return -EFAULT;
-       uss.ss_sp = compat_ptr(u_ss_sp);
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL,
-                            uossa ? (stack_t __user *) &uoss : NULL, sp);
-       set_fs(old_fs);
-       if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) ||
-                   __put_user(uoss.ss_flags, &uoss32->ss_flags) ||
-                   __put_user(uoss.ss_size, &uoss32->ss_size)))
-               return -EFAULT;
-       return ret;
-}
index 68f9c8650af47b2731c622cc8ada8768b63d90cb..7d5d8e1f841569e02b02a8ddf303b47770cb694f 100644 (file)
@@ -59,18 +59,6 @@ struct rt_signal_frame {
 #define SF_ALIGNEDSZ  (((sizeof(struct signal_frame) + 7) & (~7)))
 #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame) + 7) & (~7)))
 
-static int _sigpause_common(old_sigset_t set)
-{
-       sigset_t blocked;
-       siginitset(&blocked, set);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int sys_sigsuspend(old_sigset_t set)
-{
-       return _sigpause_common(set);
-}
-
 asmlinkage void do_sigreturn(struct pt_regs *regs)
 {
        struct signal_frame __user *sf;
@@ -141,9 +129,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
        unsigned int psr, pc, npc;
        __siginfo_fpu_t __user *fpu_save;
        __siginfo_rwin_t __user *rwin_save;
-       mm_segment_t old_fs;
        sigset_t set;
-       stack_t st;
        int err;
 
        synchronize_user_stack();
@@ -171,8 +157,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
        if (!err && fpu_save)
                err |= restore_fpu_state(regs, fpu_save);
        err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
-       
-       err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
+       err |= restore_altstack(&sf->stack);
        
        if (err)
                goto segv;
@@ -180,14 +165,6 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
        regs->pc = pc;
        regs->npc = npc;
        
-       /* It is more difficult to avoid calling this function than to
-        * call it and ignore errors.
-        */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf);
-       set_fs(old_fs);
-
        err |= __get_user(rwin_save, &sf->rwin_save);
        if (!err && rwin_save) {
                if (restore_rwin_state(rwin_save))
@@ -209,7 +186,7 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen)
        return 0;
 }
 
-static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
+static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
 {
        unsigned long sp = regs->u_regs[UREG_FP];
 
@@ -221,12 +198,7 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
                return (void __user *) -1L;
 
        /* This is the X/Open sanctioned signal stack switching.  */
-       if (sa->sa_flags & SA_ONSTACK) {
-               if (sas_ss_flags(sp) == 0)
-                       sp = current->sas_ss_sp + current->sas_ss_size;
-       }
-
-       sp -= framesize;
+       sp = sigsp(sp, ksig) - framesize;
 
        /* Always align the stack frame.  This handles two cases.  First,
         * sigaltstack need not be mindful of platform specific stack
@@ -239,8 +211,8 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
        return (void __user *) sp;
 }
 
-static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
-                      int signo, sigset_t *oldset)
+static int setup_frame(struct ksignal *ksig, struct pt_regs *regs,
+                      sigset_t *oldset)
 {
        struct signal_frame __user *sf;
        int sigframe_size, err, wsaved;
@@ -258,10 +230,12 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
                sigframe_size += sizeof(__siginfo_rwin_t);
 
        sf = (struct signal_frame __user *)
-               get_sigframe(&ka->sa, regs, sigframe_size);
+               get_sigframe(ksig, regs, sigframe_size);
 
-       if (invalid_frame_pointer(sf, sigframe_size))
-               goto sigill_and_return;
+       if (invalid_frame_pointer(sf, sigframe_size)) {
+               do_exit(SIGILL);
+               return -EINVAL;
+       }
 
        tail = sf + 1;
 
@@ -300,21 +274,21 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
                err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
        }
        if (err)
-               goto sigsegv;
+               return err;
        
        /* 3. signal handler back-trampoline and parameters */
        regs->u_regs[UREG_FP] = (unsigned long) sf;
-       regs->u_regs[UREG_I0] = signo;
+       regs->u_regs[UREG_I0] = ksig->sig;
        regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
        regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
 
        /* 4. signal handler */
-       regs->pc = (unsigned long) ka->sa.sa_handler;
+       regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
        regs->npc = (regs->pc + 4);
 
        /* 5. return to kernel instructions */
-       if (ka->ka_restorer)
-               regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
+       if (ksig->ka.ka_restorer)
+               regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
        else {
                regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
 
@@ -324,24 +298,16 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
                /* t 0x10 */
                err |= __put_user(0x91d02010, &sf->insns[1]);
                if (err)
-                       goto sigsegv;
+                       return err;
 
                /* Flush instruction space. */
                flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
        }
        return 0;
-
-sigill_and_return:
-       do_exit(SIGILL);
-       return -EINVAL;
-
-sigsegv:
-       force_sigsegv(signo, current);
-       return -EFAULT;
 }
 
-static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
-                         int signo, sigset_t *oldset, siginfo_t *info)
+static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
+                         sigset_t *oldset)
 {
        struct rt_signal_frame __user *sf;
        int sigframe_size, wsaved;
@@ -357,9 +323,11 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        if (wsaved)
                sigframe_size += sizeof(__siginfo_rwin_t);
        sf = (struct rt_signal_frame __user *)
-               get_sigframe(&ka->sa, regs, sigframe_size);
-       if (invalid_frame_pointer(sf, sigframe_size))
-               goto sigill;
+               get_sigframe(ksig, regs, sigframe_size);
+       if (invalid_frame_pointer(sf, sigframe_size)) {
+               do_exit(SIGILL);
+               return -EINVAL;
+       }
 
        tail = sf + 1;
        err  = __put_user(regs->pc, &sf->regs.pc);
@@ -391,9 +359,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
        
        /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
+       err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
        
        if (!wsaved) {
                err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
@@ -405,21 +371,21 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
                err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
        }
 
-       err |= copy_siginfo_to_user(&sf->info, info);
+       err |= copy_siginfo_to_user(&sf->info, &ksig->info);
 
        if (err)
-               goto sigsegv;
+               return err;
 
        regs->u_regs[UREG_FP] = (unsigned long) sf;
-       regs->u_regs[UREG_I0] = signo;
+       regs->u_regs[UREG_I0] = ksig->sig;
        regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
        regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
 
-       regs->pc = (unsigned long) ka->sa.sa_handler;
+       regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
        regs->npc = (regs->pc + 4);
 
-       if (ka->ka_restorer)
-               regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
+       if (ksig->ka.ka_restorer)
+               regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
        else {
                regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
 
@@ -429,38 +395,25 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
                /* t 0x10 */
                err |= __put_user(0x91d02010, &sf->insns[1]);
                if (err)
-                       goto sigsegv;
+                       return err;
 
                /* Flush instruction space. */
                flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
        }
        return 0;
-
-sigill:
-       do_exit(SIGILL);
-       return -EINVAL;
-
-sigsegv:
-       force_sigsegv(signo, current);
-       return -EFAULT;
 }
 
 static inline void
-handle_signal(unsigned long signr, struct k_sigaction *ka,
-             siginfo_t *info, struct pt_regs *regs)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
        sigset_t *oldset = sigmask_to_save();
        int err;
 
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               err = setup_rt_frame(ka, regs, signr, oldset, info);
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+               err = setup_rt_frame(ksig, regs, oldset);
        else
-               err = setup_frame(ka, regs, signr, oldset);
-
-       if (err)
-               return;
-
-       signal_delivered(signr, info, ka, regs, 0);
+               err = setup_frame(ksig, regs, oldset);
+       signal_setup_done(err, ksig, 0);
 }
 
 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
@@ -490,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  */
 static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
 {
-       struct k_sigaction ka;
+       struct ksignal ksig;
        int restart_syscall;
-       siginfo_t info;
-       int signr;
+       bool has_handler;
 
        /* It's a lot of work and synchronization to add a new ptrace
         * register for GDB to save and restore in order to get
@@ -516,7 +468,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
        if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
                regs->u_regs[UREG_G6] = orig_i0;
 
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+       has_handler = get_signal(&ksig);
 
        /* If the debugger messes with the program counter, it clears
         * the software "in syscall" bit, directing us to not perform
@@ -528,35 +480,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
                orig_i0 = regs->u_regs[UREG_G6];
        }
 
-
-       if (signr > 0) {
+       if (has_handler) {
                if (restart_syscall)
-                       syscall_restart(orig_i0, regs, &ka.sa);
-               handle_signal(signr, &ka, &info, regs);
-               return;
-       }
-       if (restart_syscall &&
-           (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
-            regs->u_regs[UREG_I0] == ERESTARTSYS ||
-            regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
-               /* replay the system call when we are done */
-               regs->u_regs[UREG_I0] = orig_i0;
-               regs->pc -= 4;
-               regs->npc -= 4;
-               pt_regs_clear_syscall(regs);
-       }
-       if (restart_syscall &&
-           regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
-               regs->u_regs[UREG_G1] = __NR_restart_syscall;
-               regs->pc -= 4;
-               regs->npc -= 4;
-               pt_regs_clear_syscall(regs);
+                       syscall_restart(orig_i0, regs, &ksig.ka.sa);
+               handle_signal(&ksig, regs);
+       } else {
+               if (restart_syscall) {
+                       switch (regs->u_regs[UREG_I0]) {
+                       case ERESTARTNOHAND:
+                       case ERESTARTSYS:
+                       case ERESTARTNOINTR:
+                               /* replay the system call when we are done */
+                               regs->u_regs[UREG_I0] = orig_i0;
+                               regs->pc -= 4;
+                               regs->npc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       case ERESTART_RESTARTBLOCK:
+                               regs->u_regs[UREG_G1] = __NR_restart_syscall;
+                               regs->pc -= 4;
+                               regs->npc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       }
+               }
+               restore_saved_sigmask();
        }
-
-       /* if there's no signal to deliver, we just put the saved sigmask
-        * back
-        */
-       restore_saved_sigmask();
 }
 
 void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0,
index 689e1ba628097e12ab95496d60df2225817483d3..35923e8abd8234f8fe067c0ed4a5e6f49ee85cb8 100644 (file)
@@ -236,23 +236,6 @@ struct rt_signal_frame {
        __siginfo_rwin_t        *rwin_save;
 };
 
-static long _sigpause_common(old_sigset_t set)
-{
-       sigset_t blocked;
-       siginitset(&blocked, set);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage long sys_sigpause(unsigned int set)
-{
-       return _sigpause_common(set);
-}
-
-asmlinkage long sys_sigsuspend(old_sigset_t set)
-{
-       return _sigpause_common(set);
-}
-
 void do_rt_sigreturn(struct pt_regs *regs)
 {
        struct rt_signal_frame __user *sf;
@@ -295,7 +278,8 @@ void do_rt_sigreturn(struct pt_regs *regs)
                err |= restore_fpu_state(regs, fpu_save);
 
        err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
-       if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT)
+       err |= restore_altstack(&sf->stack);
+       if (err)
                goto segv;
 
        err |= __get_user(rwin_save, &sf->rwin_save);
@@ -324,7 +308,7 @@ static int invalid_frame_pointer(void __user *fp)
        return 0;
 }
 
-static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
+static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
 {
        unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS;
 
@@ -336,12 +320,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *
                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;
-       }
-
-       sp -= framesize;
+       sp = sigsp(sp, ksig) - framesize;
 
        /* Always align the stack frame.  This handles two cases.  First,
         * sigaltstack need not be mindful of platform specific stack
@@ -355,8 +334,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *
 }
 
 static inline int
-setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
-              int signo, sigset_t *oldset, siginfo_t *info)
+setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
        struct rt_signal_frame __user *sf;
        int wsaved, err, sf_size;
@@ -374,10 +352,12 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        if (wsaved)
                sf_size += sizeof(__siginfo_rwin_t);
        sf = (struct rt_signal_frame __user *)
-               get_sigframe(ka, regs, sf_size);
+               get_sigframe(ksig, regs, sf_size);
 
-       if (invalid_frame_pointer (sf))
-               goto sigill;
+       if (invalid_frame_pointer (sf)) {
+               do_exit(SIGILL);        /* won't return, actually */
+               return -EINVAL;
+       }
 
        tail = (sf + 1);
 
@@ -403,11 +383,9 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        }
        
        /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
+       err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
 
-       err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t));
+       err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t));
 
        if (!wsaved) {
                err |= copy_in_user((u64 __user *)sf,
@@ -420,18 +398,18 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
                rp = &current_thread_info()->reg_window[wsaved - 1];
                err |= copy_to_user(sf, rp, sizeof(struct reg_window));
        }
-       if (info)
-               err |= copy_siginfo_to_user(&sf->info, info);
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+               err |= copy_siginfo_to_user(&sf->info, &ksig->info);
        else {
-               err |= __put_user(signo, &sf->info.si_signo);
+               err |= __put_user(ksig->sig, &sf->info.si_signo);
                err |= __put_user(SI_NOINFO, &sf->info.si_code);
        }
        if (err)
-               goto sigsegv;
+               return err;
        
        /* 3. signal handler back-trampoline and parameters */
        regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS;
-       regs->u_regs[UREG_I0] = signo;
+       regs->u_regs[UREG_I0] = ksig->sig;
        regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
 
        /* The sigcontext is passed in this way because of how it
@@ -441,37 +419,15 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
        regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
 
        /* 5. signal handler */
-       regs->tpc = (unsigned long) ka->sa.sa_handler;
+       regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;
        regs->tnpc = (regs->tpc + 4);
        if (test_thread_flag(TIF_32BIT)) {
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
        /* 4. return to kernel instructions */
-       regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
+       regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
        return 0;
-
-sigill:
-       do_exit(SIGILL);
-       return -EINVAL;
-
-sigsegv:
-       force_sigsegv(signo, current);
-       return -EFAULT;
-}
-
-static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
-                               siginfo_t *info,
-                               sigset_t *oldset, struct pt_regs *regs)
-{
-       int err;
-
-       err = setup_rt_frame(ka, regs, signr, oldset,
-                            (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
-       if (err)
-               return;
-
-       signal_delivered(signr, info, ka, regs, 0);
 }
 
 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
@@ -501,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
  */
 static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
 {
-       struct k_sigaction ka;
+       struct ksignal ksig;
        int restart_syscall;
-       sigset_t *oldset = sigmask_to_save();
-       siginfo_t info;
-       int signr;
+       bool has_handler;
        
        /* It's a lot of work and synchronization to add a new ptrace
         * register for GDB to save and restore in order to get
@@ -531,13 +485,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
 
 #ifdef CONFIG_COMPAT
        if (test_thread_flag(TIF_32BIT)) {
-               extern void do_signal32(sigset_t *, struct pt_regs *);
-               do_signal32(oldset, regs);
+               extern void do_signal32(struct pt_regs *);
+               do_signal32(regs);
                return;
        }
 #endif 
 
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+       has_handler = get_signal(&ksig);
 
        restart_syscall = 0;
        if (pt_regs_is_syscall(regs) &&
@@ -546,34 +500,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
                orig_i0 = regs->u_regs[UREG_G6];
        }
 
-       if (signr > 0) {
+       if (has_handler) {
                if (restart_syscall)
-                       syscall_restart(orig_i0, regs, &ka.sa);
-               handle_signal(signr, &ka, &info, oldset, regs);
-               return;
-       }
-       if (restart_syscall &&
-           (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
-            regs->u_regs[UREG_I0] == ERESTARTSYS ||
-            regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
-               /* replay the system call when we are done */
-               regs->u_regs[UREG_I0] = orig_i0;
-               regs->tpc -= 4;
-               regs->tnpc -= 4;
-               pt_regs_clear_syscall(regs);
-       }
-       if (restart_syscall &&
-           regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
-               regs->u_regs[UREG_G1] = __NR_restart_syscall;
-               regs->tpc -= 4;
-               regs->tnpc -= 4;
-               pt_regs_clear_syscall(regs);
+                       syscall_restart(orig_i0, regs, &ksig.ka.sa);
+               signal_setup_done(setup_rt_frame(&ksig, regs), &ksig, 0);
+       } else {
+               if (restart_syscall) {
+                       switch (regs->u_regs[UREG_I0]) {
+                       case ERESTARTNOHAND:
+                       case ERESTARTSYS:
+                       case ERESTARTNOINTR:
+                               /* replay the system call when we are done */
+                               regs->u_regs[UREG_I0] = orig_i0;
+                               regs->tpc -= 4;
+                               regs->tnpc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       case ERESTART_RESTARTBLOCK:
+                               regs->u_regs[UREG_G1] = __NR_restart_syscall;
+                               regs->tpc -= 4;
+                               regs->tnpc -= 4;
+                               pt_regs_clear_syscall(regs);
+                       }
+               }
+               restore_saved_sigmask();
        }
-
-       /* If there's no signal to deliver, we just put the saved sigmask
-        * back
-        */
-       restore_saved_sigmask();
 }
 
 void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags)
index 8475a474273ae1c615ce4277dd3bf74ba1ce9f0a..240a3cecc11e620dccf6c941bcd6fd08fcd793be 100644 (file)
@@ -36,108 +36,22 @@ STUB:      sra     REG1, 0, REG1; \
        jmpl    %g1 + %lo(SYSCALL), %g0; \
        sra     REG3, 0, REG3
 
-#define SIGN4(STUB,SYSCALL,REG1,REG2,REG3,REG4) \
-       .align  32; \
-       .globl  STUB; \
-STUB:  sra     REG1, 0, REG1; \
-       sethi   %hi(SYSCALL), %g1; \
-       sra     REG2, 0, REG2; \
-       sra     REG3, 0, REG3; \
-       jmpl    %g1 + %lo(SYSCALL), %g0; \
-       sra     REG4, 0, REG4
-
-SIGN1(sys32_exit, sparc_exit, %o0)
-SIGN1(sys32_exit_group, sparc_exit_group, %o0)
-SIGN1(sys32_wait4, compat_sys_wait4, %o2)
-SIGN1(sys32_creat, sys_creat, %o1)
-SIGN1(sys32_mknod, sys_mknod, %o1)
-SIGN1(sys32_umount, sys_umount, %o1)
-SIGN1(sys32_signal, sys_signal, %o0)
-SIGN1(sys32_access, sys_access, %o1)
-SIGN1(sys32_msync, sys_msync, %o2)
-SIGN2(sys32_reboot, sys_reboot, %o0, %o1)
-SIGN1(sys32_setitimer, compat_sys_setitimer, %o0)
-SIGN1(sys32_getitimer, compat_sys_getitimer, %o0)
-SIGN1(sys32_sethostname, sys_sethostname, %o1)
-SIGN1(sys32_swapon, sys_swapon, %o1)
-SIGN1(sys32_sigaction, compat_sys_sigaction, %o0)
-SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0)
-SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0)
-SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0)
-SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1)
 SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
-SIGN1(sys32_setxattr, sys_setxattr, %o4)
-SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4)
-SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4)
-SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0)
-SIGN1(sys32_flistxattr, sys_flistxattr, %o0)
-SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0)
-SIGN2(sys32_tkill, sys_tkill, %o0, %o1)
-SIGN1(sys32_epoll_create, sys_epoll_create, %o0)
-SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2)
-SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3)
 SIGN1(sys32_readahead, compat_sys_readahead, %o0)
 SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
 SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
-SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1)
-SIGN1(sys32_mlockall, sys_mlockall, %o0)
 SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1)
 SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)
 SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
 SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
 SIGN1(sys32_select, compat_sys_select, %o0)
-SIGN1(sys32_mkdir, sys_mkdir, %o1)
 SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5)
-SIGN1(sys32_sysfs, compat_sys_sysfs, %o0)
 SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)
-SIGN2(sys32_sendfile64, sys_sendfile, %o0, %o1)
-SIGN1(sys32_prctl, sys_prctl, %o0)
-SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0)
-SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2)
-SIGN1(sys32_getgroups, sys_getgroups, %o0)
-SIGN1(sys32_getpgid, sys_getpgid, %o0)
-SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1)
-SIGN1(sys32_getsid, sys_getsid, %o0)
-SIGN2(sys32_kill, sys_kill, %o0, %o1)
-SIGN1(sys32_nice, sys_nice, %o0)
-SIGN1(sys32_lseek, sys_lseek, %o1)
-SIGN2(sys32_open, sparc32_open, %o1, %o2)
-SIGN1(sys32_readlink, sys_readlink, %o2)
-SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0)
-SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0)
-SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0)
-SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0)
-SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0)
-SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1)
-SIGN1(sys32_getdomainname, sys_getdomainname, %o1)
-SIGN1(sys32_setdomainname, sys_setdomainname, %o1)
-SIGN1(sys32_setgroups, sys_setgroups, %o0)
-SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1)
-SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2)
-SIGN1(sys32_ssetmask, sys_ssetmask, %o0)
-SIGN2(sys32_syslog, sys_syslog, %o0, %o2)
-SIGN1(sys32_umask, sys_umask, %o0)
-SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2)
-SIGN1(sys32_sendto, sys_sendto, %o0)
 SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)
-SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2)
-SIGN2(sys32_connect, sys_connect, %o0, %o2)
-SIGN2(sys32_bind, sys_bind, %o0, %o2)
-SIGN2(sys32_listen, sys_listen, %o0, %o1)
 SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
 SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
-SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1)
-SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2)
-SIGN1(sys32_getpeername, sys_getpeername, %o0)
-SIGN1(sys32_getsockname, sys_getsockname, %o0)
-SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1)
-SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)
-SIGN2(sys32_splice, sys_splice, %o0, %o2)
 SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
-SIGN2(sys32_tee, sys_tee, %o0, %o1)
 SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
-SIGN1(sys32_truncate, sys_truncate, %o1)
-SIGN1(sys32_ftruncate, sys_ftruncate, %o1)
 
        .globl          sys32_mmap2
 sys32_mmap2:
index 4a4cdc633f6b84453748042cbd6fb19129f62d88..f38f2280faded349bd4af4c76c9cd09d48cadf1e 100644 (file)
@@ -206,133 +206,19 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd,
        return cp_compat_stat64(&stat, statbuf);
 }
 
-asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)
+COMPAT_SYSCALL_DEFINE3(sparc_sigaction, int, sig,
+                       struct compat_old_sigaction __user *,act,
+                       struct compat_old_sigaction __user *,oact)
 {
-       return sys_sysfs(option, arg1, arg2);
-}
-
-asmlinkage long compat_sys_rt_sigprocmask(int how,
-                                         compat_sigset_t __user *set,
-                                         compat_sigset_t __user *oset,
-                                         compat_size_t sigsetsize)
-{
-       sigset_t s;
-       compat_sigset_t s32;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       
-       if (set) {
-               if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-               switch (_NSIG_WORDS) {
-               case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
-               case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
-               case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
-               case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
-               }
-       }
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigprocmask(how,
-                                set ? (sigset_t __user *) &s : NULL,
-                                oset ? (sigset_t __user *) &s : NULL,
-                                sigsetsize);
-       set_fs (old_fs);
-       if (ret) return ret;
-       if (oset) {
-               switch (_NSIG_WORDS) {
-               case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-               case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-               case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-               case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-               }
-               if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set,
-                                   compat_size_t sigsetsize)
-{
-       sigset_t s;
-       compat_sigset_t s32;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-               
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
-       set_fs (old_fs);
-       if (!ret) {
-               switch (_NSIG_WORDS) {
-               case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-               case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-               case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-               case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-               }
-               if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig,
-                                          struct compat_siginfo __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-
-       set_fs (KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
-       set_fs (old_fs);
-       return ret;
-}
-
-asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act,
-                                    struct old_sigaction32 __user *oact)
-{
-        struct k_sigaction new_ka, old_ka;
-        int ret;
-
        WARN_ON_ONCE(sig >= 0);
-       sig = -sig;
-
-        if (act) {
-               compat_old_sigset_t mask;
-               u32 u_handler, u_restorer;
-               
-               ret = get_user(u_handler, &act->sa_handler);
-               new_ka.sa.sa_handler =  compat_ptr(u_handler);
-               ret |= __get_user(u_restorer, &act->sa_restorer);
-               new_ka.sa.sa_restorer = compat_ptr(u_restorer);
-               ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-               ret |= __get_user(mask, &act->sa_mask);
-               if (ret)
-                       return ret;
-               new_ka.ka_restorer = NULL;
-               siginitset(&new_ka.sa.sa_mask, mask);
-        }
-
-        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
-               ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer);
-               ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-               ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-        }
-
-       return ret;
+       return compat_sys_sigaction(-sig, act, oact);
 }
 
-asmlinkage long compat_sys_rt_sigaction(int sig,
-                                       struct sigaction32 __user *act,
-                                       struct sigaction32 __user *oact,
-                                       void __user *restorer,
-                                       compat_size_t sigsetsize)
+COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig,
+                       struct compat_sigaction __user *,act,
+                       struct compat_sigaction __user *,oact,
+                       void __user *,restorer,
+                       compat_size_t,sigsetsize)
 {
         struct k_sigaction new_ka, old_ka;
         int ret;
@@ -349,12 +235,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
                ret = get_user(u_handler, &act->sa_handler);
                new_ka.sa.sa_handler =  compat_ptr(u_handler);
                ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t));
-               switch (_NSIG_WORDS) {
-               case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32);
-               case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32);
-               case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32);
-               case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32);
-               }
+               sigset_from_compat(&new_ka.sa.sa_mask, &set32);
                ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
                ret |= __get_user(u_restorer, &act->sa_restorer);
                new_ka.sa.sa_restorer = compat_ptr(u_restorer);
@@ -365,12 +246,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
 
        if (!ret && oact) {
-               switch (_NSIG_WORDS) {
-               case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3];
-               case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2];
-               case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1];
-               case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0];
-               }
+               sigset_to_compat(&set32, &old_ka.sa.sa_mask);
                ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
                ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));
                ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
@@ -382,35 +258,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
         return ret;
 }
 
-#ifdef CONFIG_MODULES
-
-asmlinkage long sys32_init_module(void __user *umod, u32 len,
-                                 const char __user *uargs)
-{
-       return sys_init_module(umod, len, uargs);
-}
-
-asmlinkage long sys32_delete_module(const char __user *name_user,
-                                   unsigned int flags)
-{
-       return sys_delete_module(name_user, flags);
-}
-
-#else /* CONFIG_MODULES */
-
-asmlinkage long sys32_init_module(const char __user *name_user,
-                                 struct module __user *mod_user)
-{
-       return -ENOSYS;
-}
-
-asmlinkage long sys32_delete_module(const char __user *name_user)
-{
-       return -ENOSYS;
-}
-
-#endif  /* CONFIG_MODULES */
-
 asmlinkage compat_ssize_t sys32_pread64(unsigned int fd,
                                        char __user *ubuf,
                                        compat_size_t count,
@@ -456,16 +303,6 @@ long compat_sys_fadvise64_64(int fd,
                                advice);
 }
 
-/* This is just a version for 32-bit applications which does
- * not force O_LARGEFILE on.
- */
-
-asmlinkage long sparc32_open(const char __user *filename,
-                            int flags, int mode)
-{
-       return do_sys_open(AT_FDCWD, filename, flags, mode);
-}
-
 long sys32_lookup_dcookie(unsigned long cookie_high,
                          unsigned long cookie_low,
                          char __user *buf, size_t len)
index 2da0bdcae52f765e0e7e021082064bc99e6e0ace..3a8d1844402e5223a1aa2f941c9f02628fef82d6 100644 (file)
@@ -160,49 +160,19 @@ sparc_breakpoint (struct pt_regs *regs)
 #endif
 }
 
-asmlinkage int
-sparc_sigaction (int sig, const struct old_sigaction __user *act,
-                struct old_sigaction __user *oact)
+SYSCALL_DEFINE3(sparc_sigaction, int, sig,
+               struct old_sigaction __user *,act,
+               struct old_sigaction __user *,oact)
 {
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
        WARN_ON_ONCE(sig >= 0);
-       sig = -sig;
-
-       if (act) {
-               unsigned long 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);
-               new_ka.ka_restorer = NULL;
-       }
-
-       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;
+       return sys_sigaction(-sig, act, oact);
 }
 
-asmlinkage long
-sys_rt_sigaction(int sig,
-                const struct sigaction __user *act,
-                struct sigaction __user *oact,
-                void __user *restorer,
-                size_t sigsetsize)
+SYSCALL_DEFINE5(rt_sigaction, int, sig,
+                const struct sigaction __user *, act,
+                struct sigaction __user *, oact,
+                void __user *, restorer,
+                size_t, sigsetsize)
 {
        struct k_sigaction new_ka, old_ka;
        int ret;
index e0fed7711a940b6ec991ad11da63d0356556b5cd..22a1098961f54a5f15c9ed87ec7d2c3ff3920e85 100644 (file)
@@ -25,16 +25,10 @@ sys_nis_syscall:
 sys_memory_ordering:
        ba,pt   %xcc, sparc_memory_ordering
         add    %sp, PTREGS_OFF, %o1
-sys_sigaltstack:
-       ba,pt   %xcc, do_sigaltstack
-        add    %i6, STACK_BIAS, %o2
 #ifdef CONFIG_COMPAT
 sys32_sigstack:
        ba,pt   %xcc, do_sys32_sigstack
         mov    %i6, %o2
-sys32_sigaltstack:
-       ba,pt   %xcc, do_sys32_sigaltstack
-        mov    %i6, %o2
 #endif
        .align  32
 #ifdef CONFIG_COMPAT
index 118759cd7342d0549389cc43a1d78ac261fc879b..26e6dd72e92af083f78401b104b9ea0a0b432f50 100644 (file)
@@ -3,8 +3,8 @@
 
 #include <linux/kernel.h>
 #include <linux/types.h>
+#include <linux/signal.h>
 #include <asm/utrap.h>
-#include <asm/signal.h>
 
 extern asmlinkage unsigned long sys_getpagesize(void);
 extern asmlinkage long sparc_pipe(struct pt_regs *regs);
@@ -36,8 +36,6 @@ extern asmlinkage long sys_rt_sigaction(int sig,
 
 extern asmlinkage void sparc64_set_context(struct pt_regs *regs);
 extern asmlinkage void sparc64_get_context(struct pt_regs *regs);
-extern asmlinkage long sys_sigpause(unsigned int set);
-extern asmlinkage long sys_sigsuspend(old_sigset_t set);
 extern void do_rt_sigreturn(struct pt_regs *regs);
 
 #endif /* _SYSTBLS_H */
index 6ac43c36bbbfb98ad769ba6492f66a5fbb2ab554..7b87171ecf1e91803ce0a3908c629118d205c020 100644 (file)
@@ -55,7 +55,7 @@ sys_call_table:
 /*180*/        .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall
 /*185*/        .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
 /*190*/        .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl
-/*195*/        .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask
+/*195*/        .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_sparc_sigaction, sys_sgetmask
 /*200*/        .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir
 /*205*/        .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64
 /*210*/        .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo
index 1009ecb92678185a388d708e8b28be070669524d..260ddcd412bf45b8f37c33be3ef3720c17aa03a2 100644 (file)
 
        .globl sys_call_table32
 sys_call_table32:
-/*0*/  .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write
-/*5*/  .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link
-/*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod
-/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys32_lseek
+/*0*/  .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
+/*5*/  .word compat_sys_open, sys_close, compat_sys_wait4, sys_creat, sys_link
+/*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
+/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys_lseek
 /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
-/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause
-/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice
-       .word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile
+/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
+/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
+       .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile
 /*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
-       .word sys32_umount, sys_setgid16, sys_getgid16, sys32_signal, sys_geteuid16
+       .word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16
 /*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
-       .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve
-/*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize
-       .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid
+       .word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve
+/*60*/ .word sys_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize
+       .word sys_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid
 /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect
        .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16
-/*80*/ .word sys_setgroups16, sys_getpgrp, sys32_setgroups, sys32_setitimer, sys32_ftruncate64
-       .word sys32_swapon, sys32_getitimer, sys_setuid, sys32_sethostname, sys_setgid
+/*80*/ .word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64
+       .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid
 /*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid
-       .word sys_fsync, sys32_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
-/*100*/ .word sys32_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending
-       .word compat_sys_rt_sigtimedwait, sys32_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid
+       .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
+/*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending
+       .word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid
 /*110*/        .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
-       .word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
+       .word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
 /*120*/        .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
-       .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate
-/*130*/        .word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
-       .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
-/*140*/        .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
-       .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write
+       .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate
+/*130*/        .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
+       .word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
+/*140*/        .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
+       .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
 /*150*/        .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
        .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount
-/*160*/        .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall
-       .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys32_setxattr
-/*170*/        .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents
-       .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr
-/*180*/        .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall
-       .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_newuname
-/*190*/        .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl
-       .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask
-/*200*/        .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
-       .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64
-/*210*/        .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, compat_sys_sysinfo
-       .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex
-/*220*/        .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid
-       .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16
-/*230*/        .word sys32_select, compat_sys_time, sys32_splice, compat_sys_stime, compat_sys_statfs64
-       .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall
-/*240*/        .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler
-       .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep
-/*250*/        .word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys_nis_syscall
+/*160*/        .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
+       .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr
+/*170*/        .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents
+       .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
+/*180*/        .word sys_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall
+       .word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname
+/*190*/        .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
+       .word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask
+/*200*/        .word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
+       .word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64
+/*210*/        .word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo
+       .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex
+/*220*/        .word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid
+       .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16
+/*230*/        .word sys32_select, compat_sys_time, sys_splice, compat_sys_stime, compat_sys_statfs64
+       .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall
+/*240*/        .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler
+       .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, compat_sys_sched_rr_get_interval, compat_sys_nanosleep
+/*250*/        .word sys_mremap, compat_sys_sysctl, sys_getsid, sys_fdatasync, sys_nis_syscall
        .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep
 /*260*/        .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun
        .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
 /*270*/        .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink
        .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
-/*280*/        .word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat
+/*280*/        .word sys_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat
        .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
 /*290*/        .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
        .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
index 88f3c227afd9ab6b838074fbe5b33ae4fde38052..001d418a8957721c99c41947b1e54bdb2dfd10f2 100644 (file)
@@ -272,17 +272,9 @@ extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka,
                                 struct pt_regs *regs);
 
 /* Compat syscalls. */
-struct compat_sigaction;
 struct compat_siginfo;
 struct compat_sigaltstack;
-long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act,
-                            struct compat_sigaction __user *oact,
-                            size_t sigsetsize);
-long compat_sys_rt_sigqueueinfo(int pid, int sig,
-                               struct compat_siginfo __user *uinfo);
 long compat_sys_rt_sigreturn(void);
-long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr,
-                           struct compat_sigaltstack __user *uoss_ptr);
 long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high);
 long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high);
 long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count,
index 4c8462a62cb6e6dc07b5c6280b4fe944d69098ae..78886e2417a6a6cc1ef4a2ff28b0e9a5afd96033 100644 (file)
@@ -64,9 +64,7 @@ long sys_ftruncate64(unsigned int fd, loff_t length);
 
 /* Provide versions of standard syscalls that use current_pt_regs(). */
 long sys_rt_sigreturn(void);
-long sys_sigaltstack(const stack_t __user *, stack_t __user *);
 #define sys_rt_sigreturn sys_rt_sigreturn
-#define sys_sigaltstack sys_sigaltstack
 
 /* These are the intvec*.S trampolines. */
 long _sys_rt_sigreturn(void);
index 6ac21034f69a695e7d38a5656c80e1bdde0bdfb6..940831fe9e94906a04ec5bd1040f80720f6c1cf7 100644 (file)
@@ -14,7 +14,6 @@
 /* In compat mode, we use sys_llseek() for compat_sys_llseek(). */
 #ifdef CONFIG_COMPAT
 #define __ARCH_WANT_SYS_LLSEEK
-#define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
 #endif
 #define __ARCH_WANT_SYS_NEWFSTATAT
 #define __ARCH_WANT_SYS_CLONE
index 2e4cc69224a6ff83ed5bc0dbe8e4544891b8d99f..d0a052e725befa3dba32721b34bbf9867be5d10d 100644 (file)
 #include <asm/syscalls.h>
 #include <arch/interrupts.h>
 
-struct compat_sigaction {
-       compat_uptr_t sa_handler;
-       compat_ulong_t sa_flags;
-       compat_uptr_t sa_restorer;
-       sigset_t sa_mask __packed;
-};
-
-struct compat_sigaltstack {
-       compat_uptr_t ss_sp;
-       int ss_flags;
-       compat_size_t ss_size;
-};
-
 struct compat_ucontext {
        compat_ulong_t    uc_flags;
        compat_uptr_t     uc_link;
@@ -61,63 +48,6 @@ struct compat_rt_sigframe {
        struct compat_ucontext uc;
 };
 
-long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act,
-                            struct compat_sigaction __user *oact,
-                            size_t sigsetsize)
-{
-       struct k_sigaction new_sa, old_sa;
-       int ret = -EINVAL;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               goto out;
-
-       if (act) {
-               compat_uptr_t handler, restorer;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(handler, &act->sa_handler) ||
-                   __get_user(new_sa.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(restorer, &act->sa_restorer) ||
-                   __copy_from_user(&new_sa.sa.sa_mask, &act->sa_mask,
-                                    sizeof(sigset_t)))
-                       return -EFAULT;
-               new_sa.sa.sa_handler = compat_ptr(handler);
-               new_sa.sa.sa_restorer = compat_ptr(restorer);
-       }
-
-       ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL);
-
-       if (!ret && oact) {
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(ptr_to_compat(old_sa.sa.sa_handler),
-                              &oact->sa_handler) ||
-                   __put_user(ptr_to_compat(old_sa.sa.sa_restorer),
-                              &oact->sa_restorer) ||
-                   __put_user(old_sa.sa.sa_flags, &oact->sa_flags) ||
-                   __copy_to_user(&oact->sa_mask, &old_sa.sa.sa_mask,
-                                  sizeof(sigset_t)))
-                       return -EFAULT;
-       }
-out:
-       return ret;
-}
-
-long compat_sys_rt_sigqueueinfo(int pid, int sig,
-                               struct compat_siginfo __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __force __user *)&info);
-       set_fs(old_fs);
-       return ret;
-}
-
 int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from)
 {
        int err;
@@ -196,40 +126,6 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
        return err;
 }
 
-long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr,
-                           struct compat_sigaltstack __user *uoss_ptr)
-{
-       stack_t uss, uoss;
-       int ret;
-       mm_segment_t seg;
-
-       if (uss_ptr) {
-               u32 ptr;
-
-               memset(&uss, 0, sizeof(stack_t));
-               if (!access_ok(VERIFY_READ, uss_ptr, sizeof(*uss_ptr)) ||
-                           __get_user(ptr, &uss_ptr->ss_sp) ||
-                           __get_user(uss.ss_flags, &uss_ptr->ss_flags) ||
-                           __get_user(uss.ss_size, &uss_ptr->ss_size))
-                       return -EFAULT;
-               uss.ss_sp = compat_ptr(ptr);
-       }
-       seg = get_fs();
-       set_fs(KERNEL_DS);
-       ret = do_sigaltstack(uss_ptr ? (stack_t __user __force *)&uss : NULL,
-                            (stack_t __user __force *)&uoss,
-                            (unsigned long)compat_ptr(current_pt_regs()->sp));
-       set_fs(seg);
-       if (ret >= 0 && uoss_ptr)  {
-               if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(*uoss_ptr)) ||
-                   __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) ||
-                   __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) ||
-                   __put_user(uoss.ss_size, &uoss_ptr->ss_size))
-                       ret = -EFAULT;
-       }
-       return ret;
-}
-
 /* The assembly shim for this function arranges to ignore the return value. */
 long compat_sys_rt_sigreturn(void)
 {
@@ -248,7 +144,7 @@ long compat_sys_rt_sigreturn(void)
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       if (compat_sys_sigaltstack(&frame->uc.uc_stack, NULL) == -EFAULT)
+       if (compat_restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return 0;
@@ -325,11 +221,7 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        err |= __clear_user(&frame->save_area, sizeof(frame->save_area));
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user(ptr_to_compat((void *)(current->sas_ss_sp)),
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->sp),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
index 657a7ace4ab4638e6b32701e0f59a2a3a0650556..9531845bf6611e9a42bb78328b080168e482bd99 100644 (file)
 
 #define DEBUG_SIG 0
 
-SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss,
-               stack_t __user *, uoss)
-{
-       return do_sigaltstack(uss, uoss, current_pt_regs()->sp);
-}
-
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -100,7 +93,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
                goto badframe;
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return 0;
@@ -191,11 +184,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        err |= __clear_user(&frame->save_area, sizeof(frame->save_area));
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(NULL, &frame->uc.uc_link);
-       err |= __put_user((void __user *)(current->sas_ss_sp),
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->sp),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
index 48ccf718e290144c9dce74459dfc765846c93c55..3e831b3fd07bb4f547db12eadb6ccecb99df86c9 100644 (file)
@@ -122,13 +122,3 @@ int do_signal(void)
 {
        return kern_do_signal(&current->thread.regs);
 }
-
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-long sys_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
index 581630d91444ddee6925d6a1039b1c008574bf33..bcdedd80890ea29e686d5397256cd1a137bac914 100644 (file)
@@ -674,11 +674,6 @@ 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
 
 /*
index b8b2ffd774d637bdf55a35bc2a5116d8872904c8..6905f0ebdc77e366d8e7b286800531b66f86f58b 100644 (file)
@@ -123,8 +123,7 @@ asmlinkage int __sys_rt_sigreturn(struct pt_regs *regs)
        if (restore_sigframe(regs, &frame->sig))
                goto badframe;
 
-       if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->UCreg_sp)
-                       == -EFAULT)
+       if (restore_altstack(&frame->sig.uc.uc_stack))
                goto badframe;
 
        return regs->UCreg_00;
@@ -265,7 +264,6 @@ 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)
@@ -275,13 +273,7 @@ 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);
-
-       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 |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp);
        err |= setup_sigframe(&frame->sig, regs, set);
        if (err == 0)
                err |= setup_return(regs, ka, frame->sig.retcode, frame, usig);
index 4ebc7a6e6724b3cbbd0a2d159a27cdab2a043181..6a9383370311d9d7c087fee697a2d0f1757df650 100644 (file)
@@ -115,8 +115,10 @@ config X86
        select MODULES_USE_ELF_REL if X86_32
        select MODULES_USE_ELF_RELA if X86_64
        select CLONE_BACKWARDS if X86_32
-       select GENERIC_SIGALTSTACK
        select ARCH_USE_BUILTIN_BSWAP
+       select OLD_SIGSUSPEND3 if X86_32 || IA32_EMULATION
+       select OLD_SIGACTION if X86_32
+       select COMPAT_OLD_SIGACTION if IA32_EMULATION
 
 config INSTRUCTION_DECODER
        def_bool y
index a1daf4a6500926a1305415a6eb4eaba53db6b31f..cf1a471a18a2f7dc1178810fc80d8c3b6462c46a 100644 (file)
@@ -129,13 +129,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
        return err;
 }
 
-asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
 /*
  * Do a signal return; undo the signal stack.
  */
@@ -215,8 +208,9 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
        return err;
 }
 
-asmlinkage long sys32_sigreturn(struct pt_regs *regs)
+asmlinkage long sys32_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
        sigset_t set;
        unsigned int ax;
@@ -241,8 +235,9 @@ badframe:
        return 0;
 }
 
-asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
+asmlinkage long sys32_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct rt_sigframe_ia32 __user *frame;
        sigset_t set;
        unsigned int ax;
@@ -314,7 +309,7 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
 /*
  * Determine which stack to use..
  */
-static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
+static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
                                 size_t frame_size,
                                 void __user **fpstate)
 {
@@ -324,16 +319,13 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
        sp = regs->sp;
 
        /* 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;
-       }
-
+       if (ksig->ka.sa.sa_flags & SA_ONSTACK)
+               sp = sigsp(sp, ksig);
        /* This is the legacy signal stack switching. */
        else if ((regs->ss & 0xffff) != __USER32_DS &&
-               !(ka->sa.sa_flags & SA_RESTORER) &&
-                ka->sa.sa_restorer)
-               sp = (unsigned long) ka->sa.sa_restorer;
+               !(ksig->ka.sa.sa_flags & SA_RESTORER) &&
+                ksig->ka.sa.sa_restorer)
+               sp = (unsigned long) ksig->ka.sa.sa_restorer;
 
        if (used_math()) {
                unsigned long fx_aligned, math_size;
@@ -352,7 +344,7 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
        return (void __user *) sp;
 }
 
-int ia32_setup_frame(int sig, struct k_sigaction *ka,
+int ia32_setup_frame(int sig, struct ksignal *ksig,
                     compat_sigset_t *set, struct pt_regs *regs)
 {
        struct sigframe_ia32 __user *frame;
@@ -371,7 +363,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
                0x80cd,         /* int $0x80 */
        };
 
-       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
+       frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
@@ -388,8 +380,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
                        return -EFAULT;
        }
 
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               restorer = ka->sa.sa_restorer;
+       if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+               restorer = ksig->ka.sa.sa_restorer;
        } else {
                /* Return stub is in 32bit vsyscall page */
                if (current->mm->context.vdso)
@@ -414,7 +406,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
 
        /* Set up registers for signal handler */
        regs->sp = (unsigned long) frame;
-       regs->ip = (unsigned long) ka->sa.sa_handler;
+       regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
 
        /* Make -mregparm=3 work */
        regs->ax = sig;
@@ -430,7 +422,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
        return 0;
 }
 
-int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
                        compat_sigset_t *set, struct pt_regs *regs)
 {
        struct rt_sigframe_ia32 __user *frame;
@@ -451,7 +443,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                0,
        };
 
-       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
+       frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
@@ -469,8 +461,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(0, &frame->uc.uc_link);
                err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp);
 
-               if (ka->sa.sa_flags & SA_RESTORER)
-                       restorer = ka->sa.sa_restorer;
+               if (ksig->ka.sa.sa_flags & SA_RESTORER)
+                       restorer = ksig->ka.sa.sa_restorer;
                else
                        restorer = VDSO32_SYMBOL(current->mm->context.vdso,
                                                 rt_sigreturn);
@@ -483,7 +475,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
        } put_user_catch(err);
 
-       err |= copy_siginfo_to_user32(&frame->info, info);
+       err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
        err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
                                     regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
@@ -493,7 +485,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        /* Set up registers for signal handler */
        regs->sp = (unsigned long) frame;
-       regs->ip = (unsigned long) ka->sa.sa_handler;
+       regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
 
        /* Make -mregparm=3 work */
        regs->ax = sig;
index 142c4ceff1122cadb5dd92ddb0fab05c64f0c48e..474dc1b59f726b92de0a6c9fe3cfcc76ae5e005e 100644 (file)
@@ -456,18 +456,16 @@ ia32_badsys:
        ALIGN
 GLOBAL(\label)
        leaq \func(%rip),%rax
-       leaq -ARGOFFSET+8(%rsp),\arg    /* 8 for return address */
        jmp  ia32_ptregs_common 
        .endm
 
        CFI_STARTPROC32
 
-       PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
-       PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
-       PTREGSCALL stub32_execve, compat_sys_execve, %rcx
-       PTREGSCALL stub32_fork, sys_fork, %rdi
-       PTREGSCALL stub32_vfork, sys_vfork, %rdi
-       PTREGSCALL stub32_iopl, sys_iopl, %rsi
+       PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
+       PTREGSCALL stub32_sigreturn, sys32_sigreturn
+       PTREGSCALL stub32_execve, compat_sys_execve
+       PTREGSCALL stub32_fork, sys_fork
+       PTREGSCALL stub32_vfork, sys_vfork
 
        ALIGN
 GLOBAL(stub32_clone)
index d0b689ba7be2255cd62d365292a0172354982b32..592f5a9a9c0ee9d1cc3fbdfff8e210fa46862360 100644 (file)
@@ -172,183 +172,12 @@ asmlinkage long sys32_mprotect(unsigned long start, size_t len,
        return sys_mprotect(start, len, prot);
 }
 
-asmlinkage long sys32_rt_sigaction(int sig, struct sigaction32 __user *act,
-                                  struct sigaction32 __user *oact,
-                                  unsigned int sigsetsize)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-       compat_sigset_t set32;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(compat_sigset_t))
-               return -EINVAL;
-
-       if (act) {
-               compat_uptr_t handler, restorer;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(restorer, &act->sa_restorer) ||
-                   __copy_from_user(&set32, &act->sa_mask,
-                                    sizeof(compat_sigset_t)))
-                       return -EFAULT;
-               new_ka.sa.sa_handler = compat_ptr(handler);
-               new_ka.sa.sa_restorer = compat_ptr(restorer);
-
-               /*
-                * FIXME: here we rely on _COMPAT_NSIG_WORS to be >=
-                * than _NSIG_WORDS << 1
-                */
-               switch (_NSIG_WORDS) {
-               case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
-                               | (((long)set32.sig[7]) << 32);
-               case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
-                               | (((long)set32.sig[5]) << 32);
-               case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
-                               | (((long)set32.sig[3]) << 32);
-               case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
-                               | (((long)set32.sig[1]) << 32);
-               }
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               /*
-                * FIXME: here we rely on _COMPAT_NSIG_WORS to be >=
-                * than _NSIG_WORDS << 1
-                */
-               switch (_NSIG_WORDS) {
-               case 4:
-                       set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
-                       set32.sig[6] = old_ka.sa.sa_mask.sig[3];
-               case 3:
-                       set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
-                       set32.sig[4] = old_ka.sa.sa_mask.sig[2];
-               case 2:
-                       set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
-                       set32.sig[2] = old_ka.sa.sa_mask.sig[1];
-               case 1:
-                       set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
-                       set32.sig[0] = old_ka.sa.sa_mask.sig[0];
-               }
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(ptr_to_compat(old_ka.sa.sa_handler),
-                              &oact->sa_handler) ||
-                   __put_user(ptr_to_compat(old_ka.sa.sa_restorer),
-                              &oact->sa_restorer) ||
-                   __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
-                   __copy_to_user(&oact->sa_mask, &set32,
-                                  sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-
-       return ret;
-}
-
-asmlinkage long sys32_sigaction(int sig, struct old_sigaction32 __user *act,
-                               struct old_sigaction32 __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       if (act) {
-               compat_old_sigset_t mask;
-               compat_uptr_t handler, restorer;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
-                   __get_user(restorer, &act->sa_restorer) ||
-                   __get_user(mask, &act->sa_mask))
-                       return -EFAULT;
-
-               new_ka.sa.sa_handler = compat_ptr(handler);
-               new_ka.sa.sa_restorer = compat_ptr(restorer);
-
-               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(ptr_to_compat(old_ka.sa.sa_handler),
-                              &oact->sa_handler) ||
-                   __put_user(ptr_to_compat(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;
-}
-
 asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr,
                              int options)
 {
        return compat_sys_wait4(pid, stat_addr, options, NULL);
 }
 
-/* 32-bit timeval and related flotsam.  */
-
-asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid,
-                                   struct compat_timespec __user *interval)
-{
-       struct timespec t;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t);
-       set_fs(old_fs);
-       if (put_compat_timespec(&t, interval))
-               return -EFAULT;
-       return ret;
-}
-
-asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set,
-                                   compat_size_t sigsetsize)
-{
-       sigset_t s;
-       compat_sigset_t s32;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigpending((sigset_t __user *)&s, sigsetsize);
-       set_fs(old_fs);
-       if (!ret) {
-               switch (_NSIG_WORDS) {
-               case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-               case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-               case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-               case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-               }
-               if (copy_to_user(set, &s32, sizeof(compat_sigset_t)))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-asmlinkage long sys32_rt_sigqueueinfo(int pid, int sig,
-                                     compat_siginfo_t __user *uinfo)
-{
-       siginfo_t info;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-       set_fs(KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
-       set_fs(old_fs);
-       return ret;
-}
-
 /* warning: next two assume little endian */
 asmlinkage long sys32_pread(unsigned int fd, char __user *ubuf, u32 count,
                            u32 poslo, u32 poshi)
index 41ab26ea65648b43a910f97cd7903c8bbbc2516c..e25cc33ec54d5476dba4a46337ab893785e48783 100644 (file)
 #ifdef CONFIG_X86_64
 # include <asm/sigcontext32.h>
 # include <asm/user32.h>
-int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+struct ksignal;
+int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
                        compat_sigset_t *set, struct pt_regs *regs);
-int ia32_setup_frame(int sig, struct k_sigaction *ka,
+int ia32_setup_frame(int sig, struct ksignal *ksig,
                     compat_sigset_t *set, struct pt_regs *regs);
 #else
 # define user_i387_ia32_struct user_i387_struct
index 4c6da2e4bb1d3e843c057ca40158d39035150273..d0e8e0141041e95a127c3d1dbe188f6d040a5897 100644 (file)
 #include <asm/sigcontext32.h>
 
 /* signal.h */
-struct sigaction32 {
-       unsigned int  sa_handler;       /* Really a pointer, but need to deal
-                                          with 32 bits */
-       unsigned int sa_flags;
-       unsigned int sa_restorer;       /* Another 32 bit pointer */
-       compat_sigset_t sa_mask;        /* A 32 bit mask */
-};
-
-struct old_sigaction32 {
-       unsigned int  sa_handler;       /* Really a pointer, but need to deal
-                                          with 32 bits */
-       compat_old_sigset_t sa_mask;    /* A 32 bit mask */
-       unsigned int sa_flags;
-       unsigned int sa_restorer;       /* Another 32 bit pointer */
-};
 
 struct ucontext_ia32 {
        unsigned int      uc_flags;
index 216bf364a7e7098a82962613faba2b6c6f20adca..35e67a457182f7f90b62248d5d4044c6a14bf989 100644 (file)
@@ -31,27 +31,9 @@ typedef sigset_t compat_sigset_t;
 #include <uapi/asm/signal.h>
 #ifndef __ASSEMBLY__
 extern void do_notify_resume(struct pt_regs *, void *, __u32);
-#ifdef __i386__
-struct old_sigaction {
-       __sighandler_t sa_handler;
-       old_sigset_t sa_mask;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-};
-
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       __sigrestore_t sa_restorer;
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
 
-#else /* __i386__ */
-#endif /* !__i386__ */
+#define __ARCH_HAS_SA_RESTORER
+
 #include <asm/sigcontext.h>
 
 #ifdef __i386__
index 31f61f96e0fb370030c31ad9318660c6af60ba03..0218d917f50906958e5b0b27d40f6fafb892979c 100644 (file)
@@ -32,22 +32,11 @@ struct mmap_arg_struct32;
 asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *);
 asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long);
 
-struct sigaction32;
-struct old_sigaction32;
-asmlinkage long sys32_rt_sigaction(int, struct sigaction32 __user *,
-                                  struct sigaction32 __user *, unsigned int);
-asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *,
-                               struct old_sigaction32 __user *);
 asmlinkage long sys32_alarm(unsigned int);
 
 asmlinkage long sys32_waitpid(compat_pid_t, unsigned int __user *, int);
 asmlinkage long sys32_sysfs(int, u32, u32);
 
-asmlinkage long sys32_sched_rr_get_interval(compat_pid_t,
-                                           struct compat_timespec __user *);
-asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *, compat_size_t);
-asmlinkage long sys32_rt_sigqueueinfo(int, int, compat_siginfo_t __user *);
-
 asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32);
 asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32);
 
@@ -68,9 +57,8 @@ asmlinkage long sys32_fallocate(int, int, unsigned,
                                unsigned, unsigned, unsigned);
 
 /* ia32/ia32_signal.c */
-asmlinkage long sys32_sigsuspend(int, int, old_sigset_t);
-asmlinkage long sys32_sigreturn(struct pt_regs *);
-asmlinkage long sys32_rt_sigreturn(struct pt_regs *);
+asmlinkage long sys32_sigreturn(void);
+asmlinkage long sys32_rt_sigreturn(void);
 
 /* ia32/ipc32.c */
 asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32);
index 58b7e3eac0ae50cbeb9a0582d8014de0b58cd09c..6cf0a9cc60cd23ea4480c86306a55de97f4ef9fc 100644 (file)
 /* Common in X86_32 and X86_64 */
 /* kernel/ioport.c */
 asmlinkage long sys_ioperm(unsigned long, unsigned long, int);
-long sys_iopl(unsigned int, struct pt_regs *);
+asmlinkage long sys_iopl(unsigned int);
 
 /* kernel/ldt.c */
 asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
 
 /* kernel/signal.c */
-long sys_rt_sigreturn(struct pt_regs *);
+long sys_rt_sigreturn(void);
 
 /* kernel/tls.c */
 asmlinkage int sys_set_thread_area(struct user_desc __user *);
@@ -34,14 +34,11 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *);
 #ifdef CONFIG_X86_32
 
 /* kernel/signal.c */
-asmlinkage int sys_sigsuspend(int, int, old_sigset_t);
-asmlinkage int sys_sigaction(int, const struct old_sigaction __user *,
-                            struct old_sigaction __user *);
-unsigned long sys_sigreturn(struct pt_regs *);
+unsigned long sys_sigreturn(void);
 
 /* kernel/vm86_32.c */
-int sys_vm86old(struct vm86_struct __user *, struct pt_regs *);
-int sys_vm86(unsigned long, unsigned long, struct pt_regs *);
+int sys_vm86old(struct vm86_struct __user *);
+int sys_vm86(unsigned long, unsigned long);
 
 #else /* CONFIG_X86_32 */
 
index a0790e07ba6594305dbb14b8db687db49c71a0c9..3d5df1c4447fd9e57ca6e5920936bf88757ecdf9 100644 (file)
@@ -38,8 +38,6 @@
 # define __ARCH_WANT_SYS_OLD_GETRLIMIT
 # define __ARCH_WANT_SYS_OLD_UNAME
 # define __ARCH_WANT_SYS_PAUSE
-# define __ARCH_WANT_SYS_RT_SIGACTION
-# define __ARCH_WANT_SYS_RT_SIGSUSPEND
 # define __ARCH_WANT_SYS_SGETMASK
 # define __ARCH_WANT_SYS_SIGNAL
 # define __ARCH_WANT_SYS_SIGPENDING
index aa7d6ae39e0e9b8629938a408ba3e7f18a5a0fca..8264f47cf53ed7de5b445350179b94935361463b 100644 (file)
@@ -95,9 +95,9 @@ typedef unsigned long sigset_t;
 #ifndef __ASSEMBLY__
 
 
-#ifdef __i386__
 # ifndef __KERNEL__
 /* Here we must cater to libcs that poke about in kernel headers.  */
+#ifdef __i386__
 
 struct sigaction {
        union {
@@ -112,7 +112,6 @@ struct sigaction {
 #define sa_handler     _u._sa_handler
 #define sa_sigaction   _u._sa_sigaction
 
-# endif /* ! __KERNEL__ */
 #else /* __i386__ */
 
 struct sigaction {
@@ -122,11 +121,8 @@ struct sigaction {
        sigset_t sa_mask;               /* mask last for extensibility */
 };
 
-struct k_sigaction {
-       struct sigaction sa;
-};
-
 #endif /* !__i386__ */
+# endif /* ! __KERNEL__ */
 
 typedef struct sigaltstack {
        void __user *ss_sp;
index 8831176aa5ef09d9ffd99976be4777cbf67bf505..8f3e2dec1df32aa2bafa5cfbd1dbd0ce35e7cdf2 100644 (file)
@@ -699,51 +699,6 @@ END(syscall_badsys)
  */
        .popsection
 
-/*
- * System calls that need a pt_regs pointer.
- */
-#define PTREGSCALL0(name) \
-ENTRY(ptregs_##name) ;  \
-       leal 4(%esp),%eax; \
-       jmp sys_##name; \
-ENDPROC(ptregs_##name)
-
-#define PTREGSCALL1(name) \
-ENTRY(ptregs_##name) ; \
-       leal 4(%esp),%edx; \
-       movl (PT_EBX+4)(%esp),%eax; \
-       jmp sys_##name; \
-ENDPROC(ptregs_##name)
-
-#define PTREGSCALL2(name) \
-ENTRY(ptregs_##name) ; \
-       leal 4(%esp),%ecx; \
-       movl (PT_ECX+4)(%esp),%edx; \
-       movl (PT_EBX+4)(%esp),%eax; \
-       jmp sys_##name; \
-ENDPROC(ptregs_##name)
-
-#define PTREGSCALL3(name) \
-ENTRY(ptregs_##name) ; \
-       CFI_STARTPROC; \
-       leal 4(%esp),%eax; \
-       pushl_cfi %eax; \
-       movl PT_EDX(%eax),%ecx; \
-       movl PT_ECX(%eax),%edx; \
-       movl PT_EBX(%eax),%eax; \
-       call sys_##name; \
-       addl $4,%esp; \
-       CFI_ADJUST_CFA_OFFSET -4; \
-       ret; \
-       CFI_ENDPROC; \
-ENDPROC(ptregs_##name)
-
-PTREGSCALL1(iopl)
-PTREGSCALL0(sigreturn)
-PTREGSCALL0(rt_sigreturn)
-PTREGSCALL2(vm86)
-PTREGSCALL1(vm86old)
-
 .macro FIXUP_ESPFIX_STACK
 /*
  * Switch back for ESPFIX stack to the normal zerobased stack
index 048f2240f8e62d222221d1e49b9215c5c512a553..c1d01e6ca790299611a2ada8eb0e163e4fd8336b 100644 (file)
@@ -828,23 +828,6 @@ int_restore_rest:
        CFI_ENDPROC
 END(system_call)
 
-/*
- * Certain special system calls that need to save a complete full stack frame.
- */
-       .macro PTREGSCALL label,func,arg
-ENTRY(\label)
-       PARTIAL_FRAME 1 8               /* offset 8: return address */
-       subq $REST_SKIP, %rsp
-       CFI_ADJUST_CFA_OFFSET REST_SKIP
-       call save_rest
-       DEFAULT_FRAME 0 8               /* offset 8: return address */
-       leaq 8(%rsp), \arg      /* pt_regs pointer */
-       call \func
-       jmp ptregscall_common
-       CFI_ENDPROC
-END(\label)
-       .endm
-
        .macro FORK_LIKE func
 ENTRY(stub_\func)
        CFI_STARTPROC
@@ -861,10 +844,22 @@ ENTRY(stub_\func)
 END(stub_\func)
        .endm
 
+       .macro FIXED_FRAME label,func
+ENTRY(\label)
+       CFI_STARTPROC
+       PARTIAL_FRAME 0 8               /* offset 8: return address */
+       FIXUP_TOP_OF_STACK %r11, 8-ARGOFFSET
+       call \func
+       RESTORE_TOP_OF_STACK %r11, 8-ARGOFFSET
+       ret
+       CFI_ENDPROC
+END(\label)
+       .endm
+
        FORK_LIKE  clone
        FORK_LIKE  fork
        FORK_LIKE  vfork
-       PTREGSCALL stub_iopl, sys_iopl, %rsi
+       FIXED_FRAME stub_iopl, sys_iopl
 
 ENTRY(ptregscall_common)
        DEFAULT_FRAME 1 8       /* offset 8: return address */
@@ -886,7 +881,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
@@ -902,7 +896,6 @@ ENTRY(stub_rt_sigreturn)
        addq $8, %rsp
        PARTIAL_FRAME 0
        SAVE_REST
-       movq %rsp,%rdi
        FIXUP_TOP_OF_STACK %r11
        call sys_rt_sigreturn
        movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer
@@ -917,7 +910,6 @@ ENTRY(stub_x32_rt_sigreturn)
        addq $8, %rsp
        PARTIAL_FRAME 0
        SAVE_REST
-       movq %rsp,%rdi
        FIXUP_TOP_OF_STACK %r11
        call sys32_x32_rt_sigreturn
        movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer
index 8c968974253de19660b91f6da2b80f64e909c537..4ddaf66ea35f696eac6afce6bb43f01d2d84f1aa 100644 (file)
@@ -93,8 +93,9 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
  * on system-call entry - see also fork() and the signal handling
  * code.
  */
-long sys_iopl(unsigned int level, struct pt_regs *regs)
+SYSCALL_DEFINE1(iopl, unsigned int, level)
 {
+       struct pt_regs *regs = current_pt_regs();
        unsigned int old = (regs->flags >> 12) & 3;
        struct thread_struct *t = &current->thread;
 
index d6bf1f34a6e90b396c11d457dec9600eb6a9af87..69562992e457456eaa4a861de85f6faf4eba8278 100644 (file)
@@ -278,7 +278,7 @@ static const struct {
 };
 
 static int
-__setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
+__setup_frame(int sig, struct ksignal *ksig, sigset_t *set,
              struct pt_regs *regs)
 {
        struct sigframe __user *frame;
@@ -286,7 +286,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
        int err = 0;
        void __user *fpstate = NULL;
 
-       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
+       frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
@@ -307,8 +307,8 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
                restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn);
        else
                restorer = &frame->retcode;
-       if (ka->sa.sa_flags & SA_RESTORER)
-               restorer = ka->sa.sa_restorer;
+       if (ksig->ka.sa.sa_flags & SA_RESTORER)
+               restorer = ksig->ka.sa.sa_restorer;
 
        /* Set up to return from userspace.  */
        err |= __put_user(restorer, &frame->pretcode);
@@ -327,7 +327,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
 
        /* Set up registers for signal handler */
        regs->sp = (unsigned long)frame;
-       regs->ip = (unsigned long)ka->sa.sa_handler;
+       regs->ip = (unsigned long)ksig->ka.sa.sa_handler;
        regs->ax = (unsigned long)sig;
        regs->dx = 0;
        regs->cx = 0;
@@ -340,7 +340,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
        return 0;
 }
 
-static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+static int __setup_rt_frame(int sig, struct ksignal *ksig,
                            sigset_t *set, struct pt_regs *regs)
 {
        struct rt_sigframe __user *frame;
@@ -348,7 +348,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        int err = 0;
        void __user *fpstate = NULL;
 
-       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
+       frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
@@ -368,8 +368,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
                /* Set up to return from userspace.  */
                restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
-               if (ka->sa.sa_flags & SA_RESTORER)
-                       restorer = ka->sa.sa_restorer;
+               if (ksig->ka.sa.sa_flags & SA_RESTORER)
+                       restorer = ksig->ka.sa.sa_restorer;
                put_user_ex(restorer, &frame->pretcode);
 
                /*
@@ -382,7 +382,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode);
        } put_user_catch(err);
        
-       err |= copy_siginfo_to_user(&frame->info, info);
+       err |= copy_siginfo_to_user(&frame->info, &ksig->info);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
                                regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
@@ -392,7 +392,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        /* Set up registers for signal handler */
        regs->sp = (unsigned long)frame;
-       regs->ip = (unsigned long)ka->sa.sa_handler;
+       regs->ip = (unsigned long)ksig->ka.sa.sa_handler;
        regs->ax = (unsigned long)sig;
        regs->dx = (unsigned long)&frame->info;
        regs->cx = (unsigned long)&frame->uc;
@@ -405,20 +405,20 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        return 0;
 }
 #else /* !CONFIG_X86_32 */
-static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+static int __setup_rt_frame(int sig, struct ksignal *ksig,
                            sigset_t *set, struct pt_regs *regs)
 {
        struct rt_sigframe __user *frame;
        void __user *fp = NULL;
        int err = 0;
 
-       frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp);
+       frame = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe), &fp);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
 
-       if (ka->sa.sa_flags & SA_SIGINFO) {
-               if (copy_siginfo_to_user(&frame->info, info))
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+               if (copy_siginfo_to_user(&frame->info, &ksig->info))
                        return -EFAULT;
        }
 
@@ -434,8 +434,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                /* Set up to return from userspace.  If provided, use a stub
                   already in userspace.  */
                /* x86-64 should always use SA_RESTORER. */
-               if (ka->sa.sa_flags & SA_RESTORER) {
-                       put_user_ex(ka->sa.sa_restorer, &frame->pretcode);
+               if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+                       put_user_ex(ksig->ka.sa.sa_restorer, &frame->pretcode);
                } else {
                        /* could use a vstub here */
                        err |= -EFAULT;
@@ -457,7 +457,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
           next argument after the signal number on the stack. */
        regs->si = (unsigned long)&frame->info;
        regs->dx = (unsigned long)&frame->uc;
-       regs->ip = (unsigned long) ka->sa.sa_handler;
+       regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
 
        regs->sp = (unsigned long)frame;
 
@@ -469,8 +469,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 }
 #endif /* CONFIG_X86_32 */
 
-static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
-                             siginfo_t *info, compat_sigset_t *set,
+static int x32_setup_rt_frame(struct ksignal *ksig,
+                             compat_sigset_t *set,
                              struct pt_regs *regs)
 {
 #ifdef CONFIG_X86_X32_ABI
@@ -479,13 +479,13 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
        int err = 0;
        void __user *fpstate = NULL;
 
-       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
+       frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate);
 
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                return -EFAULT;
 
-       if (ka->sa.sa_flags & SA_SIGINFO) {
-               if (copy_siginfo_to_user32(&frame->info, info))
+       if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+               if (copy_siginfo_to_user32(&frame->info, &ksig->info))
                        return -EFAULT;
        }
 
@@ -499,8 +499,8 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
                err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp);
                put_user_ex(0, &frame->uc.uc__pad0);
 
-               if (ka->sa.sa_flags & SA_RESTORER) {
-                       restorer = ka->sa.sa_restorer;
+               if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+                       restorer = ksig->ka.sa.sa_restorer;
                } else {
                        /* could use a vstub here */
                        restorer = NULL;
@@ -518,10 +518,10 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
 
        /* Set up registers for signal handler */
        regs->sp = (unsigned long) frame;
-       regs->ip = (unsigned long) ka->sa.sa_handler;
+       regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
 
        /* We use the x32 calling convention here... */
-       regs->di = sig;
+       regs->di = ksig->sig;
        regs->si = (unsigned long) &frame->info;
        regs->dx = (unsigned long) &frame->uc;
 
@@ -535,70 +535,13 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka,
        return 0;
 }
 
-#ifdef CONFIG_X86_32
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       sigset_t blocked;
-       siginitset(&blocked, mask);
-       return sigsuspend(&blocked);
-}
-
-asmlinkage int
-sys_sigaction(int sig, const struct old_sigaction __user *act,
-             struct old_sigaction __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret = 0;
-
-       if (act) {
-               old_sigset_t mask;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)))
-                       return -EFAULT;
-
-               get_user_try {
-                       get_user_ex(new_ka.sa.sa_handler, &act->sa_handler);
-                       get_user_ex(new_ka.sa.sa_flags, &act->sa_flags);
-                       get_user_ex(mask, &act->sa_mask);
-                       get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer);
-               } get_user_catch(ret);
-
-               if (ret)
-                       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)))
-                       return -EFAULT;
-
-               put_user_try {
-                       put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler);
-                       put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags);
-                       put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-                       put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer);
-               } put_user_catch(ret);
-
-               if (ret)
-                       return -EFAULT;
-       }
-
-       return ret;
-}
-#endif /* CONFIG_X86_32 */
-
 /*
  * Do a signal return; undo the signal stack.
  */
 #ifdef CONFIG_X86_32
-unsigned long sys_sigreturn(struct pt_regs *regs)
+unsigned long sys_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct sigframe __user *frame;
        unsigned long ax;
        sigset_t set;
@@ -625,8 +568,9 @@ badframe:
 }
 #endif /* CONFIG_X86_32 */
 
-long sys_rt_sigreturn(struct pt_regs *regs)
+long sys_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct rt_sigframe __user *frame;
        unsigned long ax;
        sigset_t set;
@@ -667,30 +611,29 @@ static int signr_convert(int sig)
 }
 
 static int
-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-               struct pt_regs *regs)
+setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
-       int usig = signr_convert(sig);
+       int usig = signr_convert(ksig->sig);
        sigset_t *set = sigmask_to_save();
        compat_sigset_t *cset = (compat_sigset_t *) set;
 
        /* Set up the stack frame */
        if (is_ia32_frame()) {
-               if (ka->sa.sa_flags & SA_SIGINFO)
-                       return ia32_setup_rt_frame(usig, ka, info, cset, regs);
+               if (ksig->ka.sa.sa_flags & SA_SIGINFO)
+                       return ia32_setup_rt_frame(usig, ksig, cset, regs);
                else
-                       return ia32_setup_frame(usig, ka, cset, regs);
+                       return ia32_setup_frame(usig, ksig, cset, regs);
        } else if (is_x32_frame()) {
-               return x32_setup_rt_frame(usig, ka, info, cset, regs);
+               return x32_setup_rt_frame(ksig, cset, regs);
        } else {
-               return __setup_rt_frame(sig, ka, info, set, regs);
+               return __setup_rt_frame(ksig->sig, ksig, set, regs);
        }
 }
 
 static void
-handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
-               struct pt_regs *regs)
+handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 {
+       bool failed;
        /* Are we from a system call? */
        if (syscall_get_nr(current, regs) >= 0) {
                /* If so, check system call restarting.. */
@@ -701,7 +644,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
                        break;
 
                case -ERESTARTSYS:
-                       if (!(ka->sa.sa_flags & SA_RESTART)) {
+                       if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
                                regs->ax = -EINTR;
                                break;
                        }
@@ -721,26 +664,21 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
            likely(test_and_clear_thread_flag(TIF_FORCED_TF)))
                regs->flags &= ~X86_EFLAGS_TF;
 
-       if (setup_rt_frame(sig, ka, info, regs) < 0) {
-               force_sigsegv(sig, current);
-               return;
+       failed = (setup_rt_frame(ksig, regs) < 0);
+       if (!failed) {
+               /*
+                * Clear the direction flag as per the ABI for function entry.
+                */
+               regs->flags &= ~X86_EFLAGS_DF;
+               /*
+                * Clear TF when entering the signal handler, but
+                * notify any tracer that was single-stepping it.
+                * The tracer may want to single-step inside the
+                * handler too.
+                */
+               regs->flags &= ~X86_EFLAGS_TF;
        }
-
-       /*
-        * Clear the direction flag as per the ABI for function entry.
-        */
-       regs->flags &= ~X86_EFLAGS_DF;
-
-       /*
-        * Clear TF when entering the signal handler, but
-        * notify any tracer that was single-stepping it.
-        * The tracer may want to single-step inside the
-        * handler too.
-        */
-       regs->flags &= ~X86_EFLAGS_TF;
-
-       signal_delivered(sig, info, ka, regs,
-                        test_thread_flag(TIF_SINGLESTEP));
+       signal_setup_done(failed, ksig, test_thread_flag(TIF_SINGLESTEP));
 }
 
 #ifdef CONFIG_X86_32
@@ -757,14 +695,11 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
  */
 static void do_signal(struct pt_regs *regs)
 {
-       struct k_sigaction ka;
-       siginfo_t info;
-       int signr;
+       struct ksignal ksig;
 
-       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-       if (signr > 0) {
+       if (get_signal(&ksig)) {
                /* Whee! Actually deliver the signal.  */
-               handle_signal(signr, &info, &ka, regs);
+               handle_signal(&ksig, regs);
                return;
        }
 
@@ -843,8 +778,9 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
 }
 
 #ifdef CONFIG_X86_X32_ABI
-asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs)
+asmlinkage long sys32_x32_rt_sigreturn(void)
 {
+       struct pt_regs *regs = current_pt_regs();
        struct rt_sigframe_x32 __user *frame;
        sigset_t set;
        unsigned long ax;
index 1dfe69cc78a81b90cc7d1edefc6d8e53f51c38c8..1cf5766dde169448e109101e981632bb6a6407a5 100644 (file)
@@ -202,7 +202,7 @@ out:
 static int do_vm86_irq_handling(int subfunction, int irqnumber);
 static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk);
 
-int sys_vm86old(struct vm86_struct __user *v86, struct pt_regs *regs)
+int sys_vm86old(struct vm86_struct __user *v86)
 {
        struct kernel_vm86_struct info; /* declare this _on top_,
                                         * this avoids wasting of stack space.
@@ -222,7 +222,7 @@ int sys_vm86old(struct vm86_struct __user *v86, struct pt_regs *regs)
        if (tmp)
                goto out;
        memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus);
-       info.regs32 = regs;
+       info.regs32 = current_pt_regs();
        tsk->thread.vm86_info = v86;
        do_sys_vm86(&info, tsk);
        ret = 0;        /* we never return here */
@@ -231,7 +231,7 @@ out:
 }
 
 
-int sys_vm86(unsigned long cmd, unsigned long arg, struct pt_regs *regs)
+int sys_vm86(unsigned long cmd, unsigned long arg)
 {
        struct kernel_vm86_struct info; /* declare this _on top_,
                                         * this avoids wasting of stack space.
@@ -272,7 +272,7 @@ int sys_vm86(unsigned long cmd, unsigned long arg, struct pt_regs *regs)
        ret = -EFAULT;
        if (tmp)
                goto out;
-       info.regs32 = regs;
+       info.regs32 = current_pt_regs();
        info.vm86plus.is_vm86pus = 1;
        tsk->thread.vm86_info = (struct vm86_struct __user *)v86;
        do_sys_vm86(&info, tsk);
index 28e3fa9056ea6de9dbf73b512e1ea7deb647d1fa..f2fe78ff22cca3a36c1ae483a95cdc69a272eed5 100644 (file)
 64     i386    getppid                 sys_getppid
 65     i386    getpgrp                 sys_getpgrp
 66     i386    setsid                  sys_setsid
-67     i386    sigaction               sys_sigaction                   sys32_sigaction
+67     i386    sigaction               sys_sigaction                   compat_sys_sigaction
 68     i386    sgetmask                sys_sgetmask
 69     i386    ssetmask                sys_ssetmask
 70     i386    setreuid                sys_setreuid16
 71     i386    setregid                sys_setregid16
-72     i386    sigsuspend              sys_sigsuspend                  sys32_sigsuspend
+72     i386    sigsuspend              sys_sigsuspend                  sys_sigsuspend
 73     i386    sigpending              sys_sigpending                  compat_sys_sigpending
 74     i386    sethostname             sys_sethostname
 75     i386    setrlimit               sys_setrlimit                   compat_sys_setrlimit
 107    i386    lstat                   sys_newlstat                    compat_sys_newlstat
 108    i386    fstat                   sys_newfstat                    compat_sys_newfstat
 109    i386    olduname                sys_uname
-110    i386    iopl                    ptregs_iopl                     stub32_iopl
+110    i386    iopl                    sys_iopl
 111    i386    vhangup                 sys_vhangup
 112    i386    idle
-113    i386    vm86old                 ptregs_vm86old                  sys32_vm86_warning
+113    i386    vm86old                 sys_vm86old                     sys32_vm86_warning
 114    i386    wait4                   sys_wait4                       compat_sys_wait4
 115    i386    swapoff                 sys_swapoff
 116    i386    sysinfo                 sys_sysinfo                     compat_sys_sysinfo
 117    i386    ipc                     sys_ipc                         sys32_ipc
 118    i386    fsync                   sys_fsync
-119    i386    sigreturn               ptregs_sigreturn                stub32_sigreturn
+119    i386    sigreturn               sys_sigreturn                   stub32_sigreturn
 120    i386    clone                   sys_clone                       stub32_clone
 121    i386    setdomainname           sys_setdomainname
 122    i386    uname                   sys_newuname
 158    i386    sched_yield             sys_sched_yield
 159    i386    sched_get_priority_max  sys_sched_get_priority_max
 160    i386    sched_get_priority_min  sys_sched_get_priority_min
-161    i386    sched_rr_get_interval   sys_sched_rr_get_interval       sys32_sched_rr_get_interval
+161    i386    sched_rr_get_interval   sys_sched_rr_get_interval       compat_sys_sched_rr_get_interval
 162    i386    nanosleep               sys_nanosleep                   compat_sys_nanosleep
 163    i386    mremap                  sys_mremap
 164    i386    setresuid               sys_setresuid16
 165    i386    getresuid               sys_getresuid16
-166    i386    vm86                    ptregs_vm86                     sys32_vm86_warning
+166    i386    vm86                    sys_vm86                        sys32_vm86_warning
 167    i386    query_module
 168    i386    poll                    sys_poll
 169    i386    nfsservctl
 170    i386    setresgid               sys_setresgid16
 171    i386    getresgid               sys_getresgid16
 172    i386    prctl                   sys_prctl
-173    i386    rt_sigreturn            ptregs_rt_sigreturn             stub32_rt_sigreturn
-174    i386    rt_sigaction            sys_rt_sigaction                sys32_rt_sigaction
+173    i386    rt_sigreturn            sys_rt_sigreturn                stub32_rt_sigreturn
+174    i386    rt_sigaction            sys_rt_sigaction                compat_sys_rt_sigaction
 175    i386    rt_sigprocmask          sys_rt_sigprocmask
-176    i386    rt_sigpending           sys_rt_sigpending               sys32_rt_sigpending
+176    i386    rt_sigpending           sys_rt_sigpending               compat_sys_rt_sigpending
 177    i386    rt_sigtimedwait         sys_rt_sigtimedwait             compat_sys_rt_sigtimedwait
-178    i386    rt_sigqueueinfo         sys_rt_sigqueueinfo             sys32_rt_sigqueueinfo
+178    i386    rt_sigqueueinfo         sys_rt_sigqueueinfo             compat_sys_rt_sigqueueinfo
 179    i386    rt_sigsuspend           sys_rt_sigsuspend
 180    i386    pread64                 sys_pread64                     sys32_pread
 181    i386    pwrite64                sys_pwrite64                    sys32_pwrite
index dc97328bd90ad189f10d3f8c44684e66ac937782..38ae65dfd14ffe91904b4fc409ece711f84e61e9 100644 (file)
 # x32-specific system call numbers start at 512 to avoid cache impact
 # for native 64-bit operation.
 #
-512    x32     rt_sigaction            sys32_rt_sigaction
+512    x32     rt_sigaction            compat_sys_rt_sigaction
 513    x32     rt_sigreturn            stub_x32_rt_sigreturn
 514    x32     ioctl                   compat_sys_ioctl
 515    x32     readv                   compat_sys_readv
 519    x32     recvmsg                 compat_sys_recvmsg
 520    x32     execve                  stub_x32_execve
 521    x32     ptrace                  compat_sys_ptrace
-522    x32     rt_sigpending           sys32_rt_sigpending
+522    x32     rt_sigpending           compat_sys_rt_sigpending
 523    x32     rt_sigtimedwait         compat_sys_rt_sigtimedwait
-524    x32     rt_sigqueueinfo         sys32_rt_sigqueueinfo
+524    x32     rt_sigqueueinfo         compat_sys_rt_sigqueueinfo
 525    x32     sigaltstack             compat_sys_sigaltstack
 526    x32     timer_create            compat_sys_timer_create
 527    x32     mq_notify               compat_sys_mq_notify
index 21a13ce1d75100f9dc945e14b8fa55980ae70499..14ef8d1dbc33bf954b062b525ed0771ef4489172 100644 (file)
@@ -13,7 +13,6 @@ endmenu
 config UML_X86
        def_bool y
        select GENERIC_FIND_FIRST_BIT
-       select GENERIC_SIGALTSTACK
 
 config 64BIT
        bool "64-bit kernel" if SUBARCH = "x86"
@@ -25,6 +24,8 @@ config X86_32
        select ARCH_WANT_IPC_PARSE_VERSION
        select MODULES_USE_ELF_REL
        select CLONE_BACKWARDS
+       select OLD_SIGSUSPEND3
+       select OLD_SIGACTION
 
 config X86_64
        def_bool 64BIT
index 5d065b2222d370e13dd161a6b66e96590b747739..eafa324eb7a5eafcede8ee45ebfef48a58180327 100644 (file)
@@ -10,7 +10,7 @@ endif
 
 obj-y = bug.o bugs_$(BITS).o delay.o fault.o ksyms.o ldt.o \
        ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal.o \
-       stub_$(BITS).o stub_segv.o syscalls_$(BITS).o \
+       stub_$(BITS).o stub_segv.o \
        sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o \
        mem_$(BITS).o subarch.o os-$(OS)/
 
@@ -25,7 +25,7 @@ subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o
 
 else
 
-obj-y += vdso/
+obj-y += syscalls_64.o vdso/
 
 subarch-y = ../lib/csum-partial_64.o ../lib/memcpy_64.o ../lib/thunk_64.o \
                ../lib/rwsem.o
index 8436079be914d3cdc4fa82faa4b5a4f208543308..68fd2cf526fd7e47f0dd823db12e8389b01ed6b9 100644 (file)
@@ -8,11 +8,6 @@
 
 typedef long syscall_handler_t(struct pt_regs);
 
-/* Not declared on x86, incompatible declarations on x86_64, so these have
- * to go here rather than in sys_call_table.c
- */
-extern syscall_handler_t sys_rt_sigaction;
-
 extern syscall_handler_t *sys_call_table[];
 
 #define EXECUTE_SYSCALL(syscall, regs) \
index 71cef48ea5cd5b84abb1216d24ff04b18911eaec..ae7319db18ee36d1e8aec541e30bbbb99cc77d08 100644 (file)
@@ -464,7 +464,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
        return 0;
 }
 
-long sys_sigreturn(struct pt_regs *regs)
+long sys_sigreturn(void)
 {
        unsigned long sp = PT_REGS_SP(&current->thread.regs);
        struct sigframe __user *frame = (struct sigframe __user *)(sp - 8);
@@ -577,7 +577,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
 }
 #endif
 
-long sys_rt_sigreturn(struct pt_regs *regs)
+long sys_rt_sigreturn(void)
 {
        unsigned long sp = PT_REGS_SP(&current->thread.regs);
        struct rt_sigframe __user *frame =
@@ -601,14 +601,3 @@ long sys_rt_sigreturn(struct pt_regs *regs)
        force_sig(SIGSEGV, current);
        return 0;
 }
-
-#ifdef CONFIG_X86_32
-long ptregs_sigreturn(void)
-{
-       return sys_sigreturn(NULL);
-}
-long ptregs_rt_sigreturn(void)
-{
-       return sys_rt_sigreturn(NULL);
-}
-#endif
index a0c3b0d1a1220082a64d8c977b61e607c7db428c..531d4269e2e3c5303e8b40e6753dd20ddab3c405 100644 (file)
 
 #define old_mmap sys_old_mmap
 
-#define ptregs_iopl sys_iopl
-#define ptregs_vm86old sys_vm86old
-#define ptregs_vm86 sys_vm86
-
 #define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void sym(void) ;
 #include <asm/syscalls_32.h>
 
diff --git a/arch/x86/um/syscalls_32.c b/arch/x86/um/syscalls_32.c
deleted file mode 100644 (file)
index e8bcea9..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* 
- * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
- * Licensed under the GPL
- */
-
-#include <linux/syscalls.h>
-#include <sysdep/syscalls.h>
-
-long sys_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;
-}
index 6f586bd90e1862ad90cb8ad6b8b078a9a4af8d86..de169b4eaeef51b4353003afc6e169f19f2114f6 100644 (file)
 #include <uapi/asm/signal.h>
 
 #ifndef __ASSEMBLY__
-struct sigaction {
-       __sighandler_t sa_handler;
-       unsigned long sa_flags;
-       void (*sa_restorer)(void);
-       sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#define __ARCH_HAS_SA_RESTORER
 
 #include <asm/sigcontext.h>
 
index 8d5e47fad0958160abcc117c9f5f1da3c7c5ae50..3673ff1f1bc5344155a9db79826576c9a82cbf20 100644 (file)
@@ -9,15 +9,9 @@
  */
 
 struct pt_regs;
-struct sigaction;
 asmlinkage long xtensa_ptrace(long, long, long, long);
 asmlinkage long xtensa_sigreturn(struct pt_regs*);
 asmlinkage long xtensa_rt_sigreturn(struct pt_regs*);
-asmlinkage long xtensa_sigaltstack(struct pt_regs *regs);
-asmlinkage long sys_rt_sigaction(int,
-                                const struct sigaction __user *,
-                                struct sigaction __user *,
-                                size_t);
 asmlinkage long xtensa_shmat(int, char __user *, int);
 asmlinkage long xtensa_fadvise64_64(int, int,
                                    unsigned long long, unsigned long long);
@@ -31,4 +25,3 @@ asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds,
                          struct timespec __user *tsp,
                          const sigset_t __user *sigmask,
                          size_t sigsetsize);
-asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize);
index eb63ea87815c9e9eba1e1ad3af11c70297e3d7c5..c38834de9ac7dd3a6660d09135a165f491856038 100644 (file)
@@ -15,8 +15,6 @@
 #define __ARCH_WANT_STAT64
 #define __ARCH_WANT_SYS_UTIME
 #define __ARCH_WANT_SYS_LLSEEK
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_GETPGRP
 
 /* 
index 5162418c5d9045a3899fa3b42cd7569a0d87feb2..19fac3f543a281929f8e5f8ccd8531a5a6ab2923 100644 (file)
@@ -483,7 +483,7 @@ __SYSCALL(222, sys_ni_syscall, 0)
 #define __NR_restart_syscall                   223
 __SYSCALL(223, sys_restart_syscall, 0)
 #define __NR_sigaltstack                       224
-__SYSCALL(224, xtensa_sigaltstack, 2)
+__SYSCALL(224, sys_sigaltstack, 2)
 #define __NR_rt_sigreturn                      225
 __SYSCALL(225, xtensa_rt_sigreturn, 1)
 #define __NR_rt_sigaction                      226
index de34d6be91cd4b53dc5f232901e10bef53f15bdd..d7590dddd084c46d6b6e91206b9d8a132540e9bc 100644 (file)
@@ -265,7 +265,7 @@ asmlinkage long xtensa_rt_sigreturn(long a0, long a1, long a2, long a3,
 
        ret = regs->areg[2];
 
-       if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->areg[1]) == -EFAULT)
+       if (restore_altstack(&frame->uc.uc_stack))
                goto badframe;
 
        return ret;
@@ -368,11 +368,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 
        err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user((void *)current->sas_ss_sp,
-                         &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->areg[1]),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= __save_altstack(&frame->uc.uc_stack, regs->areg[1]);
        err |= setup_sigcontext(frame, regs);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 
@@ -424,16 +420,6 @@ give_sigsegv:
        return -EFAULT;
 }
 
-asmlinkage long xtensa_sigaltstack(const stack_t __user *uss,
-                                  stack_t __user *uoss,
-                                  long a2, long a3, long a4, long a5,
-                                  struct pt_regs *regs)
-{
-       return do_sigaltstack(uss, uoss, regs->areg[1]);
-}
-
-
-
 /*
  * Note that 'init' is a special process: it doesn't get signals it doesn't
  * want to handle. Thus you cannot kill init even with a SIGKILL even by
index 015e1e1f87c649ff48df282c6c04780569c3192d..fe40fde291111b0f4d521756403dbc530be4da8a 100644 (file)
@@ -1278,8 +1278,7 @@ compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32,
  * Exactly like fs/open.c:sys_open(), except that it doesn't set the
  * O_LARGEFILE flag.
  */
-asmlinkage long
-compat_sys_open(const char __user *filename, int flags, umode_t mode)
+COMPAT_SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
 {
        return do_sys_open(AT_FDCWD, filename, flags, mode);
 }
@@ -1288,8 +1287,7 @@ compat_sys_open(const char __user *filename, int flags, umode_t mode)
  * Exactly like fs/open.c:sys_openat(), except that it doesn't set the
  * O_LARGEFILE flag.
  */
-asmlinkage long
-compat_sys_openat(unsigned int dfd, const char __user *filename, int flags, umode_t mode)
+COMPAT_SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, umode_t, mode)
 {
        return do_sys_open(dfd, filename, flags, mode);
 }
@@ -1739,55 +1737,13 @@ asmlinkage long compat_sys_signalfd(int ufd,
 }
 #endif /* CONFIG_SIGNALFD */
 
-#ifdef CONFIG_TIMERFD
-
-asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
-                                  const struct compat_itimerspec __user *utmr,
-                                  struct compat_itimerspec __user *otmr)
-{
-       int error;
-       struct itimerspec t;
-       struct itimerspec __user *ut;
-
-       if (get_compat_itimerspec(&t, utmr))
-               return -EFAULT;
-       ut = compat_alloc_user_space(2 * sizeof(struct itimerspec));
-       if (copy_to_user(&ut[0], &t, sizeof(t)))
-               return -EFAULT;
-       error = sys_timerfd_settime(ufd, flags, &ut[0], &ut[1]);
-       if (!error && otmr)
-               error = (copy_from_user(&t, &ut[1], sizeof(struct itimerspec)) ||
-                        put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0;
-
-       return error;
-}
-
-asmlinkage long compat_sys_timerfd_gettime(int ufd,
-                                  struct compat_itimerspec __user *otmr)
-{
-       int error;
-       struct itimerspec t;
-       struct itimerspec __user *ut;
-
-       ut = compat_alloc_user_space(sizeof(struct itimerspec));
-       error = sys_timerfd_gettime(ufd, ut);
-       if (!error)
-               error = (copy_from_user(&t, ut, sizeof(struct itimerspec)) ||
-                        put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0;
-
-       return error;
-}
-
-#endif /* CONFIG_TIMERFD */
-
 #ifdef CONFIG_FHANDLE
 /*
  * Exactly like fs/open.c:sys_open_by_handle_at(), except that it
  * doesn't set the O_LARGEFILE flag.
  */
-asmlinkage long
-compat_sys_open_by_handle_at(int mountdirfd,
-                            struct file_handle __user *handle, int flags)
+COMPAT_SYSCALL_DEFINE3(open_by_handle_at, int, mountdirfd,
+                            struct file_handle __user *, handle, int, flags)
 {
        return do_handle_open(mountdirfd, handle, flags);
 }
index d03822bbf1909080ff201acc372de185d10d50d5..0e606b12a59df966b5509e87016d6782034ee473 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/anon_inodes.h>
 #include <linux/timerfd.h>
 #include <linux/syscalls.h>
+#include <linux/compat.h>
 #include <linux/rcupdate.h>
 
 struct timerfd_ctx {
@@ -278,21 +279,17 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
        return ufd;
 }
 
-SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
-               const struct itimerspec __user *, utmr,
-               struct itimerspec __user *, otmr)
+static int do_timerfd_settime(int ufd, int flags, 
+               const struct itimerspec *new,
+               struct itimerspec *old)
 {
        struct fd f;
        struct timerfd_ctx *ctx;
-       struct itimerspec ktmr, kotmr;
        int ret;
 
-       if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
-               return -EFAULT;
-
        if ((flags & ~TFD_SETTIME_FLAGS) ||
-           !timespec_valid(&ktmr.it_value) ||
-           !timespec_valid(&ktmr.it_interval))
+           !timespec_valid(&new->it_value) ||
+           !timespec_valid(&new->it_interval))
                return -EINVAL;
 
        ret = timerfd_fget(ufd, &f);
@@ -323,27 +320,23 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
        if (ctx->expired && ctx->tintv.tv64)
                hrtimer_forward_now(&ctx->tmr, ctx->tintv);
 
-       kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
-       kotmr.it_interval = ktime_to_timespec(ctx->tintv);
+       old->it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
+       old->it_interval = ktime_to_timespec(ctx->tintv);
 
        /*
         * Re-program the timer to the new value ...
         */
-       ret = timerfd_setup(ctx, flags, &ktmr);
+       ret = timerfd_setup(ctx, flags, new);
 
        spin_unlock_irq(&ctx->wqh.lock);
        fdput(f);
-       if (otmr && copy_to_user(otmr, &kotmr, sizeof(kotmr)))
-               return -EFAULT;
-
        return ret;
 }
 
-SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
+static int do_timerfd_gettime(int ufd, struct itimerspec *t)
 {
        struct fd f;
        struct timerfd_ctx *ctx;
-       struct itimerspec kotmr;
        int ret = timerfd_fget(ufd, &f);
        if (ret)
                return ret;
@@ -356,11 +349,65 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
                        hrtimer_forward_now(&ctx->tmr, ctx->tintv) - 1;
                hrtimer_restart(&ctx->tmr);
        }
-       kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
-       kotmr.it_interval = ktime_to_timespec(ctx->tintv);
+       t->it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
+       t->it_interval = ktime_to_timespec(ctx->tintv);
        spin_unlock_irq(&ctx->wqh.lock);
        fdput(f);
+       return 0;
+}
+
+SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
+               const struct itimerspec __user *, utmr,
+               struct itimerspec __user *, otmr)
+{
+       struct itimerspec new, old;
+       int ret;
+
+       if (copy_from_user(&new, utmr, sizeof(new)))
+               return -EFAULT;
+       ret = do_timerfd_settime(ufd, flags, &new, &old);
+       if (ret)
+               return ret;
+       if (otmr && copy_to_user(otmr, &old, sizeof(old)))
+               return -EFAULT;
+
+       return ret;
+}
 
+SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
+{
+       struct itimerspec kotmr;
+       int ret = do_timerfd_gettime(ufd, &kotmr);
+       if (ret)
+               return ret;
        return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0;
 }
 
+#ifdef COMPAT
+COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
+               const struct itimerspec __user *, utmr,
+               struct itimerspec __user *, otmr)
+{
+       struct itimerspec new, old;
+       int ret;
+
+       if (get_compat_itimerspec(&new, utmr))
+               return -EFAULT;
+       ret = do_timerfd_settime(ufd, flags, &new, &old);
+       if (ret)
+               return ret;
+       if (otmr && put_compat_itimerspec(otmr, &old))
+               return -EFAULT;
+       return ret;
+}
+
+COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd,
+               struct itimerspec __user *, otmr)
+{
+       struct itimerspec kotmr;
+       int ret = do_timerfd_gettime(ufd, &kotmr);
+       if (ret)
+               return ret;
+       return put_compat_itimerspec(otmr, &t) ? -EFAULT: 0;
+}
+#endif
index 1db51b8524e9fb86fcc71e797f95a6518c259bfc..1f74be5113b20a7f759e95950d8428087f6a370c 100644 (file)
@@ -21,24 +21,8 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
                        unsigned long fd, off_t pgoff);
 #endif
 
-#ifndef CONFIG_GENERIC_SIGALTSTACK
-#ifndef sys_sigaltstack
-asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *,
-                       struct pt_regs *);
-#endif
-#endif
-
 #ifndef sys_rt_sigreturn
 asmlinkage long sys_rt_sigreturn(struct pt_regs *regs);
 #endif
 
-#ifndef sys_rt_sigsuspend
-asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize);
-#endif
-
-#ifndef sys_rt_sigaction
-asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user *act,
-                        struct sigaction __user *oact, size_t sigsetsize);
-#endif
-
 #endif /* __ASM_GENERIC_SYSCALLS_H */
index a36991ab334ef180bfd35128a557a0ea504a3cba..257c55ec4f7752e59408ee4d5808d15290cde0fe 100644 (file)
@@ -9,9 +9,6 @@
 #define __ARCH_WANT_STAT64
 #define __ARCH_WANT_SYS_LLSEEK
 #endif
-#define __ARCH_WANT_SYS_RT_SIGACTION
-#define __ARCH_WANT_SYS_RT_SIGSUSPEND
-#define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 
 /*
  * "Conditional" syscalls
index dec7e2d188758369d1c5d10cc7a978eb3b9ce423..de095b0462a757f8ae21d431135d96b82a3ae564 100644 (file)
@@ -68,7 +68,6 @@
 #ifndef compat_user_stack_pointer
 #define compat_user_stack_pointer() current_user_stack_pointer()
 #endif
-#ifdef CONFIG_GENERIC_SIGALTSTACK
 #ifndef compat_sigaltstack     /* we'll need that for MIPS */
 typedef struct compat_sigaltstack {
        compat_uptr_t                   ss_sp;
@@ -76,7 +75,6 @@ typedef struct compat_sigaltstack {
        compat_size_t                   ss_size;
 } compat_stack_t;
 #endif
-#endif
 
 #define compat_jiffies_to_clock_t(x)   \
                (((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
@@ -142,6 +140,20 @@ typedef struct {
        compat_sigset_word      sig[_COMPAT_NSIG_WORDS];
 } compat_sigset_t;
 
+struct compat_sigaction {
+#ifndef __ARCH_HAS_ODD_SIGACTION
+       compat_uptr_t                   sa_handler;
+       compat_ulong_t                  sa_flags;
+#else
+       compat_ulong_t                  sa_flags;
+       compat_uptr_t                   sa_handler;
+#endif
+#ifdef __ARCH_HAS_SA_RESTORER
+       compat_uptr_t                   sa_restorer;
+#endif
+       compat_sigset_t                 sa_mask __packed;
+};
+
 /*
  * These functions operate strictly on struct compat_time*
  */
@@ -283,6 +295,15 @@ struct compat_robust_list_head {
        compat_uptr_t                   list_op_pending;
 };
 
+#ifdef CONFIG_COMPAT_OLD_SIGACTION
+struct compat_old_sigaction {
+       compat_uptr_t                   sa_handler;
+       compat_old_sigset_t             sa_mask;
+       compat_ulong_t                  sa_flags;
+       compat_uptr_t                   sa_restorer;
+};
+#endif
+
 struct compat_statfs;
 struct compat_statfs64;
 struct compat_old_linux_dirent;
@@ -367,6 +388,11 @@ int get_compat_sigevent(struct sigevent *event,
                const struct compat_sigevent __user *u_event);
 long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
                                  struct compat_siginfo __user *uinfo);
+#ifdef CONFIG_COMPAT_OLD_SIGACTION
+asmlinkage long compat_sys_sigaction(int sig,
+                                   const struct compat_old_sigaction __user *act,
+                                   struct compat_old_sigaction __user *oact);
+#endif
 
 static inline int compat_timeval_compare(struct compat_timeval *lhs,
                                        struct compat_timeval *rhs)
@@ -401,7 +427,8 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
 asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
 
 extern int compat_printk(const char *fmt, ...);
-extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat);
+extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat);
+extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set);
 
 asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
                compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
@@ -503,7 +530,7 @@ asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
                                    unsigned int nr_segs, unsigned int flags);
 asmlinkage long compat_sys_open(const char __user *filename, int flags,
                                umode_t mode);
-asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
+asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
                                  int flags, umode_t mode);
 asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
                                             struct file_handle __user *handle,
@@ -592,6 +619,19 @@ asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
                struct compat_timespec __user *uts, compat_size_t sigsetsize);
 asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
                                         compat_size_t sigsetsize);
+asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
+                                         compat_sigset_t __user *oset,
+                                         compat_size_t sigsetsize);
+asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
+                                        compat_size_t sigsetsize);
+#ifndef CONFIG_ODD_RT_SIGACTION
+asmlinkage long compat_sys_rt_sigaction(int,
+                                const struct compat_sigaction __user *,
+                                struct compat_sigaction __user *,
+                                compat_size_t);
+#endif
+asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
+                               struct compat_siginfo __user *uinfo);
 asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
 asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
                                 unsigned long arg);
@@ -642,13 +682,11 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
 
 asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
                                    compat_off_t __user *offset, compat_size_t count);
-#ifdef CONFIG_GENERIC_SIGALTSTACK
 asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
                                       compat_stack_t __user *uoss_ptr);
 
 int compat_restore_altstack(const compat_stack_t __user *uss);
 int __compat_save_altstack(compat_stack_t __user *, unsigned long);
-#endif
 
 asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
                                                 struct compat_timespec __user *interval);
index c2182b53dace04d3387b863281eb91f4c315c728..0655570c67eb0000fc4115253c87070a8305d81c 100644 (file)
@@ -2182,7 +2182,6 @@ extern struct sigqueue *sigqueue_alloc(void);
 extern void sigqueue_free(struct sigqueue *);
 extern int send_sigqueue(struct sigqueue *,  struct task_struct *, int group);
 extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *);
-extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long);
 
 static inline void restore_saved_sigmask(void)
 {
@@ -2228,6 +2227,17 @@ static inline int sas_ss_flags(unsigned long sp)
                : on_sig_stack(sp) ? SS_ONSTACK : 0);
 }
 
+static inline unsigned long sigsp(unsigned long sp, struct ksignal *ksig)
+{
+       if (unlikely((ksig->ka.sa.sa_flags & SA_ONSTACK)) && ! sas_ss_flags(sp))
+#ifdef CONFIG_STACK_GROWSUP
+               return current->sas_ss_sp;
+#else
+               return current->sas_ss_sp + current->sas_ss_size;
+#endif
+       return sp;
+}
+
 /*
  * Routines for handling mm_structs
  */
index 0a89ffc4846669c7bfa5f6289e8563decb84c520..a2dcb94ea49de76e81bc6c9d200b555d4cbbba04 100644 (file)
@@ -241,9 +241,6 @@ extern int do_send_sig_info(int sig, struct siginfo *info,
                                struct task_struct *p, bool group);
 extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p);
 extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
-extern long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig,
-                                siginfo_t *info);
-extern long do_sigpending(void __user *, unsigned long);
 extern int do_sigtimedwait(const sigset_t *, siginfo_t *,
                                const struct timespec *);
 extern int sigprocmask(int, sigset_t *, sigset_t *);
@@ -252,10 +249,59 @@ extern void __set_current_blocked(const sigset_t *);
 extern int show_unhandled_signals;
 extern int sigsuspend(sigset_t *);
 
+struct sigaction {
+#ifndef __ARCH_HAS_ODD_SIGACTION
+       __sighandler_t  sa_handler;
+       unsigned long   sa_flags;
+#else
+       unsigned long   sa_flags;
+       __sighandler_t  sa_handler;
+#endif
+#ifdef __ARCH_HAS_SA_RESTORER
+       __sigrestore_t sa_restorer;
+#endif
+       sigset_t        sa_mask;        /* mask last for extensibility */
+};
+
+struct k_sigaction {
+       struct sigaction sa;
+#ifdef __ARCH_HAS_KA_RESTORER
+       __sigrestore_t ka_restorer;
+#endif
+};
+#ifdef CONFIG_OLD_SIGACTION
+struct old_sigaction {
+       __sighandler_t sa_handler;
+       old_sigset_t sa_mask;
+       unsigned long sa_flags;
+       __sigrestore_t sa_restorer;
+};
+#endif
+
+struct ksignal {
+       struct k_sigaction ka;
+       siginfo_t info;
+       int sig;
+};
+
 extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
+extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
 extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping);
 extern void exit_signals(struct task_struct *tsk);
 
+/*
+ * Eventually that'll replace get_signal_to_deliver(); macro for now,
+ * to avoid nastiness with include order.
+ */
+#define get_signal(ksig)                                       \
+({                                                             \
+       struct ksignal *p = (ksig);                             \
+       p->sig = get_signal_to_deliver(&p->info, &p->ka,        \
+                                       signal_pt_regs(), NULL);\
+       p->sig > 0;                                             \
+})
+
 extern struct kmem_cache *sighand_cachep;
 
 int unhandled_signal(struct task_struct *tsk, int sig);
index 45e2db2702557c1ddb57700671205546868cdc45..313a8e0a6553fb266c10fbf8a548ee35c639bd9d 100644 (file)
@@ -68,11 +68,11 @@ struct sigaltstack;
 #include <linux/types.h>
 #include <linux/aio_abi.h>
 #include <linux/capability.h>
+#include <linux/signal.h>
 #include <linux/list.h>
 #include <linux/bug.h>
 #include <linux/sem.h>
 #include <asm/siginfo.h>
-#include <asm/signal.h>
 #include <linux/unistd.h>
 #include <linux/quota.h>
 #include <linux/key.h>
@@ -300,10 +300,8 @@ asmlinkage long sys_personality(unsigned int personality);
 asmlinkage long sys_sigpending(old_sigset_t __user *set);
 asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set,
                                old_sigset_t __user *oset);
-#ifdef CONFIG_GENERIC_SIGALTSTACK
 asmlinkage long sys_sigaltstack(const struct sigaltstack __user *uss,
                                struct sigaltstack __user *uoss);
-#endif
 
 asmlinkage long sys_getitimer(int which, struct itimerval __user *value);
 asmlinkage long sys_setitimer(int which,
@@ -377,6 +375,27 @@ asmlinkage long sys_init_module(void __user *umod, unsigned long len,
 asmlinkage long sys_delete_module(const char __user *name_user,
                                unsigned int flags);
 
+#ifdef CONFIG_OLD_SIGSUSPEND
+asmlinkage long sys_sigsuspend(old_sigset_t mask);
+#endif
+
+#ifdef CONFIG_OLD_SIGSUSPEND3
+asmlinkage long sys_sigsuspend(int unused1, int unused2, old_sigset_t mask);
+#endif
+
+asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize);
+
+#ifdef CONFIG_OLD_SIGACTION
+asmlinkage long sys_sigaction(int, const struct old_sigaction __user *,
+                               struct old_sigaction __user *);
+#endif
+
+#ifndef CONFIG_ODD_RT_SIGACTION
+asmlinkage long sys_rt_sigaction(int,
+                                const struct sigaction __user *,
+                                struct sigaction __user *,
+                                size_t);
+#endif
 asmlinkage long sys_rt_sigprocmask(int how, sigset_t __user *set,
                                sigset_t __user *oset, size_t sigsetsize);
 asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize);
index 6fae30fd16abc8cba6911d9a3bbb539410edafe5..9df61f1edb0f8048472bee5136f81097e47ac569 100644 (file)
@@ -93,6 +93,11 @@ typedef unsigned long old_sigset_t;
 
 #include <asm-generic/signal-defs.h>
 
+#ifdef SA_RESTORER
+#define __ARCH_HAS_SA_RESTORER
+#endif
+
+#ifndef __KERNEL__
 struct sigaction {
        __sighandler_t sa_handler;
        unsigned long sa_flags;
@@ -101,10 +106,7 @@ struct sigaction {
 #endif
        sigset_t sa_mask;               /* mask last for extensibility */
 };
-
-struct k_sigaction {
-       struct sigaction sa;
-};
+#endif
 
 typedef struct sigaltstack {
        void __user *ss_sp;
index 2c531f478410b056f2d07ee7ac5b12f6c7c943d7..0cc74c4403e446c8ecc5a1bd9fd8f5f19b3ae0dc 100644 (file)
@@ -402,9 +402,9 @@ __SC_COMP(__NR_rt_sigsuspend, sys_rt_sigsuspend, compat_sys_rt_sigsuspend)
 #define __NR_rt_sigaction 134
 __SC_COMP(__NR_rt_sigaction, sys_rt_sigaction, compat_sys_rt_sigaction)
 #define __NR_rt_sigprocmask 135
-__SYSCALL(__NR_rt_sigprocmask, sys_rt_sigprocmask)
+__SC_COMP(__NR_rt_sigprocmask, sys_rt_sigprocmask, compat_sys_rt_sigprocmask)
 #define __NR_rt_sigpending 136
-__SYSCALL(__NR_rt_sigpending, sys_rt_sigpending)
+__SC_COMP(__NR_rt_sigpending, sys_rt_sigpending, compat_sys_rt_sigpending)
 #define __NR_rt_sigtimedwait 137
 __SC_COMP(__NR_rt_sigtimedwait, sys_rt_sigtimedwait, \
          compat_sys_rt_sigtimedwait)
index f4bddb90018614b878ae67ac8775ba0295e46cd1..19971d8c72993af7f322767df7f21bdc33fd36bb 100644 (file)
@@ -290,8 +290,8 @@ static inline long put_compat_itimerval(struct compat_itimerval __user *o,
                 __put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
 }
 
-asmlinkage long compat_sys_getitimer(int which,
-               struct compat_itimerval __user *it)
+COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
+               struct compat_itimerval __user *it)
 {
        struct itimerval kit;
        int error;
@@ -302,9 +302,9 @@ asmlinkage long compat_sys_getitimer(int which,
        return error;
 }
 
-asmlinkage long compat_sys_setitimer(int which,
-               struct compat_itimerval __user *in,
-               struct compat_itimerval __user *out)
+COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
+               struct compat_itimerval __user *in,
+               struct compat_itimerval __user *out)
 {
        struct itimerval kin, kout;
        int error;
@@ -381,9 +381,9 @@ static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set)
        memcpy(blocked->sig, &set, sizeof(set));
 }
 
-asmlinkage long compat_sys_sigprocmask(int how,
-                                      compat_old_sigset_t __user *nset,
-                                      compat_old_sigset_t __user *oset)
+COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how,
+                      compat_old_sigset_t __user *, nset,
+                      compat_old_sigset_t __user *, oset)
 {
        old_sigset_t old_set, new_set;
        sigset_t new_blocked;
@@ -971,7 +971,7 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
 }
 
 void
-sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
+sigset_from_compat(sigset_t *set, const compat_sigset_t *compat)
 {
        switch (_NSIG_WORDS) {
        case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 );
@@ -982,10 +982,20 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
 }
 EXPORT_SYMBOL_GPL(sigset_from_compat);
 
-asmlinkage long
-compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
-               struct compat_siginfo __user *uinfo,
-               struct compat_timespec __user *uts, compat_size_t sigsetsize)
+void
+sigset_to_compat(compat_sigset_t *compat, const sigset_t *set)
+{
+       switch (_NSIG_WORDS) {
+       case 4: compat->sig[7] = (set->sig[3] >> 32); compat->sig[6] = set->sig[3];
+       case 3: compat->sig[5] = (set->sig[2] >> 32); compat->sig[4] = set->sig[2];
+       case 2: compat->sig[3] = (set->sig[1] >> 32); compat->sig[2] = set->sig[1];
+       case 1: compat->sig[1] = (set->sig[0] >> 32); compat->sig[0] = set->sig[0];
+       }
+}
+
+COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
+               struct compat_siginfo __user *, uinfo,
+               struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
 {
        compat_sigset_t s32;
        sigset_t s;
@@ -1013,18 +1023,6 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
        }
 
        return ret;
-
-}
-
-asmlinkage long
-compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
-                            struct compat_siginfo __user *uinfo)
-{
-       siginfo_t info;
-
-       if (copy_siginfo_from_user32(&info, uinfo))
-               return -EFAULT;
-       return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
 }
 
 #ifdef __ARCH_WANT_COMPAT_SYS_TIME
@@ -1067,23 +1065,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr)
 
 #endif /* __ARCH_WANT_COMPAT_SYS_TIME */
 
-#ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
-asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize)
-{
-       sigset_t newset;
-       compat_sigset_t newset32;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t)))
-               return -EFAULT;
-       sigset_from_compat(&newset, &newset32);
-       return sigsuspend(&newset);
-}
-#endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */
-
 asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
 {
        struct timex txc;
@@ -1222,9 +1203,9 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info)
        return 0;
 }
 
-#ifdef __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
-asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
-                                                struct compat_timespec __user *interval)
+COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
+                      compat_pid_t, pid,
+                      struct compat_timespec __user *, interval)
 {
        struct timespec t;
        int ret;
@@ -1237,7 +1218,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
                return -EFAULT;
        return ret;
 }
-#endif /* __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL */
 
 /*
  * Allocate user-space memory for the duration of a single system call,
index a9642d528630260749f760f3c02bc8164f51af2b..f9f44fd4d34d443b1d7f28c3d5f3428b06aec614 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/nsproxy.h>
 #include <linux/futex.h>
 #include <linux/ptrace.h>
+#include <linux/syscalls.h>
 
 #include <asm/uaccess.h>
 
@@ -116,9 +117,9 @@ void compat_exit_robust_list(struct task_struct *curr)
        }
 }
 
-asmlinkage long
-compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
-                          compat_size_t len)
+COMPAT_SYSCALL_DEFINE2(set_robust_list,
+               struct compat_robust_list_head __user *, head,
+               compat_size_t, len)
 {
        if (!futex_cmpxchg_enabled)
                return -ENOSYS;
@@ -131,9 +132,9 @@ compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
        return 0;
 }
 
-asmlinkage long
-compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
-                          compat_size_t __user *len_ptr)
+COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
+                       compat_uptr_t __user *, head_ptr,
+                       compat_size_t __user *, len_ptr)
 {
        struct compat_robust_list_head __user *head;
        unsigned long ret;
@@ -170,9 +171,9 @@ err_unlock:
        return ret;
 }
 
-asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
-               struct compat_timespec __user *utime, u32 __user *uaddr2,
-               u32 val3)
+COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
+               struct compat_timespec __user *, utime, u32 __user *, uaddr2,
+               u32, val3)
 {
        struct timespec ts;
        ktime_t t, *tp = NULL;
index 7f82adbad4800a08a5ca5e1836da455de555856a..2a7ae296318539952009c04585657a6d69c26f0e 100644 (file)
@@ -2399,6 +2399,15 @@ void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
        tracehook_signal_handler(sig, info, ka, regs, stepping);
 }
 
+void signal_setup_done(int failed, struct ksignal *ksig, int stepping)
+{
+       if (failed)
+               force_sigsegv(ksig->sig, current);
+       else
+               signal_delivered(ksig->sig, &ksig->info, &ksig->ka,
+                       signal_pt_regs(), stepping);
+}
+
 /*
  * It could be that complete_signal() picked us to notify about the
  * group-wide signal. Other threads should be notified now to take
@@ -2616,28 +2625,58 @@ SYSCALL_DEFINE4(rt_sigprocmask, int, how, sigset_t __user *, nset,
        return 0;
 }
 
-long do_sigpending(void __user *set, unsigned long sigsetsize)
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(rt_sigprocmask, int, how, compat_sigset_t __user *, nset,
+               compat_sigset_t __user *, oset, compat_size_t, sigsetsize)
 {
-       long error = -EINVAL;
-       sigset_t pending;
+#ifdef __BIG_ENDIAN
+       sigset_t old_set = current->blocked;
+
+       /* XXX: Don't preclude handling different sized sigset_t's.  */
+       if (sigsetsize != sizeof(sigset_t))
+               return -EINVAL;
+
+       if (nset) {
+               compat_sigset_t new32;
+               sigset_t new_set;
+               int error;
+               if (copy_from_user(&new32, nset, sizeof(compat_sigset_t)))
+                       return -EFAULT;
+
+               sigset_from_compat(&new_set, &new32);
+               sigdelsetmask(&new_set, sigmask(SIGKILL)|sigmask(SIGSTOP));
+
+               error = sigprocmask(how, &new_set, NULL);
+               if (error)
+                       return error;
+       }
+       if (oset) {
+               compat_sigset_t old32;
+               sigset_to_compat(&old32, &old_set);
+               if (copy_to_user(oset, &old_set, sizeof(sigset_t)))
+                       return -EFAULT;
+       }
+       return 0;
+#else
+       return sys_rt_sigprocmask(how, (sigset_t __user *)nset,
+                                 (sigset_t __user *)oset, sigsetsize);
+#endif
+}
+#endif
 
+static int do_sigpending(void *set, unsigned long sigsetsize)
+{
        if (sigsetsize > sizeof(sigset_t))
-               goto out;
+               return -EINVAL;
 
        spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&pending, &current->pending.signal,
+       sigorsets(set, &current->pending.signal,
                  &current->signal->shared_pending.signal);
        spin_unlock_irq(&current->sighand->siglock);
 
        /* Outside the lock because only this thread touches it.  */
-       sigandsets(&pending, &current->blocked, &pending);
-
-       error = -EFAULT;
-       if (!copy_to_user(set, &pending, sigsetsize))
-               error = 0;
-
-out:
-       return error;
+       sigandsets(set, &current->blocked, set);
+       return 0;
 }
 
 /**
@@ -2646,10 +2685,35 @@ out:
  *  @set: stores pending signals
  *  @sigsetsize: size of sigset_t type or larger
  */
-SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, set, size_t, sigsetsize)
+SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, uset, size_t, sigsetsize)
 {
-       return do_sigpending(set, sigsetsize);
+       sigset_t set;
+       int err = do_sigpending(&set, sigsetsize);
+       if (!err && copy_to_user(uset, &set, sigsetsize))
+               err = -EFAULT;
+       return err;
+}
+
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
+               compat_size_t, sigsetsize)
+{
+#ifdef __BIG_ENDIAN
+       sigset_t set;
+       int err = do_sigpending(&set, sigsetsize);
+       if (!err) {
+               compat_sigset_t set32;
+               sigset_to_compat(&set32, &set);
+               /* we can get here only if sigsetsize <= sizeof(set) */
+               if (copy_to_user(uset, &set32, sigsetsize))
+                       err = -EFAULT;
+       }
+       return err;
+#else
+       return sys_rt_sigpending((sigset_t __user *)uset, sigsetsize);
+#endif
 }
+#endif
 
 #ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER
 
@@ -2927,6 +2991,22 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig)
        return do_tkill(0, pid, sig);
 }
 
+static int do_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t *info)
+{
+       /* Not even root can pretend to send signals from the kernel.
+        * Nor can they impersonate a kill()/tgkill(), which adds source info.
+        */
+       if (info->si_code >= 0 || info->si_code == SI_TKILL) {
+               /* We used to allow any < 0 si_code */
+               WARN_ON_ONCE(info->si_code < 0);
+               return -EPERM;
+       }
+       info->si_signo = sig;
+
+       /* POSIX.1b doesn't mention process groups.  */
+       return kill_proc_info(sig, info, pid);
+}
+
 /**
  *  sys_rt_sigqueueinfo - send signal information to a signal
  *  @pid: the PID of the thread
@@ -2937,25 +3017,26 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig,
                siginfo_t __user *, uinfo)
 {
        siginfo_t info;
-
        if (copy_from_user(&info, uinfo, sizeof(siginfo_t)))
                return -EFAULT;
+       return do_rt_sigqueueinfo(pid, sig, &info);
+}
 
-       /* Not even root can pretend to send signals from the kernel.
-        * Nor can they impersonate a kill()/tgkill(), which adds source info.
-        */
-       if (info.si_code >= 0 || info.si_code == SI_TKILL) {
-               /* We used to allow any < 0 si_code */
-               WARN_ON_ONCE(info.si_code < 0);
-               return -EPERM;
-       }
-       info.si_signo = sig;
-
-       /* POSIX.1b doesn't mention process groups.  */
-       return kill_proc_info(sig, &info, pid);
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE3(rt_sigqueueinfo,
+                       compat_pid_t, pid,
+                       int, sig,
+                       struct compat_siginfo __user *, uinfo)
+{
+       siginfo_t info;
+       int ret = copy_siginfo_from_user32(&info, uinfo);
+       if (unlikely(ret))
+               return ret;
+       return do_rt_sigqueueinfo(pid, sig, &info);
 }
+#endif
 
-long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info)
+static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info)
 {
        /* This is only valid for single tasks */
        if (pid <= 0 || tgid <= 0)
@@ -2985,6 +3066,21 @@ SYSCALL_DEFINE4(rt_tgsigqueueinfo, pid_t, tgid, pid_t, pid, int, sig,
        return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
 }
 
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(rt_tgsigqueueinfo,
+                       compat_pid_t, tgid,
+                       compat_pid_t, pid,
+                       int, sig,
+                       struct compat_siginfo __user *, uinfo)
+{
+       siginfo_t info;
+
+       if (copy_siginfo_from_user32(&info, uinfo))
+               return -EFAULT;
+       return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
+}
+#endif
+
 int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact)
 {
        struct task_struct *t = current;
@@ -3030,7 +3126,7 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact)
        return 0;
 }
 
-int 
+static int 
 do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp)
 {
        stack_t oss;
@@ -3095,12 +3191,10 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
 out:
        return error;
 }
-#ifdef CONFIG_GENERIC_SIGALTSTACK
 SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss)
 {
        return do_sigaltstack(uss, uoss, current_user_stack_pointer());
 }
-#endif
 
 int restore_altstack(const stack_t __user *uss)
 {
@@ -3118,7 +3212,6 @@ int __save_altstack(stack_t __user *uss, unsigned long sp)
 }
 
 #ifdef CONFIG_COMPAT
-#ifdef CONFIG_GENERIC_SIGALTSTACK
 COMPAT_SYSCALL_DEFINE2(sigaltstack,
                        const compat_stack_t __user *, uss_ptr,
                        compat_stack_t __user *, uoss_ptr)
@@ -3168,7 +3261,6 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp)
                __put_user(t->sas_ss_size, &uss->ss_size);
 }
 #endif
-#endif
 
 #ifdef __ARCH_WANT_SYS_SIGPENDING
 
@@ -3178,7 +3270,7 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp)
  */
 SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set)
 {
-       return do_sigpending(set, sizeof(*set));
+       return sys_rt_sigpending((sigset_t __user *)set, sizeof(old_sigset_t)); 
 }
 
 #endif
@@ -3234,7 +3326,7 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset,
 }
 #endif /* __ARCH_WANT_SYS_SIGPROCMASK */
 
-#ifdef __ARCH_WANT_SYS_RT_SIGACTION
+#ifndef CONFIG_ODD_RT_SIGACTION
 /**
  *  sys_rt_sigaction - alter an action taken by a process
  *  @sig: signal to be sent
@@ -3268,7 +3360,132 @@ SYSCALL_DEFINE4(rt_sigaction, int, sig,
 out:
        return ret;
 }
-#endif /* __ARCH_WANT_SYS_RT_SIGACTION */
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE4(rt_sigaction, int, sig,
+               const struct compat_sigaction __user *, act,
+               struct compat_sigaction __user *, oact,
+               compat_size_t, sigsetsize)
+{
+       struct k_sigaction new_ka, old_ka;
+       compat_sigset_t mask;
+#ifdef __ARCH_HAS_SA_RESTORER
+       compat_uptr_t restorer;
+#endif
+       int ret;
+
+       /* XXX: Don't preclude handling different sized sigset_t's.  */
+       if (sigsetsize != sizeof(compat_sigset_t))
+               return -EINVAL;
+
+       if (act) {
+               compat_uptr_t handler;
+               ret = get_user(handler, &act->sa_handler);
+               new_ka.sa.sa_handler = compat_ptr(handler);
+#ifdef __ARCH_HAS_SA_RESTORER
+               ret |= get_user(restorer, &act->sa_restorer);
+               new_ka.sa.sa_restorer = compat_ptr(restorer);
+#endif
+               ret |= copy_from_user(&mask, &act->sa_mask, sizeof(mask));
+               ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
+               if (ret)
+                       return -EFAULT;
+               sigset_from_compat(&new_ka.sa.sa_mask, &mask);
+       }
+
+       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+       if (!ret && oact) {
+               sigset_to_compat(&mask, &old_ka.sa.sa_mask);
+               ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), 
+                              &oact->sa_handler);
+               ret |= copy_to_user(&oact->sa_mask, &mask, sizeof(mask));
+               ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+#ifdef __ARCH_HAS_SA_RESTORER
+               ret |= put_user(ptr_to_compat(old_ka.sa.sa_restorer),
+                               &oact->sa_restorer);
+#endif
+       }
+       return ret;
+}
+#endif
+#endif /* !CONFIG_ODD_RT_SIGACTION */
+
+#ifdef CONFIG_OLD_SIGACTION
+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;
+#ifdef __ARCH_HAS_KA_RESTORER
+               new_ka.ka_restorer = NULL;
+#endif
+               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;
+}
+#endif
+#ifdef CONFIG_COMPAT_OLD_SIGACTION
+COMPAT_SYSCALL_DEFINE3(sigaction, int, sig,
+               const struct compat_old_sigaction __user *, act,
+               struct compat_old_sigaction __user *, oact)
+{
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+       compat_old_sigset_t mask;
+       compat_uptr_t handler, restorer;
+
+       if (act) {
+               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
+                   __get_user(handler, &act->sa_handler) ||
+                   __get_user(restorer, &act->sa_restorer) ||
+                   __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
+                   __get_user(mask, &act->sa_mask))
+                       return -EFAULT;
+
+#ifdef __ARCH_HAS_KA_RESTORER
+               new_ka.ka_restorer = NULL;
+#endif
+               new_ka.sa.sa_handler = compat_ptr(handler);
+               new_ka.sa.sa_restorer = compat_ptr(restorer);
+               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(ptr_to_compat(old_ka.sa.sa_handler),
+                              &oact->sa_handler) ||
+                   __put_user(ptr_to_compat(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;
+}
+#endif
 
 #ifdef __ARCH_WANT_SYS_SGETMASK
 
@@ -3336,7 +3553,6 @@ int sigsuspend(sigset_t *set)
        return -ERESTARTNOHAND;
 }
 
-#ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND
 /**
  *  sys_rt_sigsuspend - replace the signal mask for a value with the
  *     @unewset value until a signal is received
@@ -3355,7 +3571,45 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize)
                return -EFAULT;
        return sigsuspend(&newset);
 }
-#endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */
+#ifdef CONFIG_COMPAT
+COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_size_t, sigsetsize)
+{
+#ifdef __BIG_ENDIAN
+       sigset_t newset;
+       compat_sigset_t newset32;
+
+       /* XXX: Don't preclude handling different sized sigset_t's.  */
+       if (sigsetsize != sizeof(sigset_t))
+               return -EINVAL;
+
+       if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t)))
+               return -EFAULT;
+       sigset_from_compat(&newset, &newset32);
+       return sigsuspend(&newset);
+#else
+       /* on little-endian bitmaps don't care about granularity */
+       return sys_rt_sigsuspend((sigset_t __user *)unewset, sigsetsize);
+#endif
+}
+#endif
+
+#ifdef CONFIG_OLD_SIGSUSPEND
+SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
+{
+       sigset_t blocked;
+       siginitset(&blocked, mask);
+       return sigsuspend(&blocked);
+}
+#endif
+#ifdef CONFIG_OLD_SIGSUSPEND3
+SYSCALL_DEFINE3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask)
+{
+       sigset_t blocked;
+       siginitset(&blocked, mask);
+       return sigsuspend(&blocked);
+}
+#endif
 
 __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma)
 {