From: hanliyang <wojiaohanliy...@163.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4807

The commit 4f173db8b45b ("OvmfPkg/PlatformInitLib: Add functions for
EmuVariableNvStore") rename the function from TdxValidateCfv to
PlatformValidateNvVarStore.

PlatformValidateNvVarStore is placed in the PlatformInitLib and is used
in the case that OVMF is launched with -bios parameter and to validate
the integrity of FlashNvVarStore. But if we launch a VM without
FlashNvVarStore, the PlatformValidateNvVarStore will fail to validate
the integrity and will trigger ASSERT (FALSE) in
PlatformInitEmuVariableNvStore.

In order to prevent calls to PlatformValidateNvVarStore in the case lack
of FlashNvVarStore, we should detect FlashNvVarStore before calls to
PlatformValidateNvVarStore. If fail to detect FlashNvVarStore, we should
return don't initialize the EmuVariableNvStore, otherwise calls to
PlatformValidateNvVarStore and initialize the EmuVariableNvStore when
succeed to validate the integrity of NvVarStore.

Fixes: 4f173db8b45b ("OvmfPkg/PlatformInitLib: Add functions for 
EmuVariableNvStore")
Signed-off-by: hanliyang <wojiaohanliy...@163.com>
---
 OvmfPkg/Library/PlatformInitLib/Platform.c    | 47 +++++++++++++++++++
 .../PlatformInitLib/PlatformInitLib.inf       |  1 +
 2 files changed, 48 insertions(+)

diff --git a/OvmfPkg/Library/PlatformInitLib/Platform.c 
b/OvmfPkg/Library/PlatformInitLib/Platform.c
index f48bf16ae3..0a720a4c2c 100644
--- a/OvmfPkg/Library/PlatformInitLib/Platform.c
+++ b/OvmfPkg/Library/PlatformInitLib/Platform.c
@@ -895,6 +895,16 @@ PlatformReserveEmuVariableNvStore (
   return VariableStore;
 }
 
+#define WRITE_BYTE_CMD           0x10
+#define BLOCK_ERASE_CMD          0x20
+#define CLEAR_STATUS_CMD         0x50
+#define READ_STATUS_CMD          0x70
+#define READ_DEVID_CMD           0x90
+#define BLOCK_ERASE_CONFIRM_CMD  0xd0
+#define READ_ARRAY_CMD           0xff
+
+#define CLEARED_ARRAY_STATUS  0x00
+
 /**
  When OVMF is lauched with -bios parameter, UEFI variables will be
  partially emulated, and non-volatile variables may lose their contents
@@ -928,6 +938,43 @@ PlatformInitEmuVariableNvStore (
   Size = (UINT32)PcdGet32 (PcdFlashNvStorageVariableSize);
   ASSERT (Size < EmuVariableNvStoreSize);
 
+  //
+  // If launch a VM without OvmfFlashNvStorage device, then we'll fail
+  // to check the integrity of NvVarStore and trigger ASSERT (FALSE).
+  // So, we should detect the OvmfFlashNvStorage before calls to
+  // PlatformValidateNvVarStore(). If fail to detect OvmfFlashNvStorage,
+  // we should return and don't initialize the EmuVariableNvStore,
+  // otherwise calls to PlatformValidateNvVarStore() and initialize the
+  // EmuVariableNvStore when succeed to check the integrity of
+  // NvVarStore.
+  //
+  // This method to detect the OvmfFlashNvStorage here references
+  // OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlash.c.
+  //
+  volatile UINT8  *Ptr;
+
+  UINTN  BlockSize;
+  UINTN  Offset;
+  UINT8  ProbeUint8;
+
+  BlockSize = PcdGet32 (PcdOvmfFirmwareBlockSize);
+
+  for (Offset = 0; Offset < BlockSize; Offset++) {
+    Ptr        = Base + Offset;
+    ProbeUint8 = *Ptr;
+    if ((ProbeUint8 != CLEAR_STATUS_CMD) &&
+        (ProbeUint8 != READ_STATUS_CMD) &&
+        (ProbeUint8 != CLEARED_ARRAY_STATUS))
+    {
+      break;
+    }
+  }
+
+  if (Offset >= BlockSize) {
+    DEBUG ((DEBUG_INFO, "OvmfFlashNvStorage: Failed to find probe 
location\n"));
+    return EFI_INVALID_PARAMETER;
+  }
+
   if (!PlatformValidateNvVarStore (Base, PcdGet32 (PcdCfvRawDataSize))) {
     ASSERT (FALSE);
     return EFI_INVALID_PARAMETER;
diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf 
b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf
index 21e6efa5e0..b7d5e63dcd 100644
--- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf
+++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf
@@ -104,6 +104,7 @@
   gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
   gUefiOvmfPkgTokenSpaceGuid.PcdCfvRawDataSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize
 
 [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode
-- 
2.25.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119927): https://edk2.groups.io/g/devel/message/119927
Mute This Topic: https://groups.io/mt/107212942/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to