forked from Minki/linux
openrisc: switch to use of generic fork and clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
cb56217362
commit
39d91a9eaf
@ -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 */
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user