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 (#119922): https://edk2.groups.io/g/devel/message/119922 Mute This Topic: https://groups.io/mt/107212920/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-