xref: /xnu-8019.80.24/tests/zero_to_n_tests.c (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1*a325d9c4SApple OSS Distributions #include <darwintest.h>
2*a325d9c4SApple OSS Distributions #include <darwintest_utils.h>
3*a325d9c4SApple OSS Distributions #include <stdio.h>
4*a325d9c4SApple OSS Distributions #include <stdlib.h>
5*a325d9c4SApple OSS Distributions #include <stdbool.h>
6*a325d9c4SApple OSS Distributions #include <errno.h>
7*a325d9c4SApple OSS Distributions 
8*a325d9c4SApple OSS Distributions T_GLOBAL_META(
9*a325d9c4SApple OSS Distributions 	T_META_RUN_CONCURRENTLY(false),
10*a325d9c4SApple OSS Distributions 	T_META_BOOTARGS_SET("enable_skstsct=1"),
11*a325d9c4SApple OSS Distributions 	T_META_CHECK_LEAKS(false),
12*a325d9c4SApple OSS Distributions 	T_META_ASROOT(true),
13*a325d9c4SApple OSS Distributions 	T_META_REQUIRES_SYSCTL_EQ("kern.hv_vmm_present", 0),
14*a325d9c4SApple OSS Distributions 	T_META_RADAR_COMPONENT_NAME("xnu"),
15*a325d9c4SApple OSS Distributions 	T_META_RADAR_COMPONENT_VERSION("scheduler"),
16*a325d9c4SApple OSS Distributions 	T_META_OWNER("ngamble")
17*a325d9c4SApple OSS Distributions 	);
18*a325d9c4SApple OSS Distributions 
19*a325d9c4SApple OSS Distributions static void
print_cmd(char ** cmd)20*a325d9c4SApple OSS Distributions print_cmd(char **cmd)
21*a325d9c4SApple OSS Distributions {
22*a325d9c4SApple OSS Distributions 	char *s;
23*a325d9c4SApple OSS Distributions 
24*a325d9c4SApple OSS Distributions 	while ((s = *cmd) != NULL) {
25*a325d9c4SApple OSS Distributions 		printf("%s ", s);
26*a325d9c4SApple OSS Distributions 		cmd++;
27*a325d9c4SApple OSS Distributions 	}
28*a325d9c4SApple OSS Distributions 	printf("\n");
29*a325d9c4SApple OSS Distributions }
30*a325d9c4SApple OSS Distributions 
31*a325d9c4SApple OSS Distributions T_DECL(zn_rt, "Schedule 1 RT thread per performance core, and test max latency", T_META_ENABLED(!TARGET_OS_TV))
32*a325d9c4SApple OSS Distributions {
33*a325d9c4SApple OSS Distributions 	char *cmd[] = {"/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
34*a325d9c4SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
35*a325d9c4SApple OSS Distributions 		       "--spin-time", "200000",
36*a325d9c4SApple OSS Distributions 		       "--spin-all",
37*a325d9c4SApple OSS Distributions 		       "--test-rt",
38*a325d9c4SApple OSS Distributions 		       NULL};
39*a325d9c4SApple OSS Distributions 	print_cmd(cmd);
40*a325d9c4SApple OSS Distributions 
41*a325d9c4SApple OSS Distributions 	pid_t test_pid;
42*a325d9c4SApple OSS Distributions 	int ret = dt_launch_tool(&test_pid, cmd, false, NULL, NULL);
43*a325d9c4SApple OSS Distributions 	if (ret) {
44*a325d9c4SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool() failed unexpectedly with errno %d", errno);
45*a325d9c4SApple OSS Distributions 	}
46*a325d9c4SApple OSS Distributions 
47*a325d9c4SApple OSS Distributions 	int exitstatus;
48*a325d9c4SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
49*a325d9c4SApple OSS Distributions 	if (exitstatus == 0) {
50*a325d9c4SApple OSS Distributions 		T_PASS("zn_rt");
51*a325d9c4SApple OSS Distributions 	} else if (exitstatus == 2) {
52*a325d9c4SApple OSS Distributions 		T_SKIP("zn_rt");
53*a325d9c4SApple OSS Distributions 	} else {
54*a325d9c4SApple OSS Distributions 		T_FAIL("zn_rt");
55*a325d9c4SApple OSS Distributions 	}
56*a325d9c4SApple OSS Distributions 	T_END;
57*a325d9c4SApple OSS Distributions }
58*a325d9c4SApple OSS Distributions 
59*a325d9c4SApple OSS Distributions T_DECL(zn_rt_smt, "Schedule 1 RT thread per primary core, verify that the secondaries are idle iff the RT threads are running", T_META_ASROOT(true), T_META_ENABLED(TARGET_CPU_X86_64))
60*a325d9c4SApple OSS Distributions {
61*a325d9c4SApple OSS Distributions 	char *cmd[] = {"/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
62*a325d9c4SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
63*a325d9c4SApple OSS Distributions 		       "--spin-time", "200000",
64*a325d9c4SApple OSS Distributions 		       "--spin-all",
65*a325d9c4SApple OSS Distributions 		       "--churn-pri", "4",
66*a325d9c4SApple OSS Distributions 		       "--test-rt-smt",
67*a325d9c4SApple OSS Distributions 		       "--intel-only",
68*a325d9c4SApple OSS Distributions 		       NULL};
69*a325d9c4SApple OSS Distributions 	print_cmd(cmd);
70*a325d9c4SApple OSS Distributions 
71*a325d9c4SApple OSS Distributions 	pid_t test_pid;
72*a325d9c4SApple OSS Distributions 	int ret = dt_launch_tool(&test_pid, cmd, false, NULL, NULL);
73*a325d9c4SApple OSS Distributions 	if (ret) {
74*a325d9c4SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool() failed unexpectedly with errno %d", errno);
75*a325d9c4SApple OSS Distributions 	}
76*a325d9c4SApple OSS Distributions 
77*a325d9c4SApple OSS Distributions 	int exitstatus;
78*a325d9c4SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
79*a325d9c4SApple OSS Distributions 	if (exitstatus == 0) {
80*a325d9c4SApple OSS Distributions 		T_PASS("zn_rt_smt");
81*a325d9c4SApple OSS Distributions 	} else if (exitstatus == 2) {
82*a325d9c4SApple OSS Distributions 		T_SKIP("zn_rt_smt");
83*a325d9c4SApple OSS Distributions 	} else {
84*a325d9c4SApple OSS Distributions 		T_FAIL("zn_rt_smt");
85*a325d9c4SApple OSS Distributions 	}
86*a325d9c4SApple OSS Distributions 	T_END;
87*a325d9c4SApple OSS Distributions }
88*a325d9c4SApple OSS Distributions 
89*a325d9c4SApple OSS Distributions T_DECL(zn_rt_avoid0, "Schedule 1 RT thread per primary core except for CPU 0", T_META_ASROOT(true), T_META_ENABLED(TARGET_CPU_X86_64))
90*a325d9c4SApple OSS Distributions {
91*a325d9c4SApple OSS Distributions 	char *cmd[] = {"/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
92*a325d9c4SApple OSS Distributions 		       "0", "broadcast-single-sem", "realtime", "1000",
93*a325d9c4SApple OSS Distributions 		       "--spin-time", "200000",
94*a325d9c4SApple OSS Distributions 		       "--spin-all",
95*a325d9c4SApple OSS Distributions 		       "--test-rt-avoid0",
96*a325d9c4SApple OSS Distributions 		       "--intel-only",
97*a325d9c4SApple OSS Distributions 		       NULL};
98*a325d9c4SApple OSS Distributions 	print_cmd(cmd);
99*a325d9c4SApple OSS Distributions 
100*a325d9c4SApple OSS Distributions 	pid_t test_pid;
101*a325d9c4SApple OSS Distributions 	int ret = dt_launch_tool(&test_pid, cmd, false, NULL, NULL);
102*a325d9c4SApple OSS Distributions 	if (ret) {
103*a325d9c4SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool() failed unexpectedly with errno %d", errno);
104*a325d9c4SApple OSS Distributions 	}
105*a325d9c4SApple OSS Distributions 
106*a325d9c4SApple OSS Distributions 	int exitstatus;
107*a325d9c4SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
108*a325d9c4SApple OSS Distributions 	if (exitstatus == 0) {
109*a325d9c4SApple OSS Distributions 		T_PASS("zn_rt_avoid0");
110*a325d9c4SApple OSS Distributions 	} else if (exitstatus == 2) {
111*a325d9c4SApple OSS Distributions 		T_SKIP("zn_rt_avoid0");
112*a325d9c4SApple OSS Distributions 	} else {
113*a325d9c4SApple OSS Distributions 		T_FAIL("zn_rt_avoid0");
114*a325d9c4SApple OSS Distributions 	}
115*a325d9c4SApple OSS Distributions 	T_END;
116*a325d9c4SApple OSS Distributions }
117*a325d9c4SApple OSS Distributions 
118*a325d9c4SApple OSS Distributions T_DECL(zn_rt_apt, "Emulate AVID Pro Tools with default latency deadlines", T_META_ENABLED(!TARGET_OS_TV))
119*a325d9c4SApple OSS Distributions {
120*a325d9c4SApple OSS Distributions 	char *cmd[] = {"/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
121*a325d9c4SApple OSS Distributions 		       "0", "chain", "realtime", "10000",
122*a325d9c4SApple OSS Distributions 		       "--extra-thread-count", "-3",
123*a325d9c4SApple OSS Distributions 		       "--spin-time", "200000",
124*a325d9c4SApple OSS Distributions 		       "--spin-all",
125*a325d9c4SApple OSS Distributions 		       "--churn-pri", "31", "--churn-random",
126*a325d9c4SApple OSS Distributions 		       "--test-rt",
127*a325d9c4SApple OSS Distributions 		       NULL};
128*a325d9c4SApple OSS Distributions 	print_cmd(cmd);
129*a325d9c4SApple OSS Distributions 
130*a325d9c4SApple OSS Distributions 	pid_t test_pid;
131*a325d9c4SApple OSS Distributions 	int ret = dt_launch_tool(&test_pid, cmd, false, NULL, NULL);
132*a325d9c4SApple OSS Distributions 	if (ret) {
133*a325d9c4SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool() failed unexpectedly with errno %d", errno);
134*a325d9c4SApple OSS Distributions 	}
135*a325d9c4SApple OSS Distributions 
136*a325d9c4SApple OSS Distributions 	int exitstatus;
137*a325d9c4SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
138*a325d9c4SApple OSS Distributions 	if (exitstatus == 0) {
139*a325d9c4SApple OSS Distributions 		T_PASS("zn_rt_apt");
140*a325d9c4SApple OSS Distributions 	} else if (exitstatus == 2) {
141*a325d9c4SApple OSS Distributions 		T_SKIP("zn_rt_apt");
142*a325d9c4SApple OSS Distributions 	} else {
143*a325d9c4SApple OSS Distributions 		T_FAIL("zn_rt_apt");
144*a325d9c4SApple OSS Distributions 	}
145*a325d9c4SApple OSS Distributions 	T_END;
146*a325d9c4SApple OSS Distributions }
147*a325d9c4SApple OSS Distributions 
148*a325d9c4SApple OSS Distributions T_DECL(zn_rt_apt_ll, "Emulate AVID Pro Tools with low latency deadlines")
149*a325d9c4SApple OSS Distributions {
150*a325d9c4SApple OSS Distributions 	char *cmd[] = {"/AppleInternal/CoreOS/tests/xnu/zero-to-n/zn",
151*a325d9c4SApple OSS Distributions 		       "0", "chain", "realtime", "10000",
152*a325d9c4SApple OSS Distributions 		       "--extra-thread-count", "-3",
153*a325d9c4SApple OSS Distributions 		       "--spin-time", "200000",
154*a325d9c4SApple OSS Distributions 		       "--spin-all",
155*a325d9c4SApple OSS Distributions 		       "--churn-pri", "31", "--churn-random",
156*a325d9c4SApple OSS Distributions 		       "--trace", "500000",
157*a325d9c4SApple OSS Distributions 		       "--test-rt",
158*a325d9c4SApple OSS Distributions 		       "--rt-ll",
159*a325d9c4SApple OSS Distributions 		       NULL};
160*a325d9c4SApple OSS Distributions 	print_cmd(cmd);
161*a325d9c4SApple OSS Distributions 
162*a325d9c4SApple OSS Distributions 	pid_t test_pid;
163*a325d9c4SApple OSS Distributions 	int ret = dt_launch_tool(&test_pid, cmd, false, NULL, NULL);
164*a325d9c4SApple OSS Distributions 	if (ret) {
165*a325d9c4SApple OSS Distributions 		T_ASSERT_FAIL("dt_launch_tool() failed unexpectedly with errno %d", errno);
166*a325d9c4SApple OSS Distributions 	}
167*a325d9c4SApple OSS Distributions 
168*a325d9c4SApple OSS Distributions 	int exitstatus;
169*a325d9c4SApple OSS Distributions 	dt_waitpid(test_pid, &exitstatus, NULL, 0);
170*a325d9c4SApple OSS Distributions 	if (exitstatus == 0) {
171*a325d9c4SApple OSS Distributions 		T_PASS("zn_rt_apt_ll");
172*a325d9c4SApple OSS Distributions 	} else if (exitstatus == 2) {
173*a325d9c4SApple OSS Distributions 		T_SKIP("zn_rt_apt_ll");
174*a325d9c4SApple OSS Distributions 	} else {
175*a325d9c4SApple OSS Distributions 		T_FAIL("zn_rt_apt_ll");
176*a325d9c4SApple OSS Distributions 	}
177*a325d9c4SApple OSS Distributions 	T_END;
178*a325d9c4SApple OSS Distributions }
179