1*4d495c6eSApple OSS Distributions #include <unistd.h> 2*4d495c6eSApple OSS Distributions #include <errno.h> 3*4d495c6eSApple OSS Distributions 4*4d495c6eSApple OSS Distributions #include <vm_statistics.h> 5*4d495c6eSApple OSS Distributions #include <mach/mach.h> 6*4d495c6eSApple OSS Distributions #include <mach_debug/mach_debug.h> 7*4d495c6eSApple OSS Distributions 8*4d495c6eSApple OSS Distributions #include <darwintest.h> 9*4d495c6eSApple OSS Distributions 10*4d495c6eSApple OSS Distributions /* 11*4d495c6eSApple OSS Distributions * Ensure that mach_memory_info includes a counter for the kernelcache size. 12*4d495c6eSApple OSS Distributions */ 13*4d495c6eSApple OSS Distributions 14*4d495c6eSApple OSS Distributions T_GLOBAL_META( 15*4d495c6eSApple OSS Distributions T_META_NAMESPACE("xnu.vm"), 16*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_NAME("xnu"), 17*4d495c6eSApple OSS Distributions T_META_RADAR_COMPONENT_VERSION("VM")); 18*4d495c6eSApple OSS Distributions 19*4d495c6eSApple OSS Distributions T_DECL(vm_kern_count_wired_kernelcache, 20*4d495c6eSApple OSS Distributions "mach_memory_info returns a counter for for kernelcache", 21*4d495c6eSApple OSS Distributions T_META_ASROOT(true), T_META_TAG_VM_PREFERRED) 22*4d495c6eSApple OSS Distributions { 23*4d495c6eSApple OSS Distributions kern_return_t kr; 24*4d495c6eSApple OSS Distributions uint64_t i; 25*4d495c6eSApple OSS Distributions mach_zone_name_t *name = NULL; 26*4d495c6eSApple OSS Distributions unsigned int nameCnt = 0; 27*4d495c6eSApple OSS Distributions mach_zone_info_t *info = NULL; 28*4d495c6eSApple OSS Distributions unsigned int infoCnt = 0; 29*4d495c6eSApple OSS Distributions mach_memory_info_t *wiredInfo = NULL; 30*4d495c6eSApple OSS Distributions unsigned int wiredInfoCnt = 0; 31*4d495c6eSApple OSS Distributions 32*4d495c6eSApple OSS Distributions kr = mach_memory_info(mach_host_self(), &name, &nameCnt, &info, &infoCnt, 33*4d495c6eSApple OSS Distributions &wiredInfo, &wiredInfoCnt); 34*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "mach_memory_info"); 35*4d495c6eSApple OSS Distributions 36*4d495c6eSApple OSS Distributions bool found_kernelcache_counter = false; 37*4d495c6eSApple OSS Distributions uint64_t static_kernelcache_size = 0; 38*4d495c6eSApple OSS Distributions uint64_t wired_memory_boot = 0; 39*4d495c6eSApple OSS Distributions for (i = 0; i < wiredInfoCnt; i++) { 40*4d495c6eSApple OSS Distributions const mach_memory_info_t *curr = &wiredInfo[i]; 41*4d495c6eSApple OSS Distributions uint32_t type = curr->flags & VM_KERN_SITE_TYPE; 42*4d495c6eSApple OSS Distributions if (type == VM_KERN_SITE_COUNTER) { 43*4d495c6eSApple OSS Distributions if (curr->site == VM_KERN_COUNT_WIRED_STATIC_KERNELCACHE) { 44*4d495c6eSApple OSS Distributions found_kernelcache_counter = true; 45*4d495c6eSApple OSS Distributions static_kernelcache_size = curr->size; 46*4d495c6eSApple OSS Distributions } else if (curr->site == VM_KERN_COUNT_WIRED_BOOT) { 47*4d495c6eSApple OSS Distributions wired_memory_boot = curr->size; 48*4d495c6eSApple OSS Distributions } 49*4d495c6eSApple OSS Distributions } 50*4d495c6eSApple OSS Distributions } 51*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_TRUE(found_kernelcache_counter, "mach_memory_info returned kernelcache counter."); 52*4d495c6eSApple OSS Distributions // Sanity check that the counter isn't 0. 53*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_GT(static_kernelcache_size, 0ULL, "kernelcache counter > 0"); 54*4d495c6eSApple OSS Distributions // Sanity check that the counter is less than the amount of wired memory 55*4d495c6eSApple OSS Distributions // at boot. 56*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_LE(static_kernelcache_size, wired_memory_boot, "kernelcache counter <= VM_KERN_COUNT_WIRED_BOOT"); 57*4d495c6eSApple OSS Distributions 58*4d495c6eSApple OSS Distributions // Cleanup 59*4d495c6eSApple OSS Distributions if ((name != NULL) && (nameCnt != 0)) { 60*4d495c6eSApple OSS Distributions kr = vm_deallocate(mach_task_self(), (vm_address_t) name, 61*4d495c6eSApple OSS Distributions (vm_size_t) (nameCnt * sizeof *name)); 62*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "vm_deallocate name"); 63*4d495c6eSApple OSS Distributions } 64*4d495c6eSApple OSS Distributions 65*4d495c6eSApple OSS Distributions if ((info != NULL) && (infoCnt != 0)) { 66*4d495c6eSApple OSS Distributions kr = vm_deallocate(mach_task_self(), (vm_address_t) info, 67*4d495c6eSApple OSS Distributions (vm_size_t) (infoCnt * sizeof *info)); 68*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "vm_deallocate info"); 69*4d495c6eSApple OSS Distributions } 70*4d495c6eSApple OSS Distributions 71*4d495c6eSApple OSS Distributions if ((wiredInfo != NULL) && (wiredInfoCnt != 0)) { 72*4d495c6eSApple OSS Distributions kr = vm_deallocate(mach_task_self(), (vm_address_t) wiredInfo, 73*4d495c6eSApple OSS Distributions (vm_size_t) (wiredInfoCnt * sizeof *wiredInfo)); 74*4d495c6eSApple OSS Distributions T_QUIET; T_ASSERT_MACH_SUCCESS(kr, "vm_deallocate wiredInfo"); 75*4d495c6eSApple OSS Distributions } 76*4d495c6eSApple OSS Distributions } 77