]> git.neil.brown.name Git - history.git/commitdiff
ppc64: Add sys_restart_syscall, from ppc32
authorAnton Blanchard <anton@samba.org>
Mon, 9 Dec 2002 00:00:33 +0000 (11:00 +1100)
committerAnton Blanchard <anton@samba.org>
Mon, 9 Dec 2002 00:00:33 +0000 (11:00 +1100)
arch/ppc64/kernel/misc.S
arch/ppc64/kernel/signal.c
arch/ppc64/kernel/signal32.c
include/asm-ppc64/errno.h
include/asm-ppc64/thread_info.h
include/asm-ppc64/unistd.h

index 3230b82ae9dd06a180573dc689391d3c4e222fd2..a91729af66e857d4733ccd5cb1a6947a021b275b 100644 (file)
@@ -508,7 +508,7 @@ _GLOBAL(kernel_thread)
 /* Why isn't this a) automatic, b) written in 'C'? */  
        .balign 8
 _GLOBAL(sys_call_table32)
-       .llong .sys_ni_syscall          /* 0 - old setup syscall */
+       .llong .sys_restart_syscall     /* 0 */
        .llong .sys_exit
        .llong .sys_fork
        .llong .sys_read
@@ -756,7 +756,7 @@ _GLOBAL(sys_call_table32)
 
        .balign 8
 _GLOBAL(sys_call_table)
-       .llong .sys_ni_syscall          /* 0 - old setup syscall */
+       .llong .sys_restart_syscall     /* 0 */
        .llong .sys_exit
        .llong .sys_fork
        .llong .sys_read
index be3a7401ac64bac27b5430e5d755db976ae5d31a..7075d62c7e209b63ce91afc0c02158efa7ae5c22 100644 (file)
@@ -450,9 +450,14 @@ static void handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
 
        if (regs->trap == 0x0C00 /* System Call! */
            && ((int)regs->result == -ERESTARTNOHAND ||
+               (int)regs->result == -ERESTART_RESTARTBLOCK ||
                ((int)regs->result == -ERESTARTSYS &&
-                !(ka->sa.sa_flags & SA_RESTART))))
+                !(ka->sa.sa_flags & SA_RESTART)))) {
+               if ((int)regs->result == -ERESTART_RESTARTBLOCK)
+                       current_thread_info()->restart_block.fn
+                               = do_no_restart_syscall;
                regs->result = -EINTR;
+       }
 
        /* Set up Signal Frame */
        if (ka->sa.sa_flags & SA_SIGINFO) {
@@ -560,13 +565,18 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
                handle_signal(signr, &info, oldset, regs, &newsp, frame);
        }
 
-       if (regs->trap == 0x0C00 /* System Call! */ &&
-           ((int)regs->result == -ERESTARTNOHAND ||
-            (int)regs->result == -ERESTARTSYS ||
-            (int)regs->result == -ERESTARTNOINTR)) {
-               regs->gpr[3] = regs->orig_gpr3;
-               regs->nip -= 4;         /* Back up & retry system call */
-               regs->result = 0;
+       if (regs->trap == 0x0C00) {     /* System Call! */
+               if ((int)regs->result == -ERESTARTNOHAND ||
+                   (int)regs->result == -ERESTARTSYS ||
+                   (int)regs->result == -ERESTARTNOINTR) {
+                       regs->gpr[3] = regs->orig_gpr3;
+                       regs->nip -= 4; /* Back up & retry system call */
+                       regs->result = 0;
+               } else if ((int)regs->result == -ERESTART_RESTARTBLOCK) {
+                       regs->gpr[0] = __NR_restart_syscall;
+                       regs->nip -= 4;
+                       regs->result = 0;
+               }
        }
 
        if (newsp == frame)
index ef53d56bb274e12d341f9645e3e7102180b7e68e..ef722cd2058f8aa896e97625e51de380459d2d1c 100644 (file)
@@ -968,9 +968,14 @@ static void handle_signal32(unsigned long sig, siginfo_t *info,
 
        if (regs->trap == 0x0C00 /* System Call! */
            && ((int)regs->result == -ERESTARTNOHAND ||
+               (int)regs->result == -ERESTART_RESTARTBLOCK ||
                ((int)regs->result == -ERESTARTSYS &&
-                !(ka->sa.sa_flags & SA_RESTART))))
+                !(ka->sa.sa_flags & SA_RESTART)))) {
+               if ((int)regs->result == -ERESTART_RESTARTBLOCK)
+                       current_thread_info()->restart_block.fn
+                               = do_no_restart_syscall;
                regs->result = -EINTR;
+       }
 
        /*
         * Set up the signal frame
@@ -1132,13 +1137,18 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs)
                handle_signal32(signr, &info, oldset, regs, &newsp, frame);
        }
 
-       if (regs->trap == 0x0C00 /* System Call! */ &&
-           ((int)regs->result == -ERESTARTNOHAND ||
-            (int)regs->result == -ERESTARTSYS ||
-            (int)regs->result == -ERESTARTNOINTR)) {
-               regs->gpr[3] = regs->orig_gpr3;
-               regs->nip -= 4;         /* Back up & retry system call */
-               regs->result = 0;
+       if (regs->trap == 0x0C00) {     /* System Call! */
+               if ((int)regs->result == -ERESTARTNOHAND ||
+                   (int)regs->result == -ERESTARTSYS ||
+                   (int)regs->result == -ERESTARTNOINTR) {
+                       regs->gpr[3] = regs->orig_gpr3;
+                       regs->nip -= 4; /* Back up & retry system call */
+                       regs->result = 0;
+               } else if ((int)regs->result == -ERESTART_RESTARTBLOCK) {
+                       regs->gpr[0] = __NR_restart_syscall;
+                       regs->nip -= 4;
+                       regs->result = 0;
+               }
        }
 
        if (newsp == frame)
index 1e3a86bd0595bb8d8d4621de240c8ec85f5edf20..69bc3b0c6cbed3808c55346015870918bbf7b3f4 100644 (file)
 #undef EDEADLOCK
 #define        EDEADLOCK       58      /* File locking deadlock error */
 
-/* Should never be seen by user programs */
-#define ERESTARTSYS    512
-#define ERESTARTNOINTR 513
-#define ERESTARTNOHAND 514     /* restart if no handler.. */
-#define ENOIOCTLCMD    515     /* No ioctl command */
-
-#define _LAST_ERRNO    515
+#define _LAST_ERRNO    516
 
 #endif
index 7a52e78711dc2e6bb02a6b1138f65869ff32e3c2..6328a1cb563a5c64aeb127e29aa8df5b86c687a0 100644 (file)
@@ -23,6 +23,7 @@ struct thread_info {
        unsigned long   flags;                  /* low level flags */
        int             cpu;                    /* cpu we're on */
        int             preempt_count;          /* not used at present */
+       struct restart_block restart_block;
 };
 
 /*
@@ -37,6 +38,9 @@ struct thread_info {
        .flags =        0,                      \
        .cpu =          0,                      \
        .preempt_count = 1,                     \
+       .restart_block = {                      \
+               .fn = do_no_restart_syscall,    \
+       },                                      \
 }
 
 #define init_thread_info       (init_thread_union.thread_info)
index 0b0eed3980a90326e05a3a2794fc9a1456f45a29..93a6f0176353fae1b617ec1cfa9082848c848cf9 100644 (file)
@@ -10,6 +10,7 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#define __NR_restart_syscall     0
 #define __NR_exit                1
 #define __NR_fork                2
 #define __NR_read                3