xref: /xnu-8020.121.3/tests/posix_spawn_archpref.c (revision fdd8201d7b966f0c3ea610489d29bd841d358941)
1*fdd8201dSApple OSS Distributions #include <darwintest.h>
2*fdd8201dSApple OSS Distributions #include <mach-o/dyld.h>
3*fdd8201dSApple OSS Distributions #include <spawn.h>
4*fdd8201dSApple OSS Distributions #include <unistd.h>
5*fdd8201dSApple OSS Distributions #include <sys/wait.h>
6*fdd8201dSApple OSS Distributions 
7*fdd8201dSApple OSS Distributions #include <TargetConditionals.h>
8*fdd8201dSApple OSS Distributions 
9*fdd8201dSApple OSS Distributions static void
run_test(const char * name,cpu_type_t type,cpu_subtype_t subtype)10*fdd8201dSApple OSS Distributions run_test(const char *name, cpu_type_t type, cpu_subtype_t subtype)
11*fdd8201dSApple OSS Distributions {
12*fdd8201dSApple OSS Distributions 	int ret, pid;
13*fdd8201dSApple OSS Distributions 	posix_spawnattr_t spawnattr;
14*fdd8201dSApple OSS Distributions 	char path[1024];
15*fdd8201dSApple OSS Distributions 	uint32_t size = sizeof(path);
16*fdd8201dSApple OSS Distributions 	cpu_type_t cpuprefs[] = { type };
17*fdd8201dSApple OSS Distributions 	cpu_type_t subcpuprefs[] = { subtype };
18*fdd8201dSApple OSS Distributions 
19*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(_NSGetExecutablePath(path, &size), 0, NULL);
20*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_LT(strlcat(path, "_helper", size), (unsigned long)size, NULL);
21*fdd8201dSApple OSS Distributions 
22*fdd8201dSApple OSS Distributions 	ret = posix_spawnattr_init(&spawnattr);
23*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "%s: posix_spawnattr_init", name);
24*fdd8201dSApple OSS Distributions 
25*fdd8201dSApple OSS Distributions 	ret = posix_spawnattr_setarchpref_np(&spawnattr, sizeof(cpuprefs) / sizeof(cpuprefs[0]), cpuprefs, subcpuprefs, NULL);
26*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "%s: posix_spawnattr_setarchpref_np", name);
27*fdd8201dSApple OSS Distributions 
28*fdd8201dSApple OSS Distributions 	ret = posix_spawn(&pid, path, NULL, &spawnattr, NULL, NULL);
29*fdd8201dSApple OSS Distributions 	T_ASSERT_EQ(ret, 0, "%s: posix_spawn should succeed", name);
30*fdd8201dSApple OSS Distributions 
31*fdd8201dSApple OSS Distributions 	int wait_ret = 0;
32*fdd8201dSApple OSS Distributions 	ret = waitpid(pid, &wait_ret, 0);
33*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(ret, pid, "%s: child pid", name);
34*fdd8201dSApple OSS Distributions 
35*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(WIFEXITED(wait_ret), 1, "%s: child process should have called exit()", name);
36*fdd8201dSApple OSS Distributions 
37*fdd8201dSApple OSS Distributions 	if (subtype != CPU_SUBTYPE_ANY) {
38*fdd8201dSApple OSS Distributions 		T_ASSERT_EQ(WEXITSTATUS(wait_ret), subtype, "%s: child process should be running with %d subtype", name, subtype);
39*fdd8201dSApple OSS Distributions 	}
40*fdd8201dSApple OSS Distributions 
41*fdd8201dSApple OSS Distributions 	ret = posix_spawnattr_destroy(&spawnattr);
42*fdd8201dSApple OSS Distributions 	T_QUIET; T_ASSERT_EQ(ret, 0, "%s: posix_spawnattr_destroy", name);
43*fdd8201dSApple OSS Distributions }
44*fdd8201dSApple OSS Distributions 
45*fdd8201dSApple OSS Distributions T_DECL(posix_spawn_archpref, "verify posix_spawn_setarchpref_np can select slices")
46*fdd8201dSApple OSS Distributions {
47*fdd8201dSApple OSS Distributions #if defined(__x86_64__)
48*fdd8201dSApple OSS Distributions 	run_test("x86_64", CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_ALL);
49*fdd8201dSApple OSS Distributions #endif /* defined(__x86_64__) */
50*fdd8201dSApple OSS Distributions 	/* macOS does not build a arm64 slice */
51*fdd8201dSApple OSS Distributions #if defined(__arm64__) && defined(__LP64__) && !TARGET_OS_OSX
52*fdd8201dSApple OSS Distributions 	run_test("arm64", CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL);
53*fdd8201dSApple OSS Distributions #endif /* defined(__arm64__) && defined(__LP64__) */
54*fdd8201dSApple OSS Distributions #if defined(__arm64e__)
55*fdd8201dSApple OSS Distributions 	run_test("arm64e", CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64E);
56*fdd8201dSApple OSS Distributions #endif /* defined(__arm64e__) */
57*fdd8201dSApple OSS Distributions 
58*fdd8201dSApple OSS Distributions #if defined(__x86_64__)
59*fdd8201dSApple OSS Distributions 	run_test("any (x86_64)", CPU_TYPE_X86_64, CPU_SUBTYPE_ANY);
60*fdd8201dSApple OSS Distributions #elif defined(__arm64__) && defined(__LP64__)
61*fdd8201dSApple OSS Distributions 	run_test("any (arm64)", CPU_TYPE_ARM64, CPU_SUBTYPE_ANY);
62*fdd8201dSApple OSS Distributions #elif defined(__arm64__)
63*fdd8201dSApple OSS Distributions 	run_test("any (arm64_32)", CPU_TYPE_ARM64_32, CPU_SUBTYPE_ANY);
64*fdd8201dSApple OSS Distributions #elif defined(__arm__)
65*fdd8201dSApple OSS Distributions 	run_test("any (arm)", CPU_TYPE_ARM, CPU_SUBTYPE_ANY);
66*fdd8201dSApple OSS Distributions #else
67*fdd8201dSApple OSS Distributions #error unknown architecture
68*fdd8201dSApple OSS Distributions #endif
69*fdd8201dSApple OSS Distributions }
70