1*d4514f0bSApple OSS Distributions #include <stdio.h>
2*d4514f0bSApple OSS Distributions #include <stdlib.h>
3*d4514f0bSApple OSS Distributions #include <unistd.h>
4*d4514f0bSApple OSS Distributions #include <string.h>
5*d4514f0bSApple OSS Distributions #include <sys/sysctl.h>
6*d4514f0bSApple OSS Distributions
7*d4514f0bSApple OSS Distributions #include <darwintest.h>
8*d4514f0bSApple OSS Distributions #include "test_utils.h"
9*d4514f0bSApple OSS Distributions #include "sched_test_utils.h"
10*d4514f0bSApple OSS Distributions
11*d4514f0bSApple OSS Distributions T_GLOBAL_META(T_META_NAMESPACE("xnu.scheduler"),
12*d4514f0bSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"),
13*d4514f0bSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("scheduler"),
14*d4514f0bSApple OSS Distributions T_META_TAG_VM_NOT_ELIGIBLE);
15*d4514f0bSApple OSS Distributions
16*d4514f0bSApple OSS Distributions static void
get_device_name(char * device_name,size_t device_name_len)17*d4514f0bSApple OSS Distributions get_device_name(char *device_name, size_t device_name_len)
18*d4514f0bSApple OSS Distributions {
19*d4514f0bSApple OSS Distributions int ret;
20*d4514f0bSApple OSS Distributions ret = sysctlbyname("hw.target", device_name, &device_name_len, NULL, 0);
21*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname hw.target");
22*d4514f0bSApple OSS Distributions }
23*d4514f0bSApple OSS Distributions
24*d4514f0bSApple OSS Distributions static void
get_kern_version(char * kern_version,size_t kern_version_len)25*d4514f0bSApple OSS Distributions get_kern_version(char *kern_version, size_t kern_version_len)
26*d4514f0bSApple OSS Distributions {
27*d4514f0bSApple OSS Distributions int ret;
28*d4514f0bSApple OSS Distributions ret = sysctlbyname("kern.version", kern_version, &kern_version_len, NULL, 0);
29*d4514f0bSApple OSS Distributions T_QUIET; T_ASSERT_EQ(ret, 0, "sysctlbyname kern.version");
30*d4514f0bSApple OSS Distributions }
31*d4514f0bSApple OSS Distributions
32*d4514f0bSApple OSS Distributions static bool
platform_is_arm64(void)33*d4514f0bSApple OSS Distributions platform_is_arm64(void)
34*d4514f0bSApple OSS Distributions {
35*d4514f0bSApple OSS Distributions int ret;
36*d4514f0bSApple OSS Distributions int is_arm64 = 0;
37*d4514f0bSApple OSS Distributions size_t is_arm64_size = sizeof(is_arm64);
38*d4514f0bSApple OSS Distributions ret = sysctlbyname("hw.optional.arm64", &is_arm64, &is_arm64_size, NULL, 0);
39*d4514f0bSApple OSS Distributions return ret == 0 && is_arm64;
40*d4514f0bSApple OSS Distributions }
41*d4514f0bSApple OSS Distributions
42*d4514f0bSApple OSS Distributions
43*d4514f0bSApple OSS Distributions T_DECL(enabled_policy, "Verify that the expected scheduler policy is running", XNU_T_META_SOC_SPECIFIC)
44*d4514f0bSApple OSS Distributions {
45*d4514f0bSApple OSS Distributions char *policy_name = platform_sched_policy();
46*d4514f0bSApple OSS Distributions
47*d4514f0bSApple OSS Distributions size_t device_name_len = 256;
48*d4514f0bSApple OSS Distributions char device_name[device_name_len];
49*d4514f0bSApple OSS Distributions get_device_name(device_name, device_name_len);
50*d4514f0bSApple OSS Distributions T_LOG("Current device: %s", device_name);
51*d4514f0bSApple OSS Distributions
52*d4514f0bSApple OSS Distributions size_t kern_version_len = 256;
53*d4514f0bSApple OSS Distributions char kern_version[kern_version_len];
54*d4514f0bSApple OSS Distributions get_kern_version(kern_version, kern_version_len);
55*d4514f0bSApple OSS Distributions T_LOG("Kernel version: %s", kern_version);
56*d4514f0bSApple OSS Distributions
57*d4514f0bSApple OSS Distributions if (!platform_is_arm64()) {
58*d4514f0bSApple OSS Distributions T_SKIP("Skipping test on non-arm64 platform");
59*d4514f0bSApple OSS Distributions }
60*d4514f0bSApple OSS Distributions if (strstr(device_name, "DEV") != NULL) {
61*d4514f0bSApple OSS Distributions T_SKIP("Skipping test on DEV hardware");
62*d4514f0bSApple OSS Distributions }
63*d4514f0bSApple OSS Distributions if (strstr(device_name, "SIM") != NULL) {
64*d4514f0bSApple OSS Distributions T_SKIP("Skipping test on simulator");
65*d4514f0bSApple OSS Distributions }
66*d4514f0bSApple OSS Distributions
67*d4514f0bSApple OSS Distributions if (!platform_is_amp()) {
68*d4514f0bSApple OSS Distributions T_ASSERT_EQ_STR(policy_name, "clutch", "SMP platform should be running the Clutch scheduler");
69*d4514f0bSApple OSS Distributions T_END;
70*d4514f0bSApple OSS Distributions }
71*d4514f0bSApple OSS Distributions
72*d4514f0bSApple OSS Distributions
73*d4514f0bSApple OSS Distributions T_ASSERT_EQ_STR(policy_name, "edge", "Non-exempt AMP platform should be running the Edge scheduler");
74*d4514f0bSApple OSS Distributions }
75