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