21#include <Protocol/VariablePolicy.h>
22#include <Library/VariablePolicyLib.h>
37 EDKII_VARIABLE_POLICY_PROTOCOL_REVISION,
38 DisableVariablePolicy,
40 RegisterVariablePolicy,
51 0xAF9FFD67, 0xEC10, 0x488A, { 0x9D, 0xFC, 0x6C, 0xBF, 0x5E, 0xE2, 0x2C, 0x2E }
83 return EfiAtRuntime ();
104 IN OUT EFI_LOCK *Lock,
108 return EfiInitializeLock (Lock, Priority);
129 EfiAcquireLock (Lock);
151 EfiReleaseLock (Lock);
167 OUT VOID **FtwProtocol
175 Status =
gBS->LocateProtocol (
176 &gEfiFaultTolerantWriteProtocolGuid,
197 IN EFI_HANDLE FvBlockHandle,
198 OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvBlock
204 return gBS->HandleProtocol (
206 &gEfiFirmwareVolumeBlockProtocolGuid,
228 OUT UINTN *NumberHandles,
237 Status =
gBS->LocateHandleBuffer (
239 &gEfiFirmwareVolumeBlockProtocolGuid,
288 for (Index = 0; Index <
mAuthContextOut.AddressPointerCount; Index++) {
289 EfiConvertPointer (0x0, (VOID **)
mAuthContextOut.AddressPointer[Index]);
323 Status = LockVariablePolicy ();
324 ASSERT_EFI_ERROR (Status);
337 if (FeaturePcdGet (PcdVariableCollectStatistics)) {
339 gBS->InstallConfigurationTable (&gEfiAuthenticatedVariableGuid,
gVariableInfo);
345 gBS->CloseEvent (Event);
366 DEBUG ((DEBUG_INFO,
"[Variable]END_OF_DXE is signaled\n"));
368 Status = LockVariablePolicy ();
369 ASSERT_EFI_ERROR (Status);
376 if (PcdGetBool (PcdReclaimVariableSpaceAtEndOfDxe)) {
380 gBS->CloseEvent (Event);
395 if (EFI_ERROR (Status)) {
396 DEBUG ((DEBUG_ERROR,
"Variable write service initialization failed. Status = %r\n", Status));
408 Status =
gBS->InstallProtocolInterface (
410 &gEfiVariableWriteArchProtocolGuid,
411 EFI_NATIVE_INTERFACE,
414 ASSERT_EFI_ERROR (Status);
435 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol;
436 EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;
437 EFI_PHYSICAL_ADDRESS NvStorageVariableBase;
438 EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
439 EFI_PHYSICAL_ADDRESS BaseAddress;
441 EFI_PHYSICAL_ADDRESS VariableStoreBase;
442 UINT64 VariableStoreLength;
443 UINTN FtwMaxBlockSize;
449 if (EFI_ERROR (Status)) {
453 Status = FtwProtocol->GetMaxBlockSize (FtwProtocol, &FtwMaxBlockSize);
454 if (!EFI_ERROR (Status)) {
455 ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) <= FtwMaxBlockSize);
470 if (EFI_ERROR (Status)) {
480 BaseAddress = VariableStoreBase & (~EFI_PAGE_MASK);
481 Length = VariableStoreLength + (VariableStoreBase - BaseAddress);
482 Length = (
Length + EFI_PAGE_SIZE - 1) & (~EFI_PAGE_MASK);
484 Status = gDS->GetMemorySpaceDescriptor (BaseAddress, &GcdDescriptor);
485 if (EFI_ERROR (Status)) {
486 DEBUG ((DEBUG_WARN,
"Variable driver failed to get flash memory attribute.\n"));
488 if ((GcdDescriptor.Attributes & EFI_MEMORY_RUNTIME) == 0) {
489 Status = gDS->SetMemorySpaceAttributes (
492 GcdDescriptor.Attributes | EFI_MEMORY_RUNTIME
494 if (EFI_ERROR (Status)) {
495 DEBUG ((DEBUG_WARN,
"Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));
508 gBS->CloseEvent (Event);
528 *State = IsVariablePolicyEnabled ();
537 IN EFI_TPL NotifyTpl,
538 IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
539 IN CONST VOID *NotifyContext OPTIONAL,
540 IN CONST EFI_GUID *EventGroup OPTIONAL,
546 Status = EFI_UNSUPPORTED;
548 if (Type == EVT_NOTIFY_SIGNAL) {
549 if (
CompareGuid (EventGroup, &gEfiEventVirtualAddressChangeGuid)) {
550 Type = EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE;
551 Status = EFI_SUCCESS;
555 if (EFI_ERROR (Status)) {
559 return gBS->CreateEvent (
563 (VOID *)NotifyContext,
571 IN EFI_SYSTEM_TABLE *SystemTable
578 Status =
gBS->LocateProtocol (&gEfiVariableArchProtocolGuid, NULL, &Interface);
580 if (!EFI_ERROR (Status)) {
585 Status = SystemTable->RuntimeServices->GetVariable (
586 L
"AcpiGlobalVariable",
593 if (EFI_ERROR (Status)) {
598 EFI_ERROR (Status) && Status != EFI_NOT_FOUND ? DEBUG_WARN : DEBUG_INFO,
599 "Existing AcpiGlobalVariable %p 0x%x - %r\n",
610 IN EFI_SYSTEM_TABLE *SystemTable
616 Status = SystemTable->RuntimeServices->SetVariable (
617 L
"AcpiGlobalVariable",
625 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
626 "Transfer AcpiGlobalVariable to emulated NVRAM - %r\n",
647 IN EFI_HANDLE ImageHandle,
648 IN EFI_SYSTEM_TABLE *SystemTable
652 EFI_EVENT ReadyToBootEvent;
653 EFI_EVENT EndOfDxeEvent;
654 EFI_CREATE_EVENT_EX OriginalCreateEventEx;
664 ASSERT_EFI_ERROR (Status);
666 Status =
gBS->InstallMultipleProtocolInterfaces (
668 &gEdkiiVariableLockProtocolGuid,
672 ASSERT_EFI_ERROR (Status);
674 Status =
gBS->InstallMultipleProtocolInterfaces (
676 &gEdkiiVarCheckProtocolGuid,
680 ASSERT_EFI_ERROR (Status);
696 if (SystemTable->RuntimeServices->Hdr.Revision >= EFI_2_00_SYSTEM_TABLE_REVISION) {
707 Status =
gBS->InstallProtocolInterface (
709 &gEfiVariableArchProtocolGuid,
710 EFI_NATIVE_INTERFACE,
714 ASSERT_EFI_ERROR (Status);
716 if (!PcdGetBool (PcdEmuVariableNvModeEnable)) {
720 EfiCreateProtocolNotifyEvent (
721 &gEfiFaultTolerantWriteProtocolGuid,
736 OriginalCreateEventEx =
gBS->CreateEventEx;
739 Status =
gBS->CreateEventEx (
744 &gEfiEventVirtualAddressChangeGuid,
747 ASSERT_EFI_ERROR (Status);
752 Status =
gBS->CreateEvent (
759 ASSERT_EFI_ERROR (Status);
764 Status =
gBS->CreateEvent (
771 ASSERT_EFI_ERROR (Status);
775 ASSERT_EFI_ERROR (Status);
777 ASSERT_EFI_ERROR (Status);
778 Status =
gBS->InstallMultipleProtocolInterfaces (
780 &gEdkiiVariablePolicyProtocolGuid,
784 ASSERT_EFI_ERROR (Status);
786 gBS->CreateEventEx = OriginalCreateEventEx;
790 gBS->SignalEvent (EndOfDxeEvent);
791 gBS->SignalEvent (ReadyToBootEvent);
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID MorLockInitAtEndOfDxe(VOID)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_STATUS EFIAPI VarCheckVariablePropertySet(IN CHAR16 *Name, IN EFI_GUID *Guid, IN VAR_CHECK_VARIABLE_PROPERTY *VariableProperty)
EFI_STATUS EFIAPI VarCheckRegisterSetVariableCheckHandler(IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER Handler)
EFI_STATUS EFIAPI VarCheckVariablePropertyGet(IN CHAR16 *Name, IN EFI_GUID *Guid, OUT VAR_CHECK_VARIABLE_PROPERTY *VariableProperty)
EFI_FIRMWARE_VOLUME_HEADER * mNvFvHeaderCache
VARIABLE_INFO_ENTRY * gVariableInfo
EFI_STATUS EFIAPI VariableServiceGetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT UINT32 *Attributes OPTIONAL, IN OUT UINTN *DataSize, OUT VOID *Data OPTIONAL)
AUTH_VAR_LIB_CONTEXT_OUT mAuthContextOut
VOID InitializeVariableQuota(VOID)
VARIABLE_STORE_HEADER * mNvVariableCache
EFI_STATUS VariableWriteServiceInitialize(VOID)
EFI_STATUS VariableCommonInitialize(VOID)
EFI_STATUS EFIAPI VariableServiceGetNextVariableName(IN OUT UINTN *VariableNameSize, IN OUT CHAR16 *VariableName, IN OUT EFI_GUID *VendorGuid)
EFI_STATUS EFIAPI VariableServiceQueryVariableInfo(IN UINT32 Attributes, OUT UINT64 *MaximumVariableStorageSize, OUT UINT64 *RemainingVariableStorageSize, OUT UINT64 *MaximumVariableSize)
EFI_STATUS GetFvbInfoByAddress(IN EFI_PHYSICAL_ADDRESS Address, OUT EFI_HANDLE *FvbHandle OPTIONAL, OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvbProtocol OPTIONAL)
VARIABLE_MODULE_GLOBAL * mVariableModuleGlobal
EFI_STATUS EFIAPI VariableServiceSetVariable(IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data)
EFI_STATUS EFIAPI VariableLockRequestToLock(IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This, IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid)
#define NV_STORAGE_VARIABLE_BASE
EDKII_VAR_CHECK_PROTOCOL mVarCheck
STATIC VOID * mAcpiGlobalVariable
STATIC VOID SaveAcpiGlobalVariable(IN EFI_SYSTEM_TABLE *SystemTable)
UINTN mVarCheckAddressPointerCount
VOID EFIAPI OnReadyToBoot(EFI_EVENT Event, VOID *Context)
EFI_STATUS GetFvbByHandle(IN EFI_HANDLE FvBlockHandle, OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvBlock)
EFI_LOCK * InitializeLock(IN OUT EFI_LOCK *Lock, IN EFI_TPL Priority)
EDKII_VARIABLE_POLICY_PROTOCOL mVariablePolicyProtocol
VOID *** mVarCheckAddressPointer
EFI_EVENT mVirtualAddressChangeEvent
EFI_STATUS EFIAPI VariableServiceInitialize(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
VOID EFIAPI OnEndOfDxe(EFI_EVENT Event, VOID *Context)
VOID EFIAPI RecordSecureBootPolicyVarData(VOID)
STATIC VOID RestoreAcpiGlobalVariable(IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_STATUS EFIAPI MapCreateEventEx(IN UINT32 Type, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL, IN CONST VOID *NotifyContext OPTIONAL, IN CONST EFI_GUID *EventGroup OPTIONAL, OUT EFI_EVENT *Event)
VOID ReleaseLockOnlyAtBootTime(IN EFI_LOCK *Lock)
STATIC EFI_GUID mAcpiGlobalVariableGuid
VOID EFIAPI FtwNotificationEvent(IN EFI_EVENT Event, IN VOID *Context)
VOID AcquireLockOnlyAtBootTime(IN EFI_LOCK *Lock)
VOID EFIAPI VariableClassAddressChangeEvent(IN EFI_EVENT Event, IN VOID *Context)
STATIC UINT32 mAcpiGlobalVariableAttributes
EFI_STATUS GetFtwProtocol(OUT VOID **FtwProtocol)
EFI_STATUS GetFvbCountAndBuffer(OUT UINTN *NumberHandles, OUT EFI_HANDLE **Buffer)
VOID VariableWriteServiceInitializeDxe(VOID)
EDKII_VARIABLE_LOCK_PROTOCOL mVariableLock
EFI_STATUS EFIAPI ProtocolIsVariablePolicyEnabled(OUT BOOLEAN *State)
EFI_PHYSICAL_ADDRESS VolatileVariableBase
EFI_PHYSICAL_ADDRESS NonVolatileVariableBase
EFI_PHYSICAL_ADDRESS HobVariableBase
VARIABLE_GLOBAL VariableGlobal
CHAR8 * PlatformLangCodes
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL * FvbInstance