summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2013-12-21 13:18:29 +0100
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2014-01-22 21:04:39 +0100
commita7e8c6aa9b192075f17774c0bbdf6829f41ba62f (patch)
treeda9e8b70c1fbb1fa83cb66b05e33265b634093c3 /libc/sysdeps/linux/common
parent09055cc18569c4c69e60af506e08b64ae06d3f9f (diff)
libc: fix MIPS N64 fork
fork() is broken for MIPS64 N64 ABI. You can check it with a simple C program statically linked with qemu-mips64 user emulation. Internally fork() is using the clone system call (at least with NPTL) with 5 arguments. See ./libpthread/nptl/sysdeps/unix/sysv/linux/i386/fork.c. The calling conventions for MIPS N32 and N64 allow to use up to 8 registers for that. See http://en.wikipedia.org/wiki/Calling_convention#MIPS This is correctly implemented in libc/sysdeps/linux/mips/bits/syscalls.h, but not in libc/sysdeps/linux/mips/sysdep.h. fork.c uses the later one. It seems that fork() works fine for MIPS64 N32 with just using the stack like with the O32 case. There is a user of INLINE_SYSCALL with 7 arguments in libc/sysdeps/linux/common/sync_file_range.c for MIPS64 N32, so I decided to only use the macros for the MIPS64 N64 case. With this patch my uClibc based Linux system boots up fine in qemu-system-mips64. Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'libc/sysdeps/linux/common')
0 files changed, 0 insertions, 0 deletions