19#include <Guid/GlobalVariable.h>
23#include <Library/DebugLib.h>
24#include <Library/BaseMemoryLib.h>
25#include <Library/MemoryAllocationLib.h>
31#include <Library/PrintLib.h>
32#include <Library/UefiBootServicesTableLib.h>
33#include <Library/UefiRuntimeServicesTableLib.h>
34#include <Library/UefiLib.h>
39 0x1F8E0C02, 0x58A9, 0x4E34, { 0xAE, 0x22, 0x2B, 0x63, 0x74, 0x5F, 0xA1, 0x01 }
45 0x9480E8A1, 0x1793, 0x46C9, { 0x91, 0xD8, 0x11, 0x08, 0xDB, 0xA4, 0x73, 0x1C }
51 0x89D4F995, 0x67E3, 0x4895, { 0x8F, 0x18, 0x45, 0x4B, 0x65, 0x1D, 0x92, 0x15 }
56 OUT UINTN *OptionSize,
58 IN CONST EFI_GUID *BootGuid
62 CHAR16 BootVarName[
L_STR_LEN (L
"Boot####") + 1];
64 EFI_LOAD_OPTION *LoadOption;
74 UnicodeSPrint (BootVarName,
sizeof (BootVarName), L
"Boot%04x", BootOption);
77 Status = GetVariable2 (
83 if (EFI_ERROR (Status)) {
87 if (LoadOptionSize <
sizeof (*LoadOption)) {
88 FreePool (LoadOption);
92 *OptionSize = LoadOptionSize;
101 IN BOOLEAN PreserveBoot
128 if ( (StrCmp (Name, L
"BootNext") == 0)
130 && (StrnCmp (Name, L
"Boot",
L_STR_LEN (L
"Boot")) == 0)
131 && (StrCmp (Name, L
"BootOptionSupport") != 0))
132 || (StrnCmp (Name, L
"Driver",
L_STR_LEN (L
"Driver")) == 0))
172 if (StrCmp (Name, L
"CurrentPolicy") != 0) {
186 EFI_GUID CurrentGuid;
193 BOOLEAN CriticalFailure;
201 RequestedSize = 1024;
216 CriticalFailure = FALSE;
222 if (RequestedSize > BufferSize) {
223 TmpBuffer = AllocateZeroPool (RequestedSize);
224 if (TmpBuffer != NULL) {
231 BufferSize = RequestedSize;
235 "OCVAR: Failed to allocate variable name buffer of %u bytes\n",
236 (UINT32)RequestedSize
246 ZeroMem (&CurrentGuid,
sizeof (CurrentGuid));
254 RequestedSize = BufferSize;
255 Status =
gRT->GetNextVariableName (&RequestedSize,
Buffer, &CurrentGuid);
257 if (!EFI_ERROR (Status)) {
258 ProcessResult = ProcessVariable (&CurrentGuid,
Buffer, Context);
269 }
else if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
270 if (!CriticalFailure) {
271 DEBUG ((DEBUG_INFO,
"OCVAR: Unexpected error (%r), trying to rescan\n", Status));
272 CriticalFailure = TRUE;
274 DEBUG ((DEBUG_INFO,
"OCVAR: Unexpected error (%r), aborting\n", Status));
278 }
while (Status != EFI_NOT_FOUND);
296 BOOLEAN *PreserveBoot;
302 PreserveBoot = Context;
306 Status =
gRT->SetVariable (Name, Guid, 0, 0, NULL);
307 if (!EFI_ERROR (Status)) {
310 "Deleting %g:%s... OK\n",
319 }
else if ((Status == EFI_NOT_FOUND) || (Status == EFI_SECURITY_VIOLATION)) {
322 "Deleting %g:%s... SKIP - %r\n",
330 "Deleting %g:%s... FAIL - %r\n",
346 IN BOOLEAN PreserveBoot
355 OUT UINTN *OptionSize,
365 Status =
gRT->GetVariable (
366 EFI_BOOT_ORDER_VARIABLE_NAME,
375 "OCVAR: Have existing order of size %u - %r\n",
376 (UINT32)BootOrderSize,
380 if ((Status != EFI_BUFFER_TOO_SMALL) || (BootOrderSize == 0) || (BootOrderSize %
sizeof (UINT16) != 0)) {
384 BootOrder = AllocatePool (BootOrderSize);
385 if (BootOrder == NULL) {
386 DEBUG ((DEBUG_INFO,
"OCVAR: Failed to allocate boot order\n"));
390 Status =
gRT->GetVariable (
391 EFI_BOOT_ORDER_VARIABLE_NAME,
397 if (EFI_ERROR (Status) || (BootOrderSize == 0) || (BootOrderSize %
sizeof (UINT16) != 0)) {
398 DEBUG ((DEBUG_INFO,
"OCVAR: Failed to obtain boot order %u - %r\n", (UINT32)BootOrderSize, Status));
399 FreePool (BootOrder);
411 *Option = BootOrder[0];
413 FreePool (BootOrder);
427 Status =
gBS->LocateProtocol (
434 ZeroMem (&Config,
sizeof (Config));
439 DEBUG ((DEBUG_INFO,
"OCVAR: Missing compatible FW NVRAM, going on...\n"));
450 if (FwRuntime != NULL) {
451 DEBUG ((DEBUG_INFO,
"OCVAR: Restoring FW NVRAM...\n"));
452 FwRuntime->SetOverride (NULL);
458 IN BOOLEAN PreserveBoot
463 UINTN BootProtectSize;
466 UINTN BootOptionSize;
467 UINT16 BootOptionIndex;
469 DEBUG ((DEBUG_INFO,
"OCVAR: NVRAM cleanup %d...\n", PreserveBoot));
480 BootProtectSize =
sizeof (BootProtect);
481 Status =
gRT->GetVariable (
488 if (EFI_ERROR (Status) || (BootProtectSize !=
sizeof (BootProtect))) {
497 if (BootOption != NULL) {
500 "OCVAR: Found %g:Boot%04x for preservation of %u bytes\n",
503 (UINT32)BootOptionSize
514 Status =
gRT->SetVariable (
517 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
521 if (!EFI_ERROR (Status)) {
522 Status =
gRT->SetVariable (
523 EFI_BOOT_ORDER_VARIABLE_NAME,
525 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
526 sizeof (BootOptionIndex),
531 DEBUG ((DEBUG_INFO,
"OCVAR: Set bootstrap option to Boot%04x - %r\n", BootOptionIndex, Status));
532 FreePool (BootOption);
540 IN BOOLEAN PreserveBoot
545 return EFI_DEVICE_ERROR;
EFI_GUID gAppleTamperResistantBootVariableGuid
EFI_GUID gAppleWirelessNetworkVariableGuid
EFI_GUID gAppleTamperResistantBootSecureVariableGuid
EFI_GUID gAppleBootVariableGuid
EFI_GUID gAppleVendorVariableGuid
EFI_GUID gApplePersonalizationVariableGuid
EFI_GUID gAppleNetbootVariableGuid
EFI_GUID gAppleSecureBootVariableGuid
EFI_GUID gAppleCoreStorageVariableGuid
EFI_GUID gAppleTamperResistantBootEfiUserVariableGuid
EFI_GUID gMicrosoftVariableGuid
VOID DirectResetCold(VOID)
#define OC_FIRMWARE_RUNTIME_REVISION
EFI_GUID gOcFirmwareRuntimeProtocolGuid
#define L_STR_LEN(String)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
EFI_GUID gOcWriteOnlyVariableGuid
#define OC_BOOT_REDIRECT_VARIABLE_NAME
EFI_GUID gOcReadOnlyVariableGuid
#define OC_BOOT_PROTECT_VARIABLE_BOOTSTRAP
EFI_GUID gOcVendorVariableGuid
#define OC_VENDOR_BOOT_VARIABLE_PREFIX
#define OC_BOOT_PROTECT_VARIABLE_NAME
#define OC_SCAN_POLICY_VARIABLE_NAME
enum _OC_PROCESS_VARIABLE_RESULT OC_PROCESS_VARIABLE_RESULT
OC_PROCESS_VARIABLE_RESULT(EFIAPI * OC_PROCESS_VARIABLE)(IN EFI_GUID *Guid, IN CHAR16 *Name, IN VOID *Context OPTIONAL)
@ OcProcessVariableContinue
@ OcProcessVariableRestart
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGlobalVariableGuid
STATIC VOID DeleteVariables(IN BOOLEAN PreserveBoot)
VOID OcScanVariables(IN OC_PROCESS_VARIABLE ProcessVariable, IN VOID *Context)
STATIC OC_PROCESS_VARIABLE_RESULT EFIAPI DeleteVariable(IN EFI_GUID *Guid, IN CHAR16 *Name, IN VOID *Context)
STATIC BOOLEAN IsDeletableVariable(IN CHAR16 *Name, IN EFI_GUID *Guid, IN BOOLEAN PreserveBoot)
STATIC EFI_GUID mBootChimeVendorVariableGuid
OC_FIRMWARE_RUNTIME_PROTOCOL * OcDisableNvramProtection(VOID)
VOID OcRestoreNvramProtection(IN OC_FIRMWARE_RUNTIME_PROTOCOL *FwRuntime)
STATIC VOID * GetBootstrapBootData(OUT UINTN *OptionSize, OUT UINT16 *Option)
STATIC EFI_GUID mOzmosisProprietary1Guid
VOID OcDeleteVariables(IN BOOLEAN PreserveBoot)
STATIC EFI_GUID mOzmosisProprietary2Guid
EFI_STATUS OcResetNvram(IN BOOLEAN PreserveBoot)
EFI_LOAD_OPTION * OcGetBootOptionData(OUT UINTN *OptionSize, IN UINT16 BootOption, IN CONST EFI_GUID *BootGuid)
OC_FWRT_SET_OVERRIDE_CONFIG SetOverride
BOOLEAN BootVariableRedirect