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