Hi Geert,

Geert Uytterhoeven wrote:
FYI...

Thanks for the pointer. I have tested and queued up a similar
change for m68knommu.

Regards
Greg



---------- Forwarded message ----------
Date: Mon, 29 Dec 2008 19:34:57 +0100
From: Andreas Schwab <sch...@suse.de>
To: linux-m...@vger.kernel.org
Subject: [PATCH] m68k: wire up sys_restart_syscall

Make restart blocks working, required for proper syscall restarting.

Signed-off-by: Andreas Schwab <sch...@suse.de>
---
 arch/m68k/kernel/entry.S  |    2 +-
 arch/m68k/kernel/signal.c |   15 +++++++++++++++
 include/asm-m68k/unistd.h |    4 +---
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
index f28404d..5b78082 100644
--- a/arch/m68k/kernel/entry.S
+++ b/arch/m68k/kernel/entry.S
@@ -424,7 +424,7 @@ resume:
 .data
 ALIGN
 sys_call_table:
-       .long sys_ni_syscall    /* 0  -  old "setup()" system call*/
+       .long sys_restart_syscall       /* 0 - old "setup()" system call, used 
for restarting */
        .long sys_exit
        .long sys_fork
        .long sys_read
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index d1e9220..842bfd9 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -348,6 +348,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext 
__user *usc, void __u
        struct sigcontext context;
        int err;
+ /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
        /* get previous context */
        if (copy_from_user(&context, usc, sizeof(context)))
                goto badframe;
@@ -433,6 +436,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct 
switch_stack *sw,
        unsigned long usp;
        int err;
+ /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
        err = __get_user(temp, &uc->uc_mcontext.version);
        if (temp != MCONTEXT_VERSION)
                goto badframe;
@@ -959,6 +965,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction 
*ka, int has_handler)
                regs->d0 = -EINTR;
                break;
+ case -ERESTART_RESTARTBLOCK:
+               if (!has_handler) {
+                       regs->d0 = __NR_restart_syscall;
+                       regs->pc -= 2;
+                       break;
+               }
+               regs->d0 = -EINTR;
+               break;
+
        case -ERESTARTSYS:
                if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
                        regs->d0 = -EINTR;
diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h
index 965abb8..3c19027 100644
--- a/include/asm-m68k/unistd.h
+++ b/include/asm-m68k/unistd.h
@@ -5,6 +5,7 @@
  * This file contains the system call numbers.
  */
+#define __NR_restart_syscall 0
 #define __NR_exit                1
 #define __NR_fork                2
 #define __NR_read                3
@@ -359,9 +360,6 @@
 #define __ARCH_WANT_SYS_SIGPROCMASK
 #define __ARCH_WANT_SYS_RT_SIGACTION
-/* whitelist for checksyscalls */
-#define __IGNORE_restart_syscall
-
 /*
  * "Conditional" syscalls
  *

--
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     g...@snapgear.com
SnapGear, a McAfee Company                  PHONE:       +61 7 3435 2888
825 Stanley St,                             FAX:         +61 7 3891 3630
Woolloongabba, QLD, 4102, Australia         WEB: http://www.SnapGear.com
_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to