From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.groups.io with SMTP id smtpd.web11.74539.1669986643049131410 for ; Fri, 02 Dec 2022 05:10:43 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Bg2/2C6X; spf=pass (domain: redhat.com, ip: 170.10.133.124, mailfrom: kraxel@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669986641; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uziFgh5Uf01j70t3mqZQrT/4G5CU4JndeSgb2iPhrbk=; b=Bg2/2C6XuszWxenCUP6pPxNY5wEg6IfEURgVFZH2BgLMWpE2NSGoCYusa4R4o5DJMjtKqE x7p+QpP14Y2biTImefNvlFz1X71IWMYa9+DJmXJA04aOunT4aML55fNq158yTgplZ4BsJ0 E9exIjCRaHeGRH7PDoslE50ESH93DCo= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-64--HLdzwXjMOCXzkFI4KMw3A-1; Fri, 02 Dec 2022 08:10:37 -0500 X-MC-Unique: -HLdzwXjMOCXzkFI4KMw3A-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0A854101A528; Fri, 2 Dec 2022 13:10:35 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.192.79]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 99910C1908E; Fri, 2 Dec 2022 13:10:34 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 08A341801563; Fri, 2 Dec 2022 14:10:10 +0100 (CET) From: "Gerd Hoffmann" To: devel@edk2.groups.io Cc: Bob Feng , Yuwei Chen , Erdem Aktas , Jordan Justen , Peter Grehan , Rebecca Cran , Liming Gao , Ard Biesheuvel , Gerd Hoffmann , Jiewen Yao , Min Xu , Brijesh Singh , Oliver Steffen , Pawel Polawski , Tom Lendacky , James Bottomley Subject: [PATCH 13/14] OvmfPkg/QemuFwCfgLib: rewrite fw_cfg probe Date: Fri, 2 Dec 2022 14:10:08 +0100 Message-Id: <20221202131009.3190040-14-kraxel@redhat.com> In-Reply-To: <20221202131009.3190040-1-kraxel@redhat.com> References: <20221202131009.3190040-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true Move the code to a new QemuFwCfgProbe() function. Use direct Io*() calls instead of indirect QemuFwCfg*() calls to make sure we don't get recursive calls. Also simplify CC guest detection. Signed-off-by: Gerd Hoffmann --- .../Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf | 1 - OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c | 101 +++++++----------- 2 files changed, 41 insertions(+), 61 deletions(-) diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf index 3910511880c9..1d7543a7d40f 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf @@ -41,7 +41,6 @@ [LibraryClasses] DebugLib IoLib MemoryAllocationLib - MemEncryptSevLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c index 7ab7027af168..a936fd103955 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include "QemuFwCfgLibInternal.h" @@ -27,15 +26,16 @@ STATIC BOOLEAN mQemuFwCfgDmaSupported; @retval TRUE It is Tdx guest @retval FALSE It is not Tdx guest **/ +STATIC BOOLEAN -QemuFwCfgIsTdxGuest ( +QemuFwCfgIsCcGuest ( VOID ) { CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER *CcWorkAreaHeader; CcWorkAreaHeader = (CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER *)FixedPcdGet32 (PcdOvmfWorkAreaBase); - return (CcWorkAreaHeader != NULL && CcWorkAreaHeader->GuestType == CcGuestTypeIntelTdx); + return (CcWorkAreaHeader != NULL && CcWorkAreaHeader->GuestType != CcGuestTypeNonEncrypted); } /** @@ -57,62 +57,49 @@ QemuFwCfgIsAvailable ( return InternalQemuFwCfgIsAvailable (); } +STATIC +VOID +QemuFwCfgProbe ( + BOOLEAN *Supported, + BOOLEAN *DmaSupported + ) +{ + UINT32 Signature; + UINT32 Revision; + BOOLEAN CcGuest; + + // Use direct Io* calls for probing to avoid recursion. + IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)QemuFwCfgItemSignature); + IoReadFifo8 (FW_CFG_IO_DATA, sizeof Signature, &Signature); + IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)QemuFwCfgItemInterfaceVersion); + IoReadFifo8 (FW_CFG_IO_DATA, sizeof Revision, &Revision); + CcGuest = QemuFwCfgIsCcGuest (); + + *Supported = FALSE; + *DmaSupported = FALSE; + if ((Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) && (Revision >= 1)) { + *Supported = TRUE; + if ((Revision & FW_CFG_F_DMA) && !CcGuest) { + *DmaSupported = TRUE; + } + } + + DEBUG (( + DEBUG_INFO, + "%a: Supported %d, DMA %d\n", + __func__, + *Supported, + *DmaSupported + )); +} + RETURN_STATUS EFIAPI QemuFwCfgInitialize ( VOID ) { - UINT32 Signature; - UINT32 Revision; - - // - // Enable the access routines while probing to see if it is supported. - // For probing we always use the IO Port (IoReadFifo8()) access method. - // - mQemuFwCfgSupported = TRUE; - mQemuFwCfgDmaSupported = FALSE; - - QemuFwCfgSelectItem (QemuFwCfgItemSignature); - Signature = QemuFwCfgRead32 (); - DEBUG ((DEBUG_INFO, "FW CFG Signature: 0x%x\n", Signature)); - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); - Revision = QemuFwCfgRead32 (); - DEBUG ((DEBUG_INFO, "FW CFG Revision: 0x%x\n", Revision)); - if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) || - (Revision < 1) - ) - { - DEBUG ((DEBUG_INFO, "QemuFwCfg interface not supported.\n")); - mQemuFwCfgSupported = FALSE; - return RETURN_SUCCESS; - } - - if ((Revision & FW_CFG_F_DMA) == 0) { - DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n")); - } else { - // - // If SEV is enabled then we do not support DMA operations in PEI phase. - // This is mainly because DMA in SEV guest requires using bounce buffer - // (which need to allocate dynamic memory and allocating a PAGE size'd - // buffer can be challenge in PEI phase) - // - if (MemEncryptSevIsEnabled ()) { - DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n")); - } else if (QemuFwCfgIsTdxGuest ()) { - // - // If TDX is enabled then we do not support DMA operations in PEI phase. - // This is mainly because DMA in TDX guest requires using bounce buffer - // (which need to allocate dynamic memory and allocating a PAGE size'd - // buffer can be challenge in PEI phase) - // - DEBUG ((DEBUG_INFO, "TDX: QemuFwCfg fallback to IO Port interface.\n")); - } else { - mQemuFwCfgDmaSupported = TRUE; - DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n")); - } - } - + QemuFwCfgProbe (&mQemuFwCfgSupported, &mQemuFwCfgDmaSupported); return RETURN_SUCCESS; } @@ -183,17 +170,11 @@ InternalQemuFwCfgDmaBytes ( return; } - // - // SEV does not support DMA operations in PEI stage, we should - // not have reached here. - // - ASSERT (!MemEncryptSevIsEnabled ()); - // // TDX does not support DMA operations in PEI stage, we should // not have reached here. // - ASSERT (!QemuFwCfgIsTdxGuest ()); + ASSERT (!QemuFwCfgIsCcGuest ()); Access.Control = SwapBytes32 (Control); Access.Length = SwapBytes32 (Size); -- 2.38.1