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