Commit 39d91a9e authored by Al Viro's avatar Al Viro

openrisc: switch to use of generic fork and clone

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent cb562173
...@@ -24,4 +24,11 @@ asmlinkage long sys_or1k_atomic(unsigned long type, unsigned long *v1, ...@@ -24,4 +24,11 @@ asmlinkage long sys_or1k_atomic(unsigned long type, unsigned long *v1,
#include <asm-generic/syscalls.h> #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 */ #endif /* __ASM_OPENRISC_SYSCALLS_H */
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#define sys_mmap2 sys_mmap_pgoff #define sys_mmap2 sys_mmap_pgoff
#define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_CLONE
#include <asm-generic/unistd.h> #include <asm-generic/unistd.h>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
extra-y := head.o vmlinux.lds extra-y := head.o vmlinux.lds
obj-y := setup.o idle.o or32_ksyms.o process.o dma.o \ 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 sys_call_table.o
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
......
...@@ -1071,15 +1071,15 @@ _fork_save_extra_regs_and_call: ...@@ -1071,15 +1071,15 @@ _fork_save_extra_regs_and_call:
l.jr r29 l.jr r29
l.sw PT_GPR28(r1),r28 l.sw PT_GPR28(r1),r28
ENTRY(sys_clone) ENTRY(__sys_clone)
l.movhi r29,hi(_sys_clone) l.movhi r29,hi(sys_clone)
l.ori r29,r29,lo(_sys_clone) l.ori r29,r29,lo(sys_clone)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r7,r1,0 l.addi r7,r1,0
ENTRY(sys_fork) ENTRY(__sys_fork)
l.movhi r29,hi(_sys_fork) l.movhi r29,hi(sys_fork)
l.ori r29,r29,lo(_sys_fork) l.ori r29,r29,lo(sys_fork)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r3,r1,0 l.addi r3,r1,0
......
...@@ -168,9 +168,10 @@ copy_thread(unsigned long clone_flags, unsigned long usp, ...@@ -168,9 +168,10 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
kregs->gpr[20] = usp; /* fn, kernel thread */ kregs->gpr[20] = usp; /* fn, kernel thread */
kregs->gpr[22] = arg; kregs->gpr[22] = arg;
} else { } else {
*userregs = *regs; *userregs = *current_pt_regs();
userregs->sp = usp; if (usp)
userregs->sp = usp;
userregs->gpr[11] = 0; /* Result from fork() */ userregs->gpr[11] = 0; /* Result from fork() */
kregs->gpr[20] = 0; /* Userspace thread */ kregs->gpr[20] = 0; /* Userspace thread */
......
/*
* 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
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment