From 570e3e236efdf5bb4a023ecc3601dad9273a011e Mon Sep 17 00:00:00 2001
From: Michal Simek <monstr@monstr.eu>
Date: Fri, 4 Jun 2010 13:06:27 +0200
Subject: [PATCH] microblaze: Fix sys_clone syscall

sys_clone syscall ignored args which this patch mapped to args
which are passing from glibc.

Here is the origin problem description.

"I ran the static libgcc tests (very few of them are there, they are
mostly dynamically linked) and some of  them fail with an assertion in
fork() system call (tid != pid), I looked at the microblaze/entry.S
file and it looks suspicious (ignores arguments 3-5)"

Arg mapping should be:
glibc ARCH_FORK(...) -> do_fork(...)
r5 -> r5   (clone_flags)
r6  -> r6 (stack_start, use parent->stack if NULL)
pt_regs -> r7 (pt_regs)
r7 -> r8 (stack_size)
r8 -> r9 (parent_tidptr)
r9 -> r10 (child_tidptr)

Signed-off-by: John Williams <john.williams@petalogix.com>
Signed-off-by: Michal Simek <monstr@monstr.eu>
---
 arch/microblaze/kernel/entry.S | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S
index c0ede25c5b99..077377a5d0ca 100644
--- a/arch/microblaze/kernel/entry.S
+++ b/arch/microblaze/kernel/entry.S
@@ -476,13 +476,13 @@ C_ENTRY(sys_vfork):
 
 C_ENTRY(sys_clone):
 	bnei	r6, 1f;			/* See if child SP arg (arg 1) is 0. */
-	lwi	r6, r1, PTO+PT_R1;	/* If so, use paret's stack ptr */
-1:	la	r7, r1, PTO;			/* Arg 2: parent context */
-	add	r8, r0, r0;			/* Arg 3: (unused) */
-	add	r9, r0, r0;			/* Arg 4: (unused) */
-	add	r10, r0, r0;			/* Arg 5: (unused) */
-	brid	do_fork		/* Do real work (tail-call) */
-	nop;
+	lwi	r6, r1, PTO + PT_R1;	/* If so, use paret's stack ptr */
+1:	add	r10, r0, r9;		/* Arg 6: (child_tidptr) */
+	add	r9, r0, r8;		/* Arg 5: (parent_tidptr) */
+	add	r8, r0, r7;		/* Arg 4: (stack_size) */
+	la	r7, r1, PTO;		/* Arg 3: pt_regs  */
+	brid	do_fork			/* Do real work (tail-call) */
+	nop
 
 C_ENTRY(sys_execve):
 	la	r8, r1, PTO;		/* add user context as 4th arg */