18#include <Guid/GlobalVariable.h>
19#include <Guid/ImageAuthentication.h>
22#include <Library/BaseLib.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/BaseOverflowLib.h>
25#include <Library/DebugLib.h>
26#include <Library/DevicePathLib.h>
30#include <Library/UefiBootServicesTableLib.h>
31#include <Library/UefiRuntimeServicesTableLib.h>
62#ifdef OC_DEBUG_VAR_SERVICE
63STATIC BOOLEAN mInsideVarService;
77 *Ints = SaveAndDisableInterrupts ();
78 Cr0.UintN = AsmReadCr0 ();
81 if (Cr0.Bits.WP == 1) {
90 if (Cr0.Bits.TS == 1) {
99 AsmWriteCr0 (Cr0.UintN);
120 Cr0.UintN = AsmReadCr0 ();
136 AsmWriteCr0 (Cr0.UintN);
148 IN CHAR16 *VariableName,
149 IN EFI_GUID *VendorGuid,
150 OUT CHAR16 *NewVariableName OPTIONAL
159 if (StrnCmp (L
"Boot", VariableName,
L_STR_LEN (L
"Boot")) != 0) {
190 if (NewVariableName != NULL) {
191 Size = StrSize (VariableName);
210 IN CHAR16 *VariableName,
211 IN EFI_GUID *VendorGuid,
212 OUT CHAR16 *NewVariableName OPTIONAL
228 if (NewVariableName != NULL) {
229 Size = StrSize (VariableName);
250 OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
265 if (!EFI_ERROR (Status)) {
273 if (Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) {
310 OUT BOOLEAN *Enabled,
311 OUT BOOLEAN *Pending,
338 IN EFI_TIME *Time OPTIONAL
362 IN CHAR16 *VariableName,
363 IN EFI_GUID *VendorGuid,
364 OUT UINT32 *Attributes OPTIONAL,
365 IN OUT UINTN *DataSize,
366 OUT VOID *Data OPTIONAL
378 if ( (VariableName == NULL)
379 || (VendorGuid == NULL)
380 || (DataSize == NULL)
381 || ((Data == NULL) && (*DataSize != 0)))
383 return EFI_INVALID_PARAMETER;
386 #ifdef OC_DEBUG_VAR_SERVICE
387 if (!mInsideVarService && (StrCmp (VariableName, L
"EfiTime") != 0)) {
388 mInsideVarService = TRUE;
389 DEBUG ((DEBUG_INFO,
"GETVAR %g:%s (%u)\n", VendorGuid, VariableName, (UINT32)*DataSize));
390 mInsideVarService = FALSE;
402 return EFI_SECURITY_VIOLATION;
409 VariableName = TempName;
432 IN OUT UINTN *VariableNameSize,
433 IN OUT CHAR16 *VariableName,
434 IN OUT EFI_GUID *VendorGuid
442 BOOLEAN StartBootVar;
447 #ifdef OC_DEBUG_VAR_SERVICE
448 if (!mInsideVarService) {
449 mInsideVarService = TRUE;
450 DEBUG ((DEBUG_INFO,
"NEXVAR %g:%s (%u/%u)\n", VendorGuid, VariableName, (UINT32)*VariableNameSize));
451 mInsideVarService = FALSE;
461 if ((VariableNameSize == NULL) || (VariableName == NULL) || (VendorGuid == NULL)) {
462 return EFI_INVALID_PARAMETER;
469 for (Index = 0; Index < *VariableNameSize; ++Index) {
470 if (VariableName[Index] == L
'\0') {
471 Size = (Index + 1) *
sizeof (CHAR16);
479 if ((
Size == 0) || (
Size >
sizeof (TempName))) {
480 return EFI_INVALID_PARAMETER;
498 StrnCpyS (TempName,
ARRAY_SIZE (TempName), VariableName, StrLen (VariableName));
500 StartBootVar = FALSE;
512 Size =
sizeof (TempName);
515 if (!EFI_ERROR (Status)) {
517 Size = StrSize (TempName);
519 if (*VariableNameSize >=
Size) {
526 *VariableNameSize /
sizeof (CHAR16),
530 *VariableNameSize =
Size;
531 Status = EFI_SUCCESS;
536 *VariableNameSize =
Size;
537 Status = EFI_BUFFER_TOO_SMALL;
547 }
else if (Status == EFI_BUFFER_TOO_SMALL) {
554 return EFI_DEVICE_ERROR;
555 }
else if (Status == EFI_NOT_FOUND) {
585 ZeroMem (&TempGuid,
sizeof (TempGuid));
598 Size =
sizeof (TempName);
601 if (!EFI_ERROR (Status)) {
603 Size = StrSize (TempName);
605 if (*VariableNameSize >=
Size) {
612 *VariableNameSize /
sizeof (CHAR16),
616 *VariableNameSize =
Size;
617 Status = EFI_SUCCESS;
622 *VariableNameSize =
Size;
623 Status = EFI_BUFFER_TOO_SMALL;
641 return EFI_NOT_FOUND;
648 IN CHAR16 *VariableName,
649 IN EFI_GUID *VendorGuid,
650 IN UINT32 Attributes,
661 #ifdef OC_DEBUG_VAR_SERVICE
662 if (!mInsideVarService) {
663 mInsideVarService = TRUE;
664 DEBUG ((DEBUG_INFO,
"SETVAR %g:%s (%u/%u)\n", VendorGuid, VariableName, (UINT32)DataSize, Attributes));
665 mInsideVarService = FALSE;
674 return EFI_SECURITY_VIOLATION;
684 return EFI_SECURITY_VIOLATION;
692 if ( (StrCmp (VariableName, EFI_PLATFORM_KEY_NAME) == 0)
693 || (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0))
695 return EFI_SECURITY_VIOLATION;
697 }
else if (
CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid)) {
698 if ( (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0)
699 || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0)
700 || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0)
701 || (StrCmp (VariableName, L
"dbr" ) == 0))
703 return EFI_SECURITY_VIOLATION;
709 return EFI_SECURITY_VIOLATION;
719 VariableName = TempName;
765 IN EFI_RESET_TYPE ResetType,
766 IN EFI_STATUS ResetStatus,
768 IN VOID *ResetData OPTIONAL
791 IN UINTN MemoryMapSize,
792 IN UINTN DescriptorSize,
793 IN UINT32 DescriptorVersion,
794 IN EFI_MEMORY_DESCRIPTOR *MemoryMap
806 gRT->Hdr.CRC32 = CalculateCrc32 (
gRT,
gRT->Hdr.HeaderSize);
809 Status =
gRT->SetVirtualAddressMap (
830 IN EFI_GET_VARIABLE GetVariable,
831 OUT EFI_GET_VARIABLE *OrgGetVariable OPTIONAL
835 return EFI_ALREADY_STARTED;
840 if (OrgGetVariable != NULL) {
850 IN EFI_SET_VIRTUAL_ADDRESS_MAP SetAddressMap OPTIONAL,
854 if (SetAddressMap != NULL) {
856 return EFI_ALREADY_STARTED;
861 return EFI_NOT_FOUND;
925 gBS->CalculateCrc32 (
gRT,
gRT->Hdr.HeaderSize, &
gRT->Hdr.CRC32);
927 Status =
gBS->CreateEvent (
928 EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,
935 ASSERT_EFI_ERROR (Status);
#define ARRAY_SIZE(Array)
EFI_GUID gMicrosoftVariableGuid
DMG_SIZE_DEVICE_PATH Size
#define L_STR_LEN(String)
#define L_STR_SIZE_NT(String)
EFI_GUID gOcWriteOnlyVariableGuid
EFI_GUID gOcReadOnlyVariableGuid
EFI_GUID gOcVendorVariableGuid
#define OC_VENDOR_BOOT_VARIABLE_PREFIX
#define OC_VARIABLE_NAME_SIZE
STATIC EFI_RESET_SYSTEM mStoredResetSystem
VOID RedirectRuntimeServices(VOID)
STATIC BOOLEAN mCustomSetVirtualAddressMapEnabled
STATIC EFI_GET_NEXT_HIGH_MONO_COUNT mStoredGetNextHighMonotonicCount
STATIC EFI_SET_VARIABLE mStoredSetVariable
STATIC EFI_GET_TIME mStoredGetTime
STATIC VOID EFIAPI TranslateAddressesHandler(IN EFI_EVENT Event, IN VOID *Context)
STATIC EFI_SET_WAKEUP_TIME mStoredSetWakeupTime
STATIC EFI_SET_VIRTUAL_ADDRESS_MAP mSetVirtualAddressMap
STATIC EFI_STATUS EFIAPI WrapGetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT UINT32 *Attributes OPTIONAL, IN OUT UINTN *DataSize, OUT VOID *Data OPTIONAL)
STATIC EFI_EVENT mTranslateEvent
OC_FWRT_CONFIG gMainConfig
STATIC EFI_STATUS EFIAPI WrapGetNextVariableName(IN OUT UINTN *VariableNameSize, IN OUT CHAR16 *VariableName, IN OUT EFI_GUID *VendorGuid)
STATIC EFI_STATUS EFIAPI WrapGetTime(OUT EFI_TIME *Time, OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL)
OC_FWRT_CONFIG * gCurrentConfig
EFI_STATUS EFIAPI FwOnGetVariable(IN EFI_GET_VARIABLE GetVariable, OUT EFI_GET_VARIABLE *OrgGetVariable OPTIONAL)
STATIC EFI_STATUS EFIAPI WrapSetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data)
STATIC EFI_GET_NEXT_VARIABLE_NAME mStoredGetNextVariableName
STATIC VOID Cr0QuirkPrologue(OUT BOOLEAN *Ints, OUT BOOLEAN *Wp, OUT BOOLEAN *Ts)
STATIC EFI_STATUS EFIAPI WrapSetVirtualAddressMap(IN UINTN MemoryMapSize, IN UINTN DescriptorSize, IN UINT32 DescriptorVersion, IN EFI_MEMORY_DESCRIPTOR *MemoryMap)
STATIC EFI_SET_VIRTUAL_ADDRESS_MAP mCustomSetVirtualAddressMap
STATIC BOOLEAN IsEfiBootVar(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT CHAR16 *NewVariableName OPTIONAL)
STATIC EFI_GET_VARIABLE mStoredGetVariable
STATIC EFI_GET_VARIABLE mCustomGetVariable
STATIC VOID Cr0QuirkEpilogue(IN BOOLEAN Ints, IN BOOLEAN Wp, IN BOOLEAN Ts)
EFI_STATUS EFIAPI FwOnSetAddressMap(IN EFI_SET_VIRTUAL_ADDRESS_MAP SetAddressMap OPTIONAL, IN BOOLEAN Enabled)
STATIC EFI_STATUS EFIAPI WrapGetNextHighMonotonicCount(OUT UINT32 *Count)
STATIC EFI_STATUS EFIAPI WrapSetWakeupTime(IN BOOLEAN Enable, IN EFI_TIME *Time OPTIONAL)
STATIC BOOLEAN IsOcBootVar(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT CHAR16 *NewVariableName OPTIONAL)
STATIC EFI_SET_TIME mStoredSetTime
STATIC EFI_STATUS EFIAPI WrapSetTime(IN EFI_TIME *Time)
STATIC VOID EFIAPI WrapResetSystem(IN EFI_RESET_TYPE ResetType, IN EFI_STATUS ResetStatus, IN UINTN DataSize, IN VOID *ResetData OPTIONAL)
STATIC EFI_GET_WAKEUP_TIME mStoredGetWakeupTime
OC_FWRT_CONFIG gOverrideConfig
STATIC EFI_STATUS EFIAPI WrapGetWakeupTime(OUT BOOLEAN *Enabled, OUT BOOLEAN *Pending, OUT EFI_TIME *Time)
STATIC BOOLEAN mKernelStarted
For file logging disable TPL checking in OcLogAddEntry.
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGlobalVariableGuid
VOID EFIAPI EnableInterrupts(VOID)
BOOLEAN BootVariableRedirect
BOOLEAN ProtectSecureBoot
BOOLEAN ClearTaskSwitchBit
BOOLEAN RestrictedVariables