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