Skip to content

Commit

Permalink
microblaze: Fix sys_clone syscall
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michal Simek committed Aug 4, 2010
1 parent 79aac88 commit 570e3e2
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions arch/microblaze/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit 570e3e2

Please sign in to comment.