]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: align sys_vfork() with sys_fork()
authorThomas Weißschuh <linux@weissschuh.net>
Sun, 4 Jan 2026 22:43:13 +0000 (23:43 +0100)
committerThomas Weißschuh <linux@weissschuh.net>
Tue, 6 Jan 2026 11:08:10 +0000 (12:08 +0100)
Currently the generic variants of sys_fork() and sys_vfork() differ in
both they precedence of used system calls and the usage of sys_clone()
vs sys_clone3(). While the interface of clone3() in sys_vfork() is more
consistent over different architectures, qemu-user does not support it,
making testing harder. We already handle the different clone()
interfaces for sys_fork() in the architecture-specific headers, and can
do so also for sys_vfork(). In fact SPARC already has such handling and
only s390 is currently missing.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://patch.msgid.link/20260104-nolibc-vfork-v1-1-a63464b9e4e6@weissschuh.net
tools/include/nolibc/arch-s390.h
tools/include/nolibc/sys.h

index 5bee6ecbde0af77840934288d0ddf1d7e538a2c2..904281e95f9996bce5d4de50889a9fe27274bf59 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "types.h"
 
+#include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/unistd.h>
 
@@ -189,4 +190,11 @@ pid_t sys_fork(void)
 }
 #define sys_fork sys_fork
 
+static __attribute__((unused))
+pid_t sys_vfork(void)
+{
+       return my_syscall5(__NR_clone, 0, CLONE_VM | CLONE_VFORK | SIGCHLD, 0, 0, 0);
+}
+#define sys_vfork sys_vfork
+
 #endif /* _NOLIBC_ARCH_S390_H */
index 847af1ccbdc9625fd7cc0c819da2fe1a0929e916..403ee9ce8389d5e24e9c8b662cadefa47e6fa68f 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/time.h>
 #include <linux/auxvec.h>
 #include <linux/fcntl.h> /* for O_* and AT_* */
-#include <linux/sched.h> /* for clone_args */
+#include <linux/sched.h> /* for CLONE_* */
 #include <linux/stat.h>  /* for statx() */
 
 #include "errno.h"
@@ -363,19 +363,11 @@ pid_t fork(void)
 static __attribute__((unused))
 pid_t sys_vfork(void)
 {
-#if defined(__NR_vfork)
+#if defined(__NR_clone)
+       /* See the note in sys_fork(). */
+       return my_syscall5(__NR_clone, CLONE_VM | CLONE_VFORK | SIGCHLD, 0, 0, 0, 0);
+#elif defined(__NR_vfork)
        return my_syscall0(__NR_vfork);
-#else
-       /*
-        * clone() could be used but has different argument orders per
-        * architecture.
-        */
-       struct clone_args args = {
-               .flags          = CLONE_VM | CLONE_VFORK,
-               .exit_signal    = SIGCHLD,
-       };
-
-       return my_syscall2(__NR_clone3, &args, sizeof(args));
 #endif
 }
 #endif