Blackfin: add support for restart_syscall()
authorMike Frysinger <vapier@gentoo.org>
Fri, 29 Jan 2010 01:33:54 +0000 (01:33 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 9 Mar 2010 05:30:51 +0000 (00:30 -0500)
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/kernel/signal.c

index 28d6f28c058c41ea90940fc90cc060df8aaac6ea..d536f35d1f439475f6f658202a10bd8f544158d1 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/cacheflush.h>
 #include <asm/ucontext.h>
 #include <asm/fixed_code.h>
+#include <asm/syscall.h>
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
@@ -50,6 +51,9 @@ rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *p
        unsigned long usp = 0;
        int err = 0;
 
+       /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
 #define RESTORE(x) err |= __get_user(regs->x, &sc->sc_##x)
 
        /* restore passed registers */
@@ -237,6 +241,11 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
                regs->r0 = regs->orig_r0;
                regs->pc -= 2;
                break;
+
+       case -ERESTART_RESTARTBLOCK:
+               regs->p0 = __NR_restart_syscall;
+               regs->pc -= 2;
+               break;
        }
 }