19#include <Protocol/VariablePolicy.h>
20#include <Library/VariablePolicyLib.h>
35 EDKII_VARIABLE_POLICY_PROTOCOL_REVISION,
36 DisableVariablePolicy,
38 RegisterVariablePolicy,
49 0xAF9FFD67, 0xEC10, 0x488A, { 0x9D, 0xFC, 0x6C, 0xBF, 0x5E, 0xE2, 0x2C, 0x2E }
81 return EfiAtRuntime ();
102 IN OUT EFI_LOCK *Lock,
106 return EfiInitializeLock (Lock, Priority);
127 EfiAcquireLock (Lock);
149 EfiReleaseLock (Lock);
165 OUT VOID **FtwProtocol
173 Status =
gBS->LocateProtocol (
174 &gEfiFaultTolerantWriteProtocolGuid,
195 IN EFI_HANDLE FvBlockHandle,
196 OUT EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL **FvBlock
202 return gBS->HandleProtocol (
204 &gEfiFirmwareVolumeBlockProtocolGuid,
226 OUT UINTN *NumberHandles,
235 Status =
gBS->LocateHandleBuffer (
237 &gEfiFirmwareVolumeBlockProtocolGuid,
286 for (Index = 0; Index <
mAuthContextOut.AddressPointerCount; Index++) {
287 EfiConvertPointer (0x0, (VOID **)
mAuthContextOut.AddressPointer[Index]);
321 Status = LockVariablePolicy ();
322 ASSERT_EFI_ERROR (Status);
335 if (FeaturePcdGet (PcdVariableCollectStatistics)) {
337 gBS->InstallConfigurationTable (&gEfiAuthenticatedVariableGuid,
gVariableInfo);
343 gBS->CloseEvent (Event);
364 DEBUG ((DEBUG_INFO,
"[Variable]END_OF_DXE is signaled\n"));
366 Status = LockVariablePolicy ();
367 ASSERT_EFI_ERROR (Status);
374 if (PcdGetBool (PcdReclaimVariableSpaceAtEndOfDxe)) {
378 gBS->CloseEvent (Event);
393 if (EFI_ERROR (Status)) {
394 DEBUG ((DEBUG_ERROR,
"Variable write service initialization failed. Status = %r\n", Status));
406 Status =
gBS->InstallProtocolInterface (
408 &gEfiVariableWriteArchProtocolGuid,
409 EFI_NATIVE_INTERFACE,
413 ASSERT_EFI_ERROR (Status);
434 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol;
435 EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;
436 EFI_PHYSICAL_ADDRESS NvStorageVariableBase;
437 EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
438 EFI_PHYSICAL_ADDRESS BaseAddress;
440 EFI_PHYSICAL_ADDRESS VariableStoreBase;
441 UINT64 VariableStoreLength;
442 UINTN FtwMaxBlockSize;
448 if (EFI_ERROR (Status)) {
452 Status = FtwProtocol->GetMaxBlockSize (FtwProtocol, &FtwMaxBlockSize);
453 if (!EFI_ERROR (Status)) {
454 ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) <= FtwMaxBlockSize);
469 if (EFI_ERROR (Status)) {
479 BaseAddress = VariableStoreBase & (~EFI_PAGE_MASK);
480 Length = VariableStoreLength + (VariableStoreBase - BaseAddress);
481 Length = (
Length + EFI_PAGE_SIZE - 1) & (~EFI_PAGE_MASK);
483 Status = gDS->GetMemorySpaceDescriptor (BaseAddress, &GcdDescriptor);
484 if (EFI_ERROR (Status)) {
485 DEBUG ((DEBUG_WARN,
"Variable driver failed to get flash memory attribute.\n"));
487 if ((GcdDescriptor.Attributes & EFI_MEMORY_RUNTIME) == 0) {
488 Status = gDS->SetMemorySpaceAttributes (
491 GcdDescriptor.Attributes | EFI_MEMORY_RUNTIME
493 if (EFI_ERROR (Status)) {
494 DEBUG ((DEBUG_WARN,
"Variable driver failed to add EFI_MEMORY_RUNTIME attribute to Flash.\n"));
507 gBS->CloseEvent (Event);
527 *State = IsVariablePolicyEnabled ();
536 IN EFI_TPL NotifyTpl,
537 IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL,
538 IN CONST VOID *NotifyContext OPTIONAL,
539 IN CONST EFI_GUID *EventGroup OPTIONAL,
545 Status = EFI_UNSUPPORTED;
547 if (Type == EVT_NOTIFY_SIGNAL) {
548 if (
CompareGuid (EventGroup, &gEfiEventVirtualAddressChangeGuid)) {
549 Type = EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE;
550 Status = EFI_SUCCESS;
554 if (EFI_ERROR (Status)) {
558 return gBS->CreateEvent (
562 (VOID *)NotifyContext,
570 IN EFI_SYSTEM_TABLE *SystemTable
577 Status =
gBS->LocateProtocol (&gEfiVariableArchProtocolGuid, NULL, &Interface);
579 if (!EFI_ERROR (Status)) {
584 Status = SystemTable->RuntimeServices->GetVariable (
585 L
"AcpiGlobalVariable",
592 if (EFI_ERROR (Status)) {
597 EFI_ERROR (Status) && Status != EFI_NOT_FOUND ? DEBUG_WARN : DEBUG_INFO,
598 "Existing AcpiGlobalVariable %p 0x%x - %r\n",
609 IN EFI_SYSTEM_TABLE *SystemTable
615 Status = SystemTable->RuntimeServices->SetVariable (
616 L
"AcpiGlobalVariable",
624 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
625 "Transfer AcpiGlobalVariable to emulated NVRAM - %r\n",
646 IN EFI_HANDLE ImageHandle,
647 IN EFI_SYSTEM_TABLE *SystemTable
651 EFI_EVENT ReadyToBootEvent;
652 EFI_EVENT EndOfDxeEvent;
653 EFI_CREATE_EVENT_EX OriginalCreateEventEx;
663 ASSERT_EFI_ERROR (Status);
665 Status =
gBS->InstallMultipleProtocolInterfaces (
667 &gEdkiiVariableLockProtocolGuid,
671 ASSERT_EFI_ERROR (Status);
673 Status =
gBS->InstallMultipleProtocolInterfaces (
675 &gEdkiiVarCheckProtocolGuid,
679 ASSERT_EFI_ERROR (Status);
695 if (SystemTable->RuntimeServices->Hdr.Revision >= EFI_2_00_SYSTEM_TABLE_REVISION) {
706 Status =
gBS->InstallProtocolInterface (
708 &gEfiVariableArchProtocolGuid,
709 EFI_NATIVE_INTERFACE,
713 ASSERT_EFI_ERROR (Status);
715 if (!PcdGetBool (PcdEmuVariableNvModeEnable)) {
719 EfiCreateProtocolNotifyEvent (
720 &gEfiFaultTolerantWriteProtocolGuid,
735 OriginalCreateEventEx =
gBS->CreateEventEx;
738 Status =
gBS->CreateEventEx (
743 &gEfiEventVirtualAddressChangeGuid,
746 ASSERT_EFI_ERROR (Status);
751 Status =
gBS->CreateEvent (
758 ASSERT_EFI_ERROR (Status);
763 Status =
gBS->CreateEvent (
770 ASSERT_EFI_ERROR (Status);
774 ASSERT_EFI_ERROR (Status);
776 ASSERT_EFI_ERROR (Status);
777 Status =
gBS->InstallMultipleProtocolInterfaces (
779 &gEdkiiVariablePolicyProtocolGuid,
783 ASSERT_EFI_ERROR (Status);
785 gBS->CreateEventEx = OriginalCreateEventEx;
789 gBS->SignalEvent (EndOfDxeEvent);
790 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