tools/nolibc: align sys_vfork() with sys_fork()

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
This commit is contained in:
Thomas Weißschuh 2026-01-04 23:43:13 +01:00
parent 0313992485
commit 57624b38ce
2 changed files with 13 additions and 13 deletions

View 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 */

View 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