xref: /xnu-8796.141.3/tests/vm/ios13extended_footprint.c (revision 1b191cb58250d0705d8a51287127505aa4bc0789)
1 #include <darwintest.h>
2 
3 #include <sys/sysctl.h>
4 #include <sys/errno.h>
5 #include <sys/kern_memorystatus.h>
6 #include <unistd.h>
7 
8 T_GLOBAL_META(
9 	T_META_NAMESPACE("xnu.vm"),
10 	T_META_RADAR_COMPONENT_NAME("xnu"),
11 	T_META_RADAR_COMPONENT_VERSION("VM"));
12 
13 T_DECL(ios13extended_footprint_entitled, "Verify entitled memory limit can be set and queried")
14 {
15 	int ret;
16 	uint64_t memsize = 0;
17 	size_t memsize_size = sizeof(memsize);
18 	int32_t ios13extended_footprint_limit_mb = 0;
19 	size_t ios13extended_footprint_limit_mb_size = sizeof(ios13extended_footprint_limit_mb);
20 
21 	memorystatus_memlimit_properties2_t mmprops;
22 
23 	ret = sysctlbyname("hw.memsize", &memsize, &memsize_size, NULL, 0);
24 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "call sysctlbyname to get memsize.");
25 
26 	if (memsize < 1500ULL * 1024 * 1024 ||
27 	    memsize > 2ULL * 1024 * 1024 * 1024) {
28 		T_SKIP("This entitlement is only supported on 2GB devices");
29 	}
30 
31 	ret = sysctlbyname("kern.ios13extended_footprint_limit_mb", &ios13extended_footprint_limit_mb, &ios13extended_footprint_limit_mb_size, NULL, 0);
32 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "call sysctlbyname to get extended limit.");
33 
34 	mmprops.v1.memlimit_active = -1;
35 	mmprops.v1.memlimit_inactive = -1;
36 	ret = memorystatus_control(MEMORYSTATUS_CMD_SET_MEMLIMIT_PROPERTIES, getpid(), 0, &mmprops.v1, sizeof(mmprops.v1));
37 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "memorystatus_control");
38 
39 	/* Check our memlimt */
40 	ret = memorystatus_control(MEMORYSTATUS_CMD_GET_MEMLIMIT_PROPERTIES, getpid(), 0, &mmprops, sizeof(mmprops));
41 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "memorystatus_control");
42 
43 	T_QUIET; T_ASSERT_EQ(mmprops.v1.memlimit_active, ios13extended_footprint_limit_mb, "active limit");
44 	T_QUIET; T_ASSERT_EQ(mmprops.v1.memlimit_inactive, ios13extended_footprint_limit_mb, "inactive limit");
45 
46 	/* Verify MEMORYSTATUS_CMD_CONVERT_MEMLIMIT_MB */
47 	ret = memorystatus_control(MEMORYSTATUS_CMD_CONVERT_MEMLIMIT_MB, getpid(), (uint32_t) -1, NULL, 0);
48 	T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "memorystatus_control");
49 	T_QUIET; T_ASSERT_EQ(ret, ios13extended_footprint_limit_mb, "got extended footprint");
50 }
51