diff options
author | Michal Simek <monstr@monstr.eu> | 2010-06-04 07:06:27 -0400 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2010-08-04 04:22:32 -0400 |
commit | 570e3e236efdf5bb4a023ecc3601dad9273a011e (patch) | |
tree | 3f5d51d66dfca708a39b568f00384195936285a6 /arch/microblaze/kernel/entry.S | |
parent | 79aac889037027bebf7fcfc4cf9f2eb25f4f8075 (diff) |
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>
Diffstat (limited to 'arch/microblaze/kernel/entry.S')
-rw-r--r-- | arch/microblaze/kernel/entry.S | 14 |
1 files 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): | |||
476 | 476 | ||
477 | C_ENTRY(sys_clone): | 477 | C_ENTRY(sys_clone): |
478 | bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ | 478 | bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ |
479 | lwi r6, r1, PTO+PT_R1; /* If so, use paret's stack ptr */ | 479 | lwi r6, r1, PTO + PT_R1; /* If so, use paret's stack ptr */ |
480 | 1: la r7, r1, PTO; /* Arg 2: parent context */ | 480 | 1: add r10, r0, r9; /* Arg 6: (child_tidptr) */ |
481 | add r8, r0, r0; /* Arg 3: (unused) */ | 481 | add r9, r0, r8; /* Arg 5: (parent_tidptr) */ |
482 | add r9, r0, r0; /* Arg 4: (unused) */ | 482 | add r8, r0, r7; /* Arg 4: (stack_size) */ |
483 | add r10, r0, r0; /* Arg 5: (unused) */ | 483 | la r7, r1, PTO; /* Arg 3: pt_regs */ |
484 | brid do_fork /* Do real work (tail-call) */ | 484 | brid do_fork /* Do real work (tail-call) */ |
485 | nop; | 485 | nop |
486 | 486 | ||
487 | C_ENTRY(sys_execve): | 487 | C_ENTRY(sys_execve): |
488 | la r8, r1, PTO; /* add user context as 4th arg */ | 488 | la r8, r1, PTO; /* add user context as 4th arg */ |