xref: /openbmc/linux/tools/testing/selftests/clone3/clone3_selftests.h (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
141585bbeSAdrian Reber /* SPDX-License-Identifier: GPL-2.0 */
241585bbeSAdrian Reber 
341585bbeSAdrian Reber #ifndef _CLONE3_SELFTESTS_H
441585bbeSAdrian Reber #define _CLONE3_SELFTESTS_H
541585bbeSAdrian Reber 
641585bbeSAdrian Reber #define _GNU_SOURCE
741585bbeSAdrian Reber #include <sched.h>
89bd5910dSChristian Brauner #include <linux/sched.h>
99bd5910dSChristian Brauner #include <linux/types.h>
1041585bbeSAdrian Reber #include <stdint.h>
1141585bbeSAdrian Reber #include <syscall.h>
129bd5910dSChristian Brauner #include <sys/wait.h>
139bd5910dSChristian Brauner 
149bd5910dSChristian Brauner #include "../kselftest.h"
1541585bbeSAdrian Reber 
1641585bbeSAdrian Reber #define ptr_to_u64(ptr) ((__u64)((uintptr_t)(ptr)))
1741585bbeSAdrian Reber 
189bd5910dSChristian Brauner #ifndef CLONE_INTO_CGROUP
199bd5910dSChristian Brauner #define CLONE_INTO_CGROUP 0x200000000ULL /* Clone into a specific cgroup given the right permissions. */
209bd5910dSChristian Brauner #endif
219bd5910dSChristian Brauner 
2241585bbeSAdrian Reber #ifndef __NR_clone3
2341585bbeSAdrian Reber #define __NR_clone3 -1
24*e953aeaaSKees Cook #endif
25*e953aeaaSKees Cook 
26*e953aeaaSKees Cook struct __clone_args {
2741585bbeSAdrian Reber 	__aligned_u64 flags;
2841585bbeSAdrian Reber 	__aligned_u64 pidfd;
2941585bbeSAdrian Reber 	__aligned_u64 child_tid;
3041585bbeSAdrian Reber 	__aligned_u64 parent_tid;
3141585bbeSAdrian Reber 	__aligned_u64 exit_signal;
3241585bbeSAdrian Reber 	__aligned_u64 stack;
3341585bbeSAdrian Reber 	__aligned_u64 stack_size;
3441585bbeSAdrian Reber 	__aligned_u64 tls;
35*e953aeaaSKees Cook #ifndef CLONE_ARGS_SIZE_VER0
36*e953aeaaSKees Cook #define CLONE_ARGS_SIZE_VER0 64	/* sizeof first published struct */
37*e953aeaaSKees Cook #endif
3841585bbeSAdrian Reber 	__aligned_u64 set_tid;
3941585bbeSAdrian Reber 	__aligned_u64 set_tid_size;
40*e953aeaaSKees Cook #ifndef CLONE_ARGS_SIZE_VER1
41*e953aeaaSKees Cook #define CLONE_ARGS_SIZE_VER1 80	/* sizeof second published struct */
42*e953aeaaSKees Cook #endif
439bd5910dSChristian Brauner 	__aligned_u64 cgroup;
44*e953aeaaSKees Cook #ifndef CLONE_ARGS_SIZE_VER2
45*e953aeaaSKees Cook #define CLONE_ARGS_SIZE_VER2 88	/* sizeof third published struct */
46*e953aeaaSKees Cook #endif
4741585bbeSAdrian Reber };
4841585bbeSAdrian Reber 
sys_clone3(struct __clone_args * args,size_t size)49*e953aeaaSKees Cook static pid_t sys_clone3(struct __clone_args *args, size_t size)
5041585bbeSAdrian Reber {
514f5c289eSAndrei Vagin 	fflush(stdout);
524f5c289eSAndrei Vagin 	fflush(stderr);
5341585bbeSAdrian Reber 	return syscall(__NR_clone3, args, size);
5441585bbeSAdrian Reber }
5541585bbeSAdrian Reber 
test_clone3_supported(void)5611fde161SChristian Brauner static inline void test_clone3_supported(void)
5711fde161SChristian Brauner {
5811fde161SChristian Brauner 	pid_t pid;
59*e953aeaaSKees Cook 	struct __clone_args args = {};
6011fde161SChristian Brauner 
6111fde161SChristian Brauner 	if (__NR_clone3 < 0)
6211fde161SChristian Brauner 		ksft_exit_skip("clone3() syscall is not supported\n");
6311fde161SChristian Brauner 
6411fde161SChristian Brauner 	/* Set to something that will always cause EINVAL. */
6511fde161SChristian Brauner 	args.exit_signal = -1;
6611fde161SChristian Brauner 	pid = sys_clone3(&args, sizeof(args));
6711fde161SChristian Brauner 	if (!pid)
6811fde161SChristian Brauner 		exit(EXIT_SUCCESS);
6911fde161SChristian Brauner 
7011fde161SChristian Brauner 	if (pid > 0) {
7111fde161SChristian Brauner 		wait(NULL);
7211fde161SChristian Brauner 		ksft_exit_fail_msg(
7311fde161SChristian Brauner 			"Managed to create child process with invalid exit_signal\n");
7411fde161SChristian Brauner 	}
7511fde161SChristian Brauner 
7611fde161SChristian Brauner 	if (errno == ENOSYS)
7711fde161SChristian Brauner 		ksft_exit_skip("clone3() syscall is not supported\n");
7811fde161SChristian Brauner 
7911fde161SChristian Brauner 	ksft_print_msg("clone3() syscall supported\n");
8011fde161SChristian Brauner }
8111fde161SChristian Brauner 
8241585bbeSAdrian Reber #endif /* _CLONE3_SELFTESTS_H */
83