]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Add v850 support for `sys_restart_syscall'
authorMiles Bader <miles@lsi.nec.co.jp>
Fri, 20 Dec 2002 14:18:24 +0000 (06:18 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 20 Dec 2002 14:18:24 +0000 (06:18 -0800)
arch/v850/kernel/entry.S
arch/v850/kernel/signal.c
include/asm-v850/current.h
include/asm-v850/processor.h
include/asm-v850/thread_info.h
include/asm-v850/unistd.h

index e5442bde9a7ade0858d51d7d2cf149cc33dc5849..b2d2ae5b33becfe09c4e9b07b5cab3d6eb51365f 100644 (file)
@@ -781,7 +781,7 @@ C_END(trap_table)
        
        .align 4
 C_DATA(sys_call_table):
-       .long CSYM(sys_ni_syscall)      // 0  -  old "setup()" system call
+       .long CSYM(sys_restart_syscall) // 0
        .long CSYM(sys_exit)
        .long sys_fork_wrapper
        .long CSYM(sys_read)
index ff96dd9de7c4f4412efa3be72b6fb194573e6e30..8ea0130c589e78b27afda26f8283586b819df7bd 100644 (file)
@@ -439,19 +439,23 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
        if (PT_REGS_SYSCALL (regs)) {
                /* If so, check system call restarting.. */
                switch (regs->gpr[GPR_RVAL]) {
-                       case -ERESTARTNOHAND:
+               case -ERESTART_RESTARTBLOCK:
+                       current_thread_info()->restart_block.fn =
+                               do_no_restart_syscall;
+                       /* fall through */
+               case -ERESTARTNOHAND:
+                       regs->gpr[GPR_RVAL] = -EINTR;
+                       break;
+
+               case -ERESTARTSYS:
+                       if (!(ka->sa.sa_flags & SA_RESTART)) {
                                regs->gpr[GPR_RVAL] = -EINTR;
                                break;
-
-                       case -ERESTARTSYS:
-                               if (!(ka->sa.sa_flags & SA_RESTART)) {
-                                       regs->gpr[GPR_RVAL] = -EINTR;
-                                       break;
-                               }
+                       }
                        /* fallthrough */
-                       case -ERESTARTNOINTR:
-                               regs->gpr[12] = PT_REGS_SYSCALL (regs);
-                               regs->pc -= 4; /* Size of `trap 0' insn.  */
+               case -ERESTARTNOINTR:
+                       regs->gpr[12] = PT_REGS_SYSCALL (regs);
+                       regs->pc -= 4; /* Size of `trap 0' insn.  */
                }
 
                PT_REGS_SET_SYSCALL (regs, 0);
@@ -510,14 +514,19 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
 
        /* Did we come from a system call? */
        if (PT_REGS_SYSCALL (regs)) {
+               int rval = (int)regs->gpr[GPR_RVAL];
                /* Restart the system call - no handlers present */
-               if (regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTNOHAND ||
-                   regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTSYS ||
-                   regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTNOINTR)
+               if (rval == -ERESTARTNOHAND
+                   || rval == -ERESTARTSYS
+                   || rval == -ERESTARTNOINTR)
                {
                        regs->gpr[12] = PT_REGS_SYSCALL (regs);
                        regs->pc -= 4; /* Size of `trap 0' insn.  */
                }
+               else if (rval == -ERESTART_RESTARTBLOCK) {
+                       regs->gpr[12] = __NR_restart_syscall;
+                       regs->pc -= 4; /* Size of `trap 0' insn.  */
+               }
        }
        return 0;
 }
index 1d470a9b0bbdad82b9a26a910d3528b9d910c2bd..30aae5673770b2b0ec2ddb9fa662ade9bd21cf1e 100644 (file)
 #ifndef __V850_CURRENT_H__
 #define __V850_CURRENT_H__
 
+#ifndef __ASSEMBLY__ /* <linux/thread_info.h> is not asm-safe.  */
+#include <linux/thread_info.h>
+#endif
+
 #include <asm/macrology.h>
-#include <asm/thread_info.h>
 
 
 /* Register used to hold the current task pointer while in the kernel.
index 714b384412c6e26702e1a1b698edaa029c576e6c..978a1e1720f2c18e4ee07b822be9f8fcb53cd353 100644 (file)
 #define __V850_PROCESSOR_H__
 
 #include <linux/config.h>
+#ifndef __ASSEMBLY__ /* <linux/thread_info.h> is not asm-safe.  */
+#include <linux/thread_info.h>
+#endif
 
 #include <asm/ptrace.h>
-#include <asm/thread_info.h>
 #include <asm/entry.h>
 
 /* Some code expects `segment' stuff to be defined here.  */
index be925c583037aad5e7f03230ed2b1ef3574e27d5..3e20d565d5bdd1493775e4d2dfa31c34eedf670d 100644 (file)
@@ -31,15 +31,19 @@ struct thread_info {
        unsigned long           flags;          /* low level flags */
        int                     cpu;            /* cpu we're on */
        int                     preempt_count;
+       struct restart_block    restart_block;
 };
 
-#define INIT_THREAD_INFO(tsk)                  \
-{                                              \
-       .task =         &tsk,                   \
-       .exec_domain =  &default_exec_domain,   \
-       .flags =        0,                      \
-       .cpu =          0,                      \
-       .preempt_count = 1                      \
+#define INIT_THREAD_INFO(tsk)                                                \
+{                                                                            \
+       .task =         &tsk,                                                 \
+       .exec_domain =  &default_exec_domain,                                 \
+       .flags =        0,                                                    \
+       .cpu =          0,                                                    \
+       .preempt_count = 1,                                                   \
+       .restart_block = {                                                    \
+               .fn = do_no_restart_syscall,                                  \
+       },                                                                    \
 }
 
 #define init_thread_info       (init_thread_union.thread_info)
@@ -67,8 +71,6 @@ struct thread_info {
 #define TI_FLAGS       8
 #define TI_CPU         12
 #define TI_PREEMPT     16
-#define TI_SOFTIRQ     20
-#define TI_HARDIRQ     24
 
 #define PREEMPT_ACTIVE         0x4000000
 
index 93939f4124d940d5f90b6b37237b533516f77b50..8eb57aef6db5ffbfb9e96ce141f44979fe20193a 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <asm/clinkage.h>
 
+#define __NR_restart_syscall     0
 #define __NR_exit                1
 #define __NR_fork                2
 #define __NR_read                3