summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/kernel-features.h (renamed from sysdeps/unix/sysv/linux/riscv/arch-fork.h)15
-rw-r--r--sysdeps/unix/sysv/linux/alpha/arch-fork.h28
-rw-r--r--sysdeps/unix/sysv/linux/arch-fork.h43
-rw-r--r--sysdeps/unix/sysv/linux/arm/arch-fork.h27
-rw-r--r--sysdeps/unix/sysv/linux/arm/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/createthread.c5
-rw-r--r--sysdeps/unix/sysv/linux/hppa/arch-fork.h32
-rw-r--r--sysdeps/unix/sysv/linux/hppa/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/i386/arch-fork.h27
-rw-r--r--sysdeps/unix/sysv/linux/i386/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/ia64/arch-fork.h31
-rw-r--r--sysdeps/unix/sysv/linux/ia64/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/kernel-features.h35
-rw-r--r--sysdeps/unix/sysv/linux/m68k/arch-fork.h28
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/arch-fork.h27
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/mips/arch-fork.h1
-rw-r--r--sysdeps/unix/sysv/linux/mips/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/nios2/arch-fork.h33
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/arch-fork.h1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/riscv/kernel-features.h (renamed from sysdeps/unix/sysv/linux/aarch64/arch-fork.h)17
-rw-r--r--sysdeps/unix/sysv/linux/s390/arch-fork.h29
-rw-r--r--sysdeps/unix/sysv/linux/s390/kernel-features.h3
-rw-r--r--sysdeps/unix/sysv/linux/sh/arch-fork.h28
-rw-r--r--sysdeps/unix/sysv/linux/sparc/arch-fork.h27
-rw-r--r--sysdeps/unix/sysv/linux/tile/arch-fork.h29
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/arch-fork.h27
28 files changed, 108 insertions, 406 deletions
diff --git a/sysdeps/unix/sysv/linux/riscv/arch-fork.h b/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
index f6f5d73343..9cfa51471c 100644
--- a/sysdeps/unix/sysv/linux/riscv/arch-fork.h
+++ b/sysdeps/unix/sysv/linux/aarch64/kernel-features.h
@@ -1,5 +1,6 @@
-/* Internal definitions for thread-friendly fork implementation.  Linux/RISC-V.
-   Copyright (C) 2002-2018 Free Software Foundation, Inc.
+/* Set flags signalling availability of kernel features based on given
+   kernel version number.  AArch64 version.
+   Copyright (C) 2018 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,11 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sched.h>
-#include <sysdep.h>
-#include <tls.h>
+#include_next <kernel-features.h>
 
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-		  NULL, NULL, &THREAD_SELF->tid)
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS 1
diff --git a/sysdeps/unix/sysv/linux/alpha/arch-fork.h b/sysdeps/unix/sysv/linux/alpha/arch-fork.h
deleted file mode 100644
index 41897dc519..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/arch-fork.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  Alpha version.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-
-#define ARCH_FORK()							\
-  INLINE_SYSCALL (clone, 5,						\
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,	\
-		  NULL, NULL, &THREAD_SELF->tid, NULL)
diff --git a/sysdeps/unix/sysv/linux/arch-fork.h b/sysdeps/unix/sysv/linux/arch-fork.h
index d5f542924f..3daa9651e5 100644
--- a/sysdeps/unix/sysv/linux/arch-fork.h
+++ b/sysdeps/unix/sysv/linux/arch-fork.h
@@ -1,4 +1,4 @@
-/* ARCH_FORK definition for Linux fork implementation.  Stub version.
+/* arch_fork definition for Linux fork implementation.
    Copyright (C) 2014-2018 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,12 +16,37 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* This file should define the function-like macro of no arguments
-   ARCH_FORK to an INLINE_SYSCALL invocation of the clone-like system
-   call, passing the CLONE_CHILD_SETTID and CLONE_CHILD_CLEARTID flags
-   and &THREAD_SELF->tid as the TID address.
+#ifndef __ARCH_FORK_H
+#define __ARCH_FORK_H
 
-   Machines that lack an arch-fork.h header file will hit an #error in
-   fork.c; this stub file doesn't contain an #error itself mainly for
-   the transition period of migrating old machine-specific fork.c files
-   to machine-specific arch-fork.h instead.  */
+#include <unistd.h>
+
+/* Call the clone syscall with fork semantic.  The CTID address is used
+   to store the child thread ID at its locationm, to erase it in child memory
+   when the child exits, and do a wakeup on the futex at that address.
+
+   The architecture with non-default kernel abi semantic should correctlly
+   override it with one of the supported calling convention (check generic
+   kernel-features.h for the clone abi variants).  */
+static inline pid_t
+arch_fork (void *ctid)
+{
+  const int flags = CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD;
+  long int ret;
+#ifdef __ASSUME_CLONE_BACKWARDS
+  ret = INLINE_SYSCALL_CALL (clone, flags, 0, NULL, 0, ctid);
+#elif defined(__ASSUME_CLONE_BACKWARDS2)
+  ret = INLINE_SYSCALL_CALL (clone, 0, flags, NULL, ctid, 0);
+#elif defined(__ASSUME_CLONE_BACKWARDS3)
+  ret = INLINE_SYSCALL_CALL (clone, flags, 0, 0, NULL, ctid, 0);
+#elif defined(__ASSUME_CLONE2)
+  ret = INLINE_SYSCALL_CALL (clone2, flags, 0, 0, NULL, ctid, 0);
+#elif defined(__ASSUME_CLONE_DEFAULT)
+  ret = INLINE_SYSCALL_CALL (clone, flags, 0, NULL, ctid, 0);
+#else
+# error "Undefined clone variant"
+#endif
+  return ret;
+}
+
+#endif /* __ARCH_FORK_H  */
diff --git a/sysdeps/unix/sysv/linux/arm/arch-fork.h b/sysdeps/unix/sysv/linux/arm/arch-fork.h
deleted file mode 100644
index ff3bc90b15..0000000000
--- a/sysdeps/unix/sysv/linux/arm/arch-fork.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  ARM version.
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <sysdep.h>
-#include <tls.h>
-
-
-#define ARCH_FORK()                                                     \
-  INLINE_SYSCALL (clone, 5,                                             \
-                  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,  \
-                  NULL, NULL, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h
index f13632b9be..7831ab1e0f 100644
--- a/sysdeps/unix/sysv/linux/arm/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h
@@ -39,3 +39,6 @@
 
 #define __ASSUME_RECV_SYSCALL   1
 #define __ASSUME_SEND_SYSCALL	1
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/createthread.c b/sysdeps/unix/sysv/linux/createthread.c
index 5b5464a827..5879e51bd2 100644
--- a/sysdeps/unix/sysv/linux/createthread.c
+++ b/sysdeps/unix/sysv/linux/createthread.c
@@ -28,8 +28,9 @@
 
 #include <arch-fork.h>
 
-
-#ifndef ARCH_CLONE
+#ifdef __NR_clone2
+# define ARCH_CLONE __clone2
+#else
 # define ARCH_CLONE __clone
 #endif
 
diff --git a/sysdeps/unix/sysv/linux/hppa/arch-fork.h b/sysdeps/unix/sysv/linux/hppa/arch-fork.h
deleted file mode 100644
index 7d52994915..0000000000
--- a/sysdeps/unix/sysv/linux/hppa/arch-fork.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  HPPA version.
-   Copyright (C) 2005-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-/* Argument 1 - Clone flags.
-            2 - Child stack pointer.
-	    3 - Parent tid pointer.
-	    4 - New TLS area pointer.
-	    5 - Child tid pointer. */
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						\
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,	\
-                  NULL, NULL, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/sysdeps/unix/sysv/linux/hppa/kernel-features.h
index 3f005a5f2e..ef3c4ddfd7 100644
--- a/sysdeps/unix/sysv/linux/hppa/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/hppa/kernel-features.h
@@ -32,3 +32,6 @@
 #if __LINUX_KERNEL_VERSION < 0x040000
 # undef __ASSUME_EXECVEAT
 #endif
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS 1
diff --git a/sysdeps/unix/sysv/linux/i386/arch-fork.h b/sysdeps/unix/sysv/linux/i386/arch-fork.h
deleted file mode 100644
index 0c43e2fc5c..0000000000
--- a/sysdeps/unix/sysv/linux/i386/arch-fork.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Internal definitions for thread-friendly fork implementation.  Linux/i386.
-   Copyright (C) 2002-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-		  NULL, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h
index 87087125e5..f3cfd48c44 100644
--- a/sysdeps/unix/sysv/linux/i386/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h
@@ -48,3 +48,6 @@
 
 /* i686 only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/ia64/arch-fork.h b/sysdeps/unix/sysv/linux/ia64/arch-fork.h
deleted file mode 100644
index 522712ea15..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/arch-fork.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  IA64 version.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone2, 6,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,	      \
-		  NULL, 0, NULL, &THREAD_SELF->tid, NULL)
-
-#define ARCH_CLONE __clone2
diff --git a/sysdeps/unix/sysv/linux/ia64/kernel-features.h b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
index cc3fe92d42..04cdf43511 100644
--- a/sysdeps/unix/sysv/linux/ia64/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/ia64/kernel-features.h
@@ -26,4 +26,7 @@
 #define __ASSUME_SEND_SYSCALL		1
 #define __ASSUME_ACCEPT4_SYSCALL	1
 
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE2
+
 #endif /* _KERNEL_FEATURES_H */
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index 3aa2052c71..f65a262994 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -115,3 +115,38 @@
 #if __LINUX_KERNEL_VERSION >= 0x040500
 # define __ASSUME_COPY_FILE_RANGE 1
 #endif
+
+/* Support for clone call used on fork.  The signature varies across the
+   architectures with current 4 different variants:
+
+   1. long int clone (unsigned long flags, unsigned long newsp,
+		      int *parent_tidptr, unsigned long tls,
+		      int *child_tidptr)
+
+   2. long int clone (unsigned long newsp, unsigned long clone_flags,
+		      int *parent_tidptr, int * child_tidptr,
+		      unsigned long tls)
+
+   3. long int clone (unsigned long flags, unsigned long newsp,
+		      int stack_size, int *parent_tidptr,
+		      int *child_tidptr, unsigned long tls)
+
+   4. long int clone (unsigned long flags, unsigned long newsp,
+		      int *parent_tidptr, int *child_tidptr,
+		      unsigned long tls)
+
+   The fourth variant is intended to be used as the default for newer ports,
+   Also IA64 uses the third variant but with __NR_clone2 instead of
+   __NR_clone.
+
+   The macros names to define the variant used for the architecture is
+   similar to kernel:
+
+   - __ASSUME_CLONE_BACKWARDS: for variant 1.
+   - __ASSUME_CLONE_BACKWARDS2: for variant 2 (s390).
+   - __ASSUME_CLONE_BACKWARDS3: for variant 3 (microblaze).
+   - __ASSUME_CLONE_DEFAULT: for variant 4.
+   - __ASSUME_CLONE2: for clone2 with variant 3 (ia64).
+   */
+
+#define __ASSUME_CLONE_DEFAULT 1
diff --git a/sysdeps/unix/sysv/linux/m68k/arch-fork.h b/sysdeps/unix/sysv/linux/m68k/arch-fork.h
deleted file mode 100644
index 20b6bab8e9..0000000000
--- a/sysdeps/unix/sysv/linux/m68k/arch-fork.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  m68k version.
-   Copyright (C) 2010-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Maxim Kuvyrkov <maxim@codesourcery.com>, 2010.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-		  NULL, &THREAD_SELF->tid, NULL)
diff --git a/sysdeps/unix/sysv/linux/microblaze/arch-fork.h b/sysdeps/unix/sysv/linux/microblaze/arch-fork.h
deleted file mode 100644
index 05ed4fae5a..0000000000
--- a/sysdeps/unix/sysv/linux/microblaze/arch-fork.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  MicroBlaze version.
-   Copyright (C) 2014-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK()                                                           \
-  INLINE_SYSCALL (clone, 5,                                                   \
-                  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-                  NULL, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
index 745f899911..b13b863f06 100644
--- a/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/microblaze/kernel-features.h
@@ -57,3 +57,6 @@
 #if __LINUX_KERNEL_VERSION < 0x040A00
 # undef __ASSUME_COPY_FILE_RANGE
 #endif
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS3
diff --git a/sysdeps/unix/sysv/linux/mips/arch-fork.h b/sysdeps/unix/sysv/linux/mips/arch-fork.h
deleted file mode 100644
index 5f945378ee..0000000000
--- a/sysdeps/unix/sysv/linux/mips/arch-fork.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/i386/arch-fork.h>
diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
index 7756a3495b..ce798ccffe 100644
--- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -47,3 +47,6 @@
 #if _MIPS_SIM == _ABIN32
 # define __ASSUME_WORDSIZE64_ILP32	1
 #endif
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/nios2/arch-fork.h b/sysdeps/unix/sysv/linux/nios2/arch-fork.h
deleted file mode 100644
index 6dacec2688..0000000000
--- a/sysdeps/unix/sysv/linux/nios2/arch-fork.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  Nios II version.
-   Copyright (C) 2005-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-/* Argument 1 - Clone flags.
-            2 - Child stack pointer.
-	    3 - Parent tid pointer.
-	    4 - Child tid pointer.
-	    5 - New TLS area pointer. */
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						\
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,	\
-                  NULL, NULL, &THREAD_SELF->tid, NULL)
diff --git a/sysdeps/unix/sysv/linux/powerpc/arch-fork.h b/sysdeps/unix/sysv/linux/powerpc/arch-fork.h
deleted file mode 100644
index 5f945378ee..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/arch-fork.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/i386/arch-fork.h>
diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
index f3c02e6ec2..503f562d76 100644
--- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
@@ -49,3 +49,6 @@
 
 /* powerpc only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS	1
diff --git a/sysdeps/unix/sysv/linux/aarch64/arch-fork.h b/sysdeps/unix/sysv/linux/riscv/kernel-features.h
index cab797efe8..37f4d99a92 100644
--- a/sysdeps/unix/sysv/linux/aarch64/arch-fork.h
+++ b/sysdeps/unix/sysv/linux/riscv/kernel-features.h
@@ -1,5 +1,6 @@
-/* ARCH_FORK definition for Linux fork implementation.  AArch64 version.
-   Copyright (C) 2005-2018 Free Software Foundation, Inc.
+/* Set flags signalling availability of kernel features based on given
+   kernel version number.  RISC-V version.
+   Copyright (C) 2018 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,13 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
+#include_next <kernel-features.h>
 
-
-#define ARCH_FORK()							\
-  INLINE_SYSCALL (clone, 5,						\
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,	\
-		  NULL, NULL, NULL, &THREAD_SELF->tid)
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS 1
diff --git a/sysdeps/unix/sysv/linux/s390/arch-fork.h b/sysdeps/unix/sysv/linux/s390/arch-fork.h
deleted file mode 100644
index 152b465e8b..0000000000
--- a/sysdeps/unix/sysv/linux/s390/arch-fork.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation. S390 version.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						      \
-		  0, CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,     \
-		  NULL, &THREAD_SELF->tid, NULL)
diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h
index 3caca981f1..f718264926 100644
--- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
@@ -50,3 +50,6 @@
 
 /* s390 only supports ipc syscall.  */
 #undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+
+#undef __ASSUME_CLONE_DEFAULT
+#define __ASSUME_CLONE_BACKWARDS2
diff --git a/sysdeps/unix/sysv/linux/sh/arch-fork.h b/sysdeps/unix/sysv/linux/sh/arch-fork.h
deleted file mode 100644
index a29f61c8bb..0000000000
--- a/sysdeps/unix/sysv/linux/sh/arch-fork.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  SH version.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-/* TLS pointer argument is passed as the 5-th argument.  */
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 5,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-		  NULL, &THREAD_SELF->tid, NULL)
diff --git a/sysdeps/unix/sysv/linux/sparc/arch-fork.h b/sysdeps/unix/sysv/linux/sparc/arch-fork.h
deleted file mode 100644
index 03ccc9aeef..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/arch-fork.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  SPARC version.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK() \
-  INLINE_CLONE_SYSCALL (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, \
-			0, NULL, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/tile/arch-fork.h b/sysdeps/unix/sysv/linux/tile/arch-fork.h
deleted file mode 100644
index d0526d880d..0000000000
--- a/sysdeps/unix/sysv/linux/tile/arch-fork.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ARCH_FORK definition for Linux fork implementation.  Tile* version.
-   Copyright (C) 2011-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <signal.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 4,						      \
-		  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD,        \
-		  0, NULL, &THREAD_SELF->tid)
diff --git a/sysdeps/unix/sysv/linux/x86_64/arch-fork.h b/sysdeps/unix/sysv/linux/x86_64/arch-fork.h
deleted file mode 100644
index 4471970f10..0000000000
--- a/sysdeps/unix/sysv/linux/x86_64/arch-fork.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Internal definitions for thread-friendly fork implementation.  Linux/x86_64.
-   Copyright (C) 2003-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sched.h>
-#include <sysdep.h>
-#include <tls.h>
-
-#define ARCH_FORK() \
-  INLINE_SYSCALL (clone, 4,                                                   \
-                  CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0,     \
-                  NULL, &THREAD_SELF->tid)