xref: /xnu-12377.81.4/tests/vm/vm_sysctl_tests.c (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1 #include <sys/sysctl.h>
2 #include <signal.h>
3 #include <darwintest.h>
4 #include <darwintest_utils.h>
5 
6 T_GLOBAL_META(
7 	T_META_NAMESPACE("xnu.vm"),
8 	T_META_RADAR_COMPONENT_NAME("xnu"),
9 	T_META_RADAR_COMPONENT_VERSION("VM"),
10 	T_META_ASROOT(YES),
11 	T_META_RUN_CONCURRENTLY(true),
12 	T_META_TAG_VM_PREFERRED);
13 
14 static int64_t
run_sysctl_test(const char * t,int64_t value)15 run_sysctl_test(const char *t, int64_t value)
16 {
17 	char name[1024];
18 	int64_t result = 0;
19 	size_t s = sizeof(value);
20 	int rc;
21 
22 	snprintf(name, sizeof(name), "debug.test.%s", t);
23 	rc = sysctlbyname(name, &result, &s, &value, s);
24 	T_ASSERT_POSIX_SUCCESS(rc, "sysctlbyname(%s)", t);
25 	return result;
26 }
27 
28 T_DECL(vm_map_null,
29     "Test that we can call vm_map functions with VM_MAP_NULL",
30     T_META_TAG_VM_PREFERRED)
31 {
32 	int64_t result = run_sysctl_test("vm_map_null", 0);
33 	T_EXPECT_EQ(1ull, result, "vm_map_null");
34 }
35 
36 T_DECL(vm_map_copy_entry_subrange,
37     "Test mapping a subrange of a copy entry")
38 {
39 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_map_copy_entry_subrange", 0), "vm_map_copy_entry_subrange");
40 }
41 
42 T_DECL(vm_memory_entry_map_size_null,
43     "Test mach_memory_entry_map_size with NULL memory entry")
44 {
45 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_memory_entry_map_size_null", 0), "vm_memory_entry_map_size_null");
46 }
47 
48 
49 T_DECL(vm_memory_entry_map_size_overflow,
50     "Test overflow cases in mach_memory_entry_map_size sanitization")
51 {
52 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_memory_entry_map_size_overflow", 0), "vm_memory_entry_map_size_overflow");
53 }
54 
55 T_DECL(vm_memory_entry_map_size_copy,
56     "Test mach_memory_entry_map_size with copy memory entries and 4k/16k combinations")
57 {
58 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_memory_entry_map_size_copy", 0), "vm_memory_entry_map_size_copy");
59 }
60 
61 T_DECL(vm_memory_entry_parent_submap,
62     "Test mach_make_memory_entry cases where parent is a submap")
63 {
64 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_memory_entry_parent_submap", 0), "vm_memory_entry_parent_submap");
65 }
66 
67 #ifndef __x86_64__
68 T_DECL(vm_page_radix_verify, "verify the vm pages radix tree")
69 {
70 	T_EXPECT_EQ(1ull, run_sysctl_test("vm_page_radix_verify", 0), "vm_page_radix_verify");
71 }
72 #endif
73 
74 T_DECL(vm_map_4k_16k_copyout,
75     "Make sure vm_map_copyout from 4k->16k maps doesn't lead to address space holes")
76 {
77 	T_EXPECT_EQ(1ULL, run_sysctl_test("vm_map_4k_16k", 0), "vm_map_4k_16k_copyout");
78 }
79 
80 T_DECL(vm_map_4k_16k_copy_overwrite,
81     "Make sure vm_map_copy_overwrite from 4k->16k maps doesn't lead to address space holes")
82 {
83 	T_EXPECT_EQ(1ULL, run_sysctl_test("vm_map_4k_16k", 1), "vm_map_4k_16k_copy_overwrite");
84 }
85