summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2021-01-21 08:20:26 +0100
committerPaul E. McKenney <paulmck@kernel.org>2021-01-21 10:06:44 -0800
commitbe60ca41fbaa93bc8f92b24e34d8cc62af41300d (patch)
treeaf3031c5f156ad307d8774922eaad563423ddd8e /tools
parentc0c7c103756fee25aadfd5c36f7b86e318f9abb4 (diff)
downloadlinux-stable-be60ca41fbaa93bc8f92b24e34d8cc62af41300d.tar.gz
linux-stable-be60ca41fbaa93bc8f92b24e34d8cc62af41300d.tar.bz2
linux-stable-be60ca41fbaa93bc8f92b24e34d8cc62af41300d.zip
tools/nolibc: Implement fork() based on clone()
Some archs such as arm64 do not have fork() and have to use clone() instead. This commit therefore makes fork() use clone() when available. This requires including signal.h to get the definition of SIGCHLD. This is a port of nolibc's upstream commit d2dc42fd6149 to the Linux kernel. Fixes: 66b6f755ad45 ("rcutorture: Import a copy of nolibc") Tested-by: Valentin Schneider <valentin.schneider@arm.com> Tested-by: Mark Rutland <mark.rutland@arm.com> [arm64] Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/include/nolibc/nolibc.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/tools/include/nolibc/nolibc.h b/tools/include/nolibc/nolibc.h
index 9209da89044a..fdd5524e0e54 100644
--- a/tools/include/nolibc/nolibc.h
+++ b/tools/include/nolibc/nolibc.h
@@ -271,6 +271,8 @@ struct stat {
#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
#define WIFEXITED(status) (((status) & 0x7f) == 0)
+/* for SIGCHLD */
+#include <asm/signal.h>
/* Below comes the architecture-specific code. For each architecture, we have
* the syscall declarations and the _start code definition. This is the only
@@ -1529,7 +1531,15 @@ int sys_execve(const char *filename, char *const argv[], char *const envp[])
static __attribute__((unused))
pid_t sys_fork(void)
{
+#ifdef __NR_clone
+ /* note: some archs only have clone() and not fork(). Different archs
+ * have a different API, but most archs have the flags on first arg and
+ * will not use the rest with no other flag.
+ */
+ return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0);
+#else
return my_syscall0(__NR_fork);
+#endif
}
static __attribute__((unused))