Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3268edb authored by Al Viro's avatar Al Viro
Browse files

microblaze: switch to generic fork/vfork/clone

parent f01aceac
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+5 −0
Original line number Diff line number Diff line
@@ -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
+0 −8
Original line number Diff line number Diff line
@@ -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
+0 −26
Original line number Diff line number Diff line
@@ -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 */
+5 −3
Original line number Diff line number Diff line
@@ -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,7 +142,8 @@ 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 = *current_pt_regs();
	if (usp)
		childregs->r1 = usp;

	memset(&ti->cpu_context, 0, sizeof(struct cpu_context));
Loading