summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--OvmfPkg/Include/Library/NvVarsFileLib.h16
-rw-r--r--OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.c30
-rw-r--r--OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c32
-rw-r--r--OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf3
4 files changed, 80 insertions, 1 deletions
diff --git a/OvmfPkg/Include/Library/NvVarsFileLib.h b/OvmfPkg/Include/Library/NvVarsFileLib.h
index 63b1642f54..1a14b3fe9c 100644
--- a/OvmfPkg/Include/Library/NvVarsFileLib.h
+++ b/OvmfPkg/Include/Library/NvVarsFileLib.h
@@ -31,5 +31,21 @@ ConnectNvVarsToFileSystem (
IN EFI_HANDLE FsHandle
);
+
+/**
+ Update non-volatile variables stored on the file system.
+
+ @return The EFI_STATUS while attempting to update the variable on
+ the connected file system.
+ @retval EFI_SUCCESS - The non-volatile variables were saved to the disk
+ @retval EFI_NOT_STARTED - A file system has not been connected
+
+**/
+EFI_STATUS
+EFIAPI
+UpdateNvVarsOnFileSystem (
+ );
+
+
#endif
diff --git a/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.c b/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.c
index 94e00e0bdb..62fee6f031 100644
--- a/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.c
+++ b/OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.c
@@ -16,6 +16,8 @@
#include <Library/DebugLib.h>
#include <Library/NvVarsFileLib.h>
+EFI_HANDLE mNvVarsFileLibFsHandle = NULL;
+
/**
Attempts to connect the NvVarsFileLib to the specified file system.
@@ -46,8 +48,36 @@ ConnectNvVarsToFileSystem (
// to have connected successfully.
//
Status = SaveNvVarsToFs (FsHandle);
+ if (!EFI_ERROR (Status)) {
+ mNvVarsFileLibFsHandle = FsHandle;
+ }
return Status;
}
+/**
+ Update non-volatile variables stored on the file system.
+
+ @return The EFI_STATUS while attempting to update the variable on
+ the connected file system.
+ @retval EFI_SUCCESS - The non-volatile variables were saved to the disk
+ @retval EFI_NOT_STARTED - A file system has not been connected
+
+**/
+EFI_STATUS
+EFIAPI
+UpdateNvVarsOnFileSystem (
+ )
+{
+ if (mNvVarsFileLibFsHandle == NULL) {
+ //
+ // A file system had not been connected to the library.
+ //
+ return EFI_NOT_STARTED;
+ } else {
+ return SaveNvVarsToFs (mNvVarsFileLibFsHandle);
+ }
+}
+
+
diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
index e4d1d4acbd..f3781b4b55 100644
--- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
+++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
@@ -21,6 +21,8 @@
VOID *mEfiDevPathNotifyReg;
EFI_EVENT mEfiDevPathEvent;
+VOID *mEmuVariableEventReg;
+EFI_EVENT mEmuVariableEvent;
BOOLEAN mDetectVgaOnly;
@@ -815,6 +817,26 @@ ConnectRecursivelyIfPciMassStorage (
}
+/**
+ This notification function is invoked when the
+ EMU Variable FVB has been changed.
+
+ @param Event The event that occured
+ @param Context For EFI compatiblity. Not used.
+
+**/
+VOID
+EFIAPI
+EmuVariablesUpdatedCallback (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ DEBUG ((EFI_D_INFO, "EmuVariablesUpdatedCallback\n"));
+ UpdateNvVarsOnFileSystem ();
+}
+
+
EFI_STATUS
EFIAPI
VisitingFileSystemInstance (
@@ -836,6 +858,16 @@ VisitingFileSystemInstance (
}
ConnectedToFileSystem = TRUE;
+ mEmuVariableEvent =
+ EfiCreateProtocolNotifyEvent (
+ &gEfiDevicePathProtocolGuid,
+ TPL_CALLBACK,
+ EmuVariablesUpdatedCallback,
+ NULL,
+ &mEmuVariableEventReg
+ );
+ PcdSet64 (PcdEmuVariableEvent, (UINT64)(UINTN) mEmuVariableEvent);
+
return EFI_SUCCESS;
}
diff --git a/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf b/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
index f8b64473bd..7d856f3177 100644
--- a/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
+++ b/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
@@ -50,9 +50,10 @@
PciLib
NvVarsFileLib
-[Pcd.common]
+[Pcd]
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPlatformBootTimeOut
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
+ gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent
[Pcd.IA32, Pcd.X64]
gEfiMdePkgTokenSpaceGuid.PcdFSBClock