mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
microblaze: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
f01aceac61
commit
f3268edbe6
@ -28,6 +28,7 @@ config MICROBLAZE
|
||||
select MODULES_USE_ELF_RELA
|
||||
select GENERIC_KERNEL_THREAD
|
||||
select GENERIC_KERNEL_EXECVE
|
||||
select CLONE_BACKWARDS
|
||||
|
||||
config SWAP
|
||||
def_bool n
|
||||
|
@ -423,6 +423,11 @@
|
||||
#define __ARCH_WANT_SYS_RT_SIGACTION
|
||||
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||
#define __ARCH_WANT_SYS_EXECVE
|
||||
#define __ARCH_WANT_SYS_CLONE
|
||||
#define __ARCH_WANT_SYS_VFORK
|
||||
#ifdef CONFIG_MMU
|
||||
#define __ARCH_WANT_SYS_FORK
|
||||
#endif
|
||||
|
||||
/*
|
||||
* "Conditional" syscalls
|
||||
|
@ -559,14 +559,6 @@ no_work_pending:
|
||||
rtid r14, 0
|
||||
nop
|
||||
|
||||
sys_vfork:
|
||||
brid microblaze_vfork
|
||||
addk r5, r1, r0
|
||||
|
||||
sys_clone:
|
||||
brid microblaze_clone
|
||||
addk r7, r1, r0
|
||||
|
||||
sys_rt_sigreturn_wrapper:
|
||||
brid sys_rt_sigreturn
|
||||
addk r5, r1, r0
|
||||
|
@ -442,18 +442,6 @@ TRAP_return: /* Make global symbol for debugging */
|
||||
nop;
|
||||
|
||||
|
||||
/* These syscalls need access to the struct pt_regs on the stack, so we
|
||||
implement them in assembly (they're basically all wrappers anyway). */
|
||||
|
||||
C_ENTRY(sys_fork_wrapper):
|
||||
addi r5, r0, SIGCHLD /* Arg 0: flags */
|
||||
lwi r6, r1, PT_R1 /* Arg 1: child SP (use parent's) */
|
||||
addik r7, r1, 0 /* Arg 2: parent context */
|
||||
add r8, r0, r0 /* Arg 3: (unused) */
|
||||
add r9, r0, r0; /* Arg 4: (unused) */
|
||||
brid do_fork /* Do real work (tail-call) */
|
||||
add r10, r0, r0; /* Arg 5: (unused) */
|
||||
|
||||
/* This the initial entry point for a new child thread, with an appropriate
|
||||
stack in place that makes it look the the child is in the middle of an
|
||||
syscall. This function is actually `returned to' from switch_thread
|
||||
@ -475,20 +463,6 @@ C_ENTRY(ret_from_kernel_thread):
|
||||
brid ret_from_trap
|
||||
add r3, r0, r0
|
||||
|
||||
C_ENTRY(sys_vfork):
|
||||
brid microblaze_vfork /* Do real work (tail-call) */
|
||||
addik r5, r1, 0
|
||||
|
||||
C_ENTRY(sys_clone):
|
||||
bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */
|
||||
lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */
|
||||
1: addik r7, r1, 0; /* Arg 2: parent context */
|
||||
lwi r9, r1, PT_R8; /* parent tid. */
|
||||
lwi r10, r1, PT_R9; /* child tid. */
|
||||
/* do_fork will pick up TLS from regs->r10. */
|
||||
brid do_fork /* Do real work (tail-call) */
|
||||
add r8, r0, r0; /* Arg 3: (unused) */
|
||||
|
||||
C_ENTRY(sys_rt_sigreturn_wrapper):
|
||||
brid sys_rt_sigreturn /* Do real work */
|
||||
addik r5, r1, 0; /* add user context as 1st arg */
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/pm.h>
|
||||
#include <linux/tick.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/uaccess.h> /* for USER_DS macros */
|
||||
#include <asm/cacheflush.h>
|
||||
@ -120,7 +121,7 @@ void flush_thread(void)
|
||||
|
||||
int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
unsigned long arg,
|
||||
struct task_struct *p, struct pt_regs *regs)
|
||||
struct task_struct *p, struct pt_regs *unused)
|
||||
{
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
struct thread_info *ti = task_thread_info(p);
|
||||
@ -141,8 +142,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
ti->cpu_context.r15 = (unsigned long)ret_from_kernel_thread - 8;
|
||||
return 0;
|
||||
}
|
||||
*childregs = *regs;
|
||||
childregs->r1 = usp;
|
||||
*childregs = *current_pt_regs();
|
||||
if (usp)
|
||||
childregs->r1 = usp;
|
||||
|
||||
memset(&ti->cpu_context, 0, sizeof(struct cpu_context));
|
||||
ti->cpu_context.r1 = (unsigned long)childregs;
|
||||
|
@ -34,20 +34,6 @@
|
||||
|
||||
#include <asm/syscalls.h>
|
||||
|
||||
asmlinkage long microblaze_vfork(struct pt_regs *regs)
|
||||
{
|
||||
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->r1,
|
||||
regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
asmlinkage long microblaze_clone(int flags, unsigned long stack,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
if (!stack)
|
||||
stack = regs->r1;
|
||||
return do_fork(flags, stack, regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, off_t pgoff)
|
||||
|
@ -2,11 +2,7 @@ ENTRY(sys_call_table)
|
||||
.long sys_restart_syscall /* 0 - old "setup()" system call,
|
||||
* used for restarting */
|
||||
.long sys_exit
|
||||
#ifdef CONFIG_MMU
|
||||
.long sys_fork_wrapper
|
||||
#else
|
||||
.long sys_ni_syscall
|
||||
#endif
|
||||
.long sys_fork
|
||||
.long sys_read
|
||||
.long sys_write
|
||||
.long sys_open /* 5 */
|
||||
|
Loading…
Reference in New Issue
Block a user