@@ -34,7 +34,11 @@ arch_fork (void *ctid)
const int flags = CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD;
long int ret;
#ifdef __ASSUME_CLONE_BACKWARDS
+# ifdef INLINE_CLONE_SYSCALL
+ ret = INLINE_CLONE_SYSCALL (flags, 0, NULL, 0, ctid);
+# else
ret = INLINE_SYSCALL_CALL (clone, flags, 0, NULL, 0, ctid);
+# endif
#elif defined(__ASSUME_CLONE_BACKWARDS2)
ret = INLINE_SYSCALL_CALL (clone, 0, flags, NULL, ctid, 0);
#elif defined(__ASSUME_CLONE_BACKWARDS3)
@@ -40,3 +40,17 @@
/* sparc only supports ipc syscall. */
#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+
+/* SPARC kernel Kconfig does not define CONFIG_CLONE_BACKWARDS, however it
+ has the same ABI as if it did, implemented by sparc-specific code
+ (sparc_do_fork).
+
+ It also has a unique return value convention:
+
+ Parent --> %o0 == child's pid, %o1 == 0
+ Child --> %o0 == parent's pid, %o1 == 1
+
+ Which required a special macro to correct issue the syscall
+ (INLINE_CLONE_SYSCALL). */
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS 1
From: Adhemerval Zanella <adhemerval.zanella@linaro.org> This patch fixes 3dc214977 for sparc. Different than other architectures SPARC kernel Kconfig does not define CONFIG_CLONE_BACKWARDS, however it has the same ABI as if it did, implemented by sparc-specific code (sparc_do_fork). It also has a unique return value convention for clone: Parent --> %o0 == child's pid, %o1 == 0 Child --> %o0 == parent's pid, %o1 == 1 Which required a special macro to correct issue the syscall (INLINE_CLONE_SYSCALL). Checked on sparc64-linux-gnu and sparcv9-linux-gnu. * sysdeps/unix/sysv/linux/arch-fork.h [__ASSUME_CLONE_BACKWARDS] (arch_fork): Issue INLINE_CLONE_SYSCALL if defined. * sysdeps/unix/sysv/linux/sparc/kernel-features.h (__ASSUME_CLONE_BACKWARDS): Define. --- ChangeLog | 7 +++++++ sysdeps/unix/sysv/linux/arch-fork.h | 4 ++++ sysdeps/unix/sysv/linux/sparc/kernel-features.h | 14 ++++++++++++++ 3 files changed, 25 insertions(+) -- 2.14.1