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