public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Lendacky, Thomas via groups.io" <thomas.lendacky=amd.com@groups.io>
To: wojiaohanliyang@163.com, devel@edk2.groups.io
Cc: erdemaktas@google.com, jejb@linux.ibm.com, jiewen.yao@intel.com,
	min.m.xu@intel.com, kraxel@redhat.com
Subject: Re: [edk2-devel] [PATCH 1/3] OvmfPkg/PlatformInitLib: Detect FlashNvVarStore before validate it
Date: Mon, 15 Jul 2024 09:15:04 -0500	[thread overview]
Message-ID: <5c722bb7-e1cb-9f4d-f9e2-48b0a99db781@amd.com> (raw)
In-Reply-To: <20240714122455.136148-2-wojiaohanliyang@163.com>

On 7/14/24 07:24, wojiaohanliyang@163.com wrote:
> From: hanliyang <wojiaohanliyang@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.
> 

While Secure Boot isn't supported at the moment for SEV-ES / SEV-SNP,
this will cause a boot failure for those types of VMs should it be
enabled.

SEV-ES results in:

Invalid MMIO opcode (AF)
ASSERT [SecMain] /root/kernels/ovmf-build-X64/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c(498): ((BOOLEAN)(0==1))

while SEV-SNP just terminates with an error in Qemu.

I haven't looked into what the cause is at this time.

Thanks,
Tom

> Fixes: 4f173db8b45b ("OvmfPkg/PlatformInitLib: Add functions for EmuVariableNvStore")
> Signed-off-by: hanliyang <wojiaohanliyang@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


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119935): https://edk2.groups.io/g/devel/message/119935
Mute This Topic: https://groups.io/mt/107212942/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  reply	other threads:[~2024-07-15 14:15 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-14 12:24 [edk2-devel] [PATCH 0/3] Fix boot failure when use secure boot supported (-D SECURE_BOOT_ENABLE=TRUE) OVMF packages wojiaohanliyang
2024-07-14 12:24 ` [edk2-devel] [PATCH 1/3] OvmfPkg/PlatformInitLib: Detect FlashNvVarStore before validate it wojiaohanliyang
2024-07-15 14:15   ` Lendacky, Thomas via groups.io [this message]
2024-07-15 14:32     ` Lendacky, Thomas via groups.io
2024-07-17  2:30       ` 韩里洋
2024-07-19  0:57         ` Lendacky, Thomas via groups.io
2024-07-19  7:35           ` Gerd Hoffmann
2024-08-01 23:47             ` Andrew Fish via groups.io
2024-07-14 12:24 ` [edk2-devel] [PATCH 2/3] OvmfPkg/PlatformInitLib: Init the EmuVariableNvStore before copy data wojiaohanliyang
2024-07-14 12:24 ` [edk2-devel] [PATCH 3/3] OvmfPkg/PlatformPei: Update mapping of FlashNvVarStore before validate it wojiaohanliyang
  -- strict thread matches above, loose matches on Subject: below --
2024-07-14 12:22 [edk2-devel] [PATCH 0/3] Fix boot failure when use secure boot supported (-D SECURE_BOOT_ENABLE=TRUE) OVMF packages wojiaohanliyang
2024-07-14 12:22 ` [edk2-devel] [PATCH 1/3] OvmfPkg/PlatformInitLib: Detect FlashNvVarStore before validate it wojiaohanliyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5c722bb7-e1cb-9f4d-f9e2-48b0a99db781@amd.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox