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