xref: /xnu-12377.61.12/tests/vm_kern_count_wired_kernelcache.c (revision 4d495c6e23c53686cf65f45067f79024cf5dcee8)
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