openrisc: switch to use of generic fork and clone
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 26 Oct 2012 23:37:49 +0000 (19:37 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 29 Nov 2012 04:43:40 +0000 (23:43 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/openrisc/include/asm/syscalls.h
arch/openrisc/include/uapi/asm/unistd.h
arch/openrisc/kernel/Makefile
arch/openrisc/kernel/entry.S
arch/openrisc/kernel/process.c
arch/openrisc/kernel/sys_or32.c [deleted file]

index 84a978a..8ee8168 100644 (file)
@@ -24,4 +24,11 @@ asmlinkage long sys_or1k_atomic(unsigned long type, unsigned long *v1,
 
 #include <asm-generic/syscalls.h>
 
+asmlinkage long __sys_clone(unsigned long clone_flags, unsigned long newsp,
+                       void __user *parent_tid, void __user *child_tid, int tls);
+asmlinkage long __sys_fork(void);
+
+#define sys_clone __sys_clone
+#define sys_fork __sys_fork
+
 #endif /* __ASM_OPENRISC_SYSCALLS_H */
index 5db7bc0..5082b80 100644 (file)
@@ -21,6 +21,8 @@
 #define sys_mmap2 sys_mmap_pgoff
 
 #define __ARCH_WANT_SYS_EXECVE
+#define __ARCH_WANT_SYS_FORK
+#define __ARCH_WANT_SYS_CLONE
 
 #include <asm-generic/unistd.h>
 
index e1ee0fa..35f92ce 100644 (file)
@@ -5,7 +5,7 @@
 extra-y        := head.o vmlinux.lds
 
 obj-y  := setup.o idle.o or32_ksyms.o process.o dma.o \
-          traps.o time.o irq.o entry.o ptrace.o signal.o sys_or32.o \
+          traps.o time.o irq.o entry.o ptrace.o signal.o \
           sys_call_table.o
 
 obj-$(CONFIG_MODULES)          += module.o
index c60a09d..5e5b306 100644 (file)
@@ -1071,15 +1071,15 @@ _fork_save_extra_regs_and_call:
        l.jr    r29
         l.sw    PT_GPR28(r1),r28
 
-ENTRY(sys_clone)
-       l.movhi r29,hi(_sys_clone)
-       l.ori   r29,r29,lo(_sys_clone)
+ENTRY(__sys_clone)
+       l.movhi r29,hi(sys_clone)
+       l.ori   r29,r29,lo(sys_clone)
        l.j     _fork_save_extra_regs_and_call
         l.addi r7,r1,0
 
-ENTRY(sys_fork)
-       l.movhi r29,hi(_sys_fork)
-       l.ori   r29,r29,lo(_sys_fork)
+ENTRY(__sys_fork)
+       l.movhi r29,hi(sys_fork)
+       l.ori   r29,r29,lo(sys_fork)
        l.j     _fork_save_extra_regs_and_call
         l.addi r3,r1,0
 
index e0874b8..6b85366 100644 (file)
@@ -168,9 +168,10 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
                kregs->gpr[20] = usp; /* fn, kernel thread */
                kregs->gpr[22] = arg;
        } else {
-               *userregs = *regs;
+               *userregs = *current_pt_regs();
 
-               userregs->sp = usp;
+               if (usp)
+                       userregs->sp = usp;
                userregs->gpr[11] = 0;  /* Result from fork() */
 
                kregs->gpr[20] = 0;     /* Userspace thread */
diff --git a/arch/openrisc/kernel/sys_or32.c b/arch/openrisc/kernel/sys_or32.c
deleted file mode 100644 (file)
index 5706008..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * OpenRISC sys_or32.c
- *
- * Linux architectural port borrowing liberally from similar works of
- * others.  All original copyrights apply as per the original source
- * declaration.
- *
- * Modifications for the OpenRISC architecture:
- * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
- * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
- *
- *      This program is free software; you can redistribute it and/or
- *      modify it under the terms of the GNU General Public License
- *      as published by the Free Software Foundation; either version
- *      2 of the License, or (at your option) any later version.
- *
- * This file contains various random system calls that
- * have a non-standard calling sequence on some platforms.
- * Since we don't have to do any backwards compatibility, our
- * versions are done in the most "normal" way possible.
- */
-
-#include <linux/errno.h>
-#include <linux/syscalls.h>
-#include <linux/mm.h>
-
-#include <asm/syscalls.h>
-
-/* These are secondary entry points as the primary entry points are defined in
- * entry.S where we add the 'regs' parameter value
- */
-
-asmlinkage long _sys_clone(unsigned long clone_flags, unsigned long newsp,
-                          int __user *parent_tid, int __user *child_tid,
-                          struct pt_regs *regs)
-{
-       long ret;
-
-       /* FIXME: Is alignment necessary? */
-       /* newsp = ALIGN(newsp, 4); */
-
-       if (!newsp)
-               newsp = regs->sp;
-
-       ret = do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
-
-       return ret;
-}
-
-asmlinkage int _sys_fork(struct pt_regs *regs)
-{
-#ifdef CONFIG_MMU
-       return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
-#else
-       return -EINVAL;
-#endif
-}