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