xref: /xnu-11215.41.3/tests/nvram_tests/nvram_system.c (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1 #include <darwintest.h>
2 #include "nvram_helper.h"
3 
4 T_GLOBAL_META(T_META_NAMESPACE("xnu.nvram"),
5     T_META_RADAR_COMPONENT_NAME("xnu"),
6     T_META_RADAR_COMPONENT_VERSION("nvram"));
7 
8 static io_registry_entry_t optionsRef = IO_OBJECT_NULL;
9 
10 // xcrun -sdk macosx.internal make -C tests nvram_system && sudo ./tests/build/sym/nvram_system
11 
12 // Test that writing, reading, and deleting of system variables with system entitlement should succeed
13 T_DECL(TestSystemEntitled, "Test system guids with entitlement")
14 {
15 #if ((TARGET_OS_OSX) && !(__x86_64__))
16 	const char *varToTest = SystemNVRAMGuidString ":" "varToTest2";
17 
18 	optionsRef = CreateOptionsRef();
19 
20 	TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
21 	TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef);
22 	TestVarOp(OP_DEL, varToTest, NULL, KERN_SUCCESS, optionsRef);
23 
24 	ReleaseOptionsRef(optionsRef);
25 #else
26 	T_PASS("Test not supported");
27 #endif /* ((TARGET_OS_OSX) && !(__x86_64__)) */
28 }
29 
30 
31 #if !(TARGET_CPU_ARM64 && TARGET_OS_OSX)
32 // Test that system guid is translated to common guid on devices without system namespace support
33 T_DECL(TestSysNonAS, "Test system guids for devices without system namespace")
34 {
35 	const char *varWithSys = SystemNVRAMGuidString ":" "varToTestSys";
36 	const char *varWOSys = "varToTestSys";
37 
38 	optionsRef = CreateOptionsRef();
39 
40 	TestVarOp(OP_SET, varWithSys, DefaultSetVal, KERN_SUCCESS, optionsRef);
41 	TestVarOp(OP_GET, varWOSys, NULL, KERN_SUCCESS, optionsRef);
42 	TestVarOp(OP_DEL, varWOSys, NULL, KERN_SUCCESS, optionsRef);
43 
44 	ReleaseOptionsRef(optionsRef);
45 }
46 #endif
47 
48 // Variable entitlement tests for system variables
49 #if ((TARGET_OS_OSX) && !(__x86_64__))
50 // Test that read of entitled system variables without entitlement should fail
51 T_DECL(TestEntRdSys, "Test read entitled system variables")
52 {
53 	char * varToTest = SystemNVRAMGuidString ":" "testEntRdSys";
54 
55 	optionsRef = CreateOptionsRef();
56 
57 	TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
58 	TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef);
59 
60 	ReleaseOptionsRef(optionsRef);
61 }
62 
63 // Test that writing of entitled system variables without entitlement should fail
64 T_DECL(TestEntModRstSys, "Test write entitled system variables")
65 {
66 	char * varToTest = SystemNVRAMGuidString ":" "testEntModRstSys";
67 
68 	optionsRef = CreateOptionsRef();
69 
70 	TestVarOp(OP_SET, varToTest, DefaultSetVal, kIOReturnNotPrivileged, optionsRef);
71 
72 	ReleaseOptionsRef(optionsRef);
73 }
74 
75 // Test that deleting of entitled system variables without entitlement should fail
76 T_DECL(TestEntDelSys, "Test delete entitled system variables")
77 {
78 	char * varToTest = SystemNVRAMGuidString ":" "testEntDelSys";
79 
80 	optionsRef = CreateOptionsRef();
81 
82 	TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
83 	TestVarOp(OP_DEL, varToTest, NULL, KERN_FAILURE, optionsRef);
84 
85 	ReleaseOptionsRef(optionsRef);
86 }
87 
88 // Test resetting of nvram with entitlement should not erase testEntRstSys
89 // To reset nvram, call the test with -r argument:
90 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestEntRstSys -- -r
91 T_DECL(TestEntRstSys, "Test reset entitled system variables")
92 {
93 	opterr = 0;
94 	optind = 0;
95 	char * varToTest = SystemNVRAMGuidString ":" "testEntRstSys";
96 
97 	optionsRef = CreateOptionsRef();
98 
99 	TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
100 
101 	if (getopt(argc, argv, "r") == 'r') {
102 		TestVarOp(OP_RES, NULL, NULL, KERN_SUCCESS, optionsRef);
103 		TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef);
104 	} else {
105 		TestVarOp(OP_DEL, varToTest, NULL, KERN_SUCCESS, optionsRef);
106 		T_PASS("NVram reset not invoked");
107 	}
108 
109 	ReleaseOptionsRef(optionsRef);
110 }
111 
112 // Test NVRAM Reset
113 // To reset nvram, call the test with -r argument:
114 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestNVRAMResetSys -- -r
115 T_DECL(TestNVRAMResetSys, "Test NVRAM Reset for system region variables")
116 {
117 	opterr = 0;
118 	optind = 0;
119 	const char * varToTest = "testVar1";
120 	const char * varToTestWSys = SystemNVRAMGuidString ":" "testVar2";
121 
122 	optionsRef = CreateOptionsRef();
123 
124 	if (getopt(argc, argv, "r") == 'r') {
125 		TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
126 		TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef);
127 
128 		TestVarOp(OP_RES, NULL, NULL, KERN_SUCCESS, optionsRef);
129 		TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef);
130 
131 		TestVarOp(OP_GET, varToTestWSys, NULL, KERN_FAILURE, optionsRef);
132 	} else {
133 		T_PASS("NVram reset not invoked");
134 	}
135 
136 	ReleaseOptionsRef(optionsRef);
137 }
138 
139 // Test NVRAM Obliterate
140 // To obliterate nvram, call the test with -r argument:
141 // sudo ./tests/build/sym/nvram_system -n xnu.nvram.TestNVRAMOblitSys -- -r
142 T_DECL(TestNVRAMOblitSys, "Test NVRAM Obliterate for system region")
143 {
144 	opterr = 0;
145 	optind = 0;
146 	const char * varToTest = "testVar1";
147 	const char * varToTestWSys = SystemNVRAMGuidString ":" "testVar2";
148 	const char * varToTestWRand = RandomNVRAMGuidString ":" "testVar3";
149 	const char * oblitSys = SystemNVRAMGuidString ":" "ObliterateNVRam";
150 	const char * oblitNonSys = CommonNVRAMGuidString ":" "ObliterateNVRam";
151 
152 	optionsRef = CreateOptionsRef();
153 
154 	if (getopt(argc, argv, "r") == 'r') {
155 		// Set variables with common namespace, random namespace and system namespace
156 		TestVarOp(OP_SET, varToTest, DefaultSetVal, KERN_SUCCESS, optionsRef);
157 		TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef);
158 		TestVarOp(OP_SET, varToTestWRand, DefaultSetVal, KERN_SUCCESS, optionsRef);
159 
160 		// Obliterate sys first and make sure non-sys variables aren't deleted
161 		TestVarOp(OP_OBL, oblitSys, NULL, KERN_SUCCESS, optionsRef);
162 
163 		TestVarOp(OP_GET, varToTestWSys, NULL, KERN_FAILURE, optionsRef);
164 		TestVarOp(OP_GET, varToTest, NULL, KERN_SUCCESS, optionsRef);
165 		TestVarOp(OP_GET, varToTestWRand, NULL, KERN_SUCCESS, optionsRef);
166 
167 		// Now, obliterate common region and make sure all non-sys variables are deleted
168 		TestVarOp(OP_SET, varToTestWSys, DefaultSetVal, KERN_SUCCESS, optionsRef);
169 
170 		TestVarOp(OP_OBL, oblitNonSys, NULL, KERN_SUCCESS, optionsRef);
171 
172 		TestVarOp(OP_GET, varToTestWSys, NULL, KERN_SUCCESS, optionsRef);
173 		TestVarOp(OP_GET, varToTest, NULL, KERN_FAILURE, optionsRef);
174 		TestVarOp(OP_GET, varToTestWRand, NULL, KERN_FAILURE, optionsRef);
175 		TestVarOp(OP_DEL, varToTestWSys, NULL, KERN_SUCCESS, optionsRef);
176 	} else {
177 		T_PASS("NVram obliterate not invoked");
178 	}
179 
180 	ReleaseOptionsRef(optionsRef);
181 }
182 #endif /* ((TARGET_OS_OSX) && !(__x86_64__)) */
183