From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx2.freebsd.org (mx2.freebsd.org [96.47.72.81]) by mx.groups.io with SMTP id smtpd.web10.4469.1686043327504211706 for ; Tue, 06 Jun 2023 02:22:08 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@freebsd.org header.s=dkim header.b=LPQuLkN5; spf=pass (domain: freebsd.org, ip: 96.47.72.81, mailfrom: corvink@freebsd.org) Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits)) (Client CN "mx1.freebsd.org", Issuer "R3" (verified OK)) by mx2.freebsd.org (Postfix) with ESMTPS id 4Qb4k661qJz49D1; Tue, 6 Jun 2023 09:22:06 +0000 (UTC) (envelope-from corvink@FreeBSD.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Qb4k64wyhz4DBq; Tue, 6 Jun 2023 09:22:06 +0000 (UTC) (envelope-from corvink@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686043326; 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=GPRXbAZ2qgyRFPmXy8zMgJob/c+1BPi9Gx51ZLqrXnM=; b=LPQuLkN5MIieNtznGtVp6roZMfCEQIDWKYGRTU5GRazUPpauC8XiaWiRkC3xEG2EnbFGR7 0kG8thcnNpu50TqzofSwyFS9T3fUGvi7JaKZ2w2shClST0E+oiR1+GecR44T8pDoOf4DOn xUbeYDweZ4etDKg9A/2+6BXI4VaAUWKa0ZlSFMWmNPPZrL33TByOCUJvScflvQl9sbujY0 /iHK/wPqVqbIcZS3n4Bif71yATSHf+S7Vwcv1LP6ERtI7+WnBerXaU7/F+50QaA8s8JsSf qgl55vebINLJyQ7c0phe9QskPJTyH6RoJ5407FbWEw9dOSHinPIB0ZLepMAFHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686043326; 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=GPRXbAZ2qgyRFPmXy8zMgJob/c+1BPi9Gx51ZLqrXnM=; b=jw+sl8vnAFBqRs0KQhd/xyrj5MUg9rprD2TzrWTm3BqCTa9iUmXuKXK/gQb58rhQ22JUXs 2VnuH2REdaKeN7hxOA8Ss28Kxkl6MO5OL3nS1ObniRIE2JTo1dbSrfpwQWwWc0EU29eAEa 4EohE+0jzD0IIRx+6pbAwuZMPYQn9zQ46pjecX5D+LZi8l/DQHaAuKzNzyeHzQcdUWcXWC rttKpBsDMGRa6IOt/MHs2rwpoXlW0JjYoFr5ULvm0LZahycFl/SZCqvxiikR5tJXPgz3Rl 9BJ09oi8Ewz+6LkY867ZXcCwDFjSmVrvzo1NMr3QUHXIWMkLJSWZdJ1SbW0Siw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1686043326; a=rsa-sha256; cv=none; b=BcZ5WMkfv76jfRFwlcJX5Cu6algyjdxnIrcQWu8cPCplYBTw2R+W0tPUttk0MPhASkxnW+ r+2SrYmaSr6nMlRLYyB3yBMmZ38l6w/+rGvoINu9NZ3Qrlv/zSrM88tAdpjL8EXY7oRK/x oo1JJSL9jdzem0/E4MqmB/+wLKIy+F9/G/8ErPGuZOICdr5RRnjO8rPK837XfnNl4QWy6W M3IoqxxUdlzzfyWM5EaQdYtRN19lGWIN4aNsG59u5Q16fim+PvOOdeijjGNh7G/jCAzOab KWZkZZEdHl6OQ4IWM0G3MxnSq6NsCq0EejNc2zc2Vap1wCzPmjCj4KSic/FJPA== Received: from corvink-nb.beckhoff.com (unknown [IPv6:2001:9e8:da59:8e00:1c7e:7163:67b2:a7d8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: corvink) by smtp.freebsd.org (Postfix) with ESMTPSA id 4Qb4k53SgxzgFN; Tue, 6 Jun 2023 09:22:05 +0000 (UTC) (envelope-from corvink@FreeBSD.org) From: =?UTF-8?B?Q29ydmluIEvDtmhuZQ==?= To: devel@edk2.groups.io Cc: =?UTF-8?q?Corvin=20K=C3=B6hne?= , Anthony PERARD , Gerd Hoffmann , Ard Biesheuvel , Jiewen Yao , Jordan Justen , Julien Grall , Rebecca Cran , Peter Grehan Subject: [PATCH v6 1/3] OvmfPkg/Xen: export search of RSDP into a library function Date: Tue, 6 Jun 2023 11:21:37 +0200 Message-Id: <20230606092139.115800-2-corvink@FreeBSD.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230606092139.115800-1-corvink@FreeBSD.org> References: <20230606092139.115800-1-corvink@FreeBSD.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Xen and bhyve are placing ACPI tables into system memory. So, they can share the same code. Therefore, create a new library which searches and installs ACPI tables from system memory. Signed-off-by: Corvin K=C3=B6hne Reviewed-by: Anthony PERARD Acked-by: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Jordan Justen Cc: Julien Grall Cc: Rebecca Cran Cc: Peter Grehan --- OvmfPkg/OvmfPkg.dec | 4 + OvmfPkg/OvmfXen.dsc | 1 + .../AcpiPlatformLib/DxeAcpiPlatformLib.inf | 26 ++++ .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf | 1 + OvmfPkg/Include/Library/AcpiPlatformLib.h | 24 ++++ .../AcpiPlatformLib/DxeAcpiPlatformLib.c | 67 ++++++++++ OvmfPkg/XenAcpiPlatformDxe/Xen.c | 119 +++++------------- 7 files changed, 152 insertions(+), 90 deletions(-) create mode 100644 OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.in= f create mode 100644 OvmfPkg/Include/Library/AcpiPlatformLib.h create mode 100644 OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index cc5a4ceead25..e3861e5c1b39 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -20,6 +20,10 @@ [Includes] Csm/Include =20 [LibraryClasses] + ## @libraryclass Search and install ACPI tables. + # + AcpiPlatformLib|Include/Library/AcpiPlatformLib.h + ## @libraryclass Access bhyve's firmware control interface. BhyveFwCtlLib|Include/Library/BhyveFwCtlLib.h =20 diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 02d7f204d418..210578c1d74d 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -322,6 +322,7 @@ [LibraryClasses.common.UEFI_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf =20 [LibraryClasses.common.DXE_DRIVER] + AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf b/Ovm= fPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf new file mode 100644 index 000000000000..dfe0e5623d32 --- /dev/null +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf @@ -0,0 +1,26 @@ +## @file +# ACPI Platform Library Instance. +# +# Copyright (C) 2023, Corvin K=C3=B6hne +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D DxeAcpiPlatformLib + FILE_GUID =3D 578F441A-4A4C-4D24-B9BE-F783152B46F6 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D AcpiPlatformLib + +[Sources] + DxeAcpiPlatformLib.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + DebugLib diff --git a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf b/OvmfPkg/= XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf index d3a6353a50a6..65374569ddc2 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf +++ b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf @@ -32,6 +32,7 @@ [Packages] OvmfPkg/OvmfPkg.dec =20 [LibraryClasses] + AcpiPlatformLib BaseLib DebugLib UefiBootServicesTableLib diff --git a/OvmfPkg/Include/Library/AcpiPlatformLib.h b/OvmfPkg/Include/= Library/AcpiPlatformLib.h new file mode 100644 index 000000000000..b0a3c5bd0048 --- /dev/null +++ b/OvmfPkg/Include/Library/AcpiPlatformLib.h @@ -0,0 +1,24 @@ +/** @file + Copyright (c) 2023, Corvin K=C3=B6hne + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +/** + Searches and returns the address of the ACPI Root System Description P= ointer (RSDP) in system memory. + + @param StartAddress Start address of search range. + @param EndAddress End address of search range. + @param RsdpPtr Return pointer to RSDP. + + @retval EFI_SUCCESS RSDP successfully found. + @retval EFI_NOT_FOUND Couldn't find RSDP. + @retval EFI_ABORTED Invalid RSDP found. +**/ +EFI_STATUS +EFIAPI +GetAcpiRsdpFromMemory ( + IN UINT64 StartAddress, + IN UINT64 EndAddress, + OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr + ); diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfP= kg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c new file mode 100644 index 000000000000..9dd9026edb12 --- /dev/null +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c @@ -0,0 +1,67 @@ +/** @file + OVMF ACPI support + + Copyright (C) 2021, Red Hat, Inc. + Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2012, Bei Guan + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include + +EFI_STATUS +EFIAPI +GetAcpiRsdpFromMemory ( + IN UINTN StartAddress, + IN UINTN EndAddress, + OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr + ) +{ + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr; + UINT8 *AcpiPtr; + UINT8 Sum; + + for (AcpiPtr =3D (UINT8 *)StartAddress; + AcpiPtr < (UINT8 *)EndAddress; + AcpiPtr +=3D 0x10) + { + RsdpStructurePtr =3D (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *= ) + (UINTN)AcpiPtr; + + if (!AsciiStrnCmp ((CHAR8 *)&RsdpStructurePtr->Signature, "RSD PTR "= , 8)) { + // + // RSDP ACPI 1.0 checksum for 1.0/2.0/3.0 table. + // This is only the first 20 bytes of the structure + // + Sum =3D CalculateSum8 ( + (CONST UINT8 *)RsdpStructurePtr, + sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) + ); + if (Sum !=3D 0) { + return EFI_ABORTED; + } + + if (RsdpStructurePtr->Revision >=3D 2) { + // + // RSDP ACPI 2.0/3.0 checksum, this is the entire table + // + Sum =3D CalculateSum8 ( + (CONST UINT8 *)RsdpStructurePtr, + sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER) + ); + if (Sum !=3D 0) { + return EFI_ABORTED; + } + } + + *RsdpPtr =3D RsdpStructurePtr; + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDx= e/Xen.c index a80a24628c08..a3812cb8d6d9 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c +++ b/OvmfPkg/XenAcpiPlatformDxe/Xen.c @@ -9,6 +9,7 @@ =20 **/ =20 +#include #include // CpuDeadLoop() #include // DEBUG() #include // XenGetInfoHOB() @@ -20,92 +21,6 @@ =20 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr =3D= NULL; =20 -/** - Get the address of Xen ACPI Root System Description Pointer (RSDP) - structure. - - @param RsdpStructurePtr Return pointer to RSDP structure - - @return EFI_SUCCESS Find Xen RSDP structure successfully. - @return EFI_NOT_FOUND Don't find Xen RSDP structure. - @return EFI_ABORTED Find Xen RSDP structure, but it's not integ= rated. - -**/ -EFI_STATUS -EFIAPI -GetXenAcpiRsdp ( - OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr - ) -{ - EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr; - UINT8 *XenAcpiPtr; - UINT8 Sum; - EFI_XEN_INFO *XenInfo; - - // - // Detect the RSDP structure - // - - // - // First look for PVH one - // - XenInfo =3D XenGetInfoHOB (); - ASSERT (XenInfo !=3D NULL); - if (XenInfo->RsdpPvh !=3D NULL) { - DEBUG (( - DEBUG_INFO, - "%a: Use ACPI RSDP table at 0x%p\n", - gEfiCallerBaseName, - XenInfo->RsdpPvh - )); - *RsdpPtr =3D XenInfo->RsdpPvh; - return EFI_SUCCESS; - } - - // - // Otherwise, look for the HVM one - // - for (XenAcpiPtr =3D (UINT8 *)(UINTN)XEN_ACPI_PHYSICAL_ADDRESS; - XenAcpiPtr < (UINT8 *)(UINTN)XEN_BIOS_PHYSICAL_END; - XenAcpiPtr +=3D 0x10) - { - RsdpStructurePtr =3D (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *= ) - (UINTN)XenAcpiPtr; - - if (!AsciiStrnCmp ((CHAR8 *)&RsdpStructurePtr->Signature, "RSD PTR "= , 8)) { - // - // RSDP ACPI 1.0 checksum for 1.0/2.0/3.0 table. - // This is only the first 20 bytes of the structure - // - Sum =3D CalculateSum8 ( - (CONST UINT8 *)RsdpStructurePtr, - sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) - ); - if (Sum !=3D 0) { - return EFI_ABORTED; - } - - if (RsdpStructurePtr->Revision >=3D 2) { - // - // RSDP ACPI 2.0/3.0 checksum, this is the entire table - // - Sum =3D CalculateSum8 ( - (CONST UINT8 *)RsdpStructurePtr, - sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER) - ); - if (Sum !=3D 0) { - return EFI_ABORTED; - } - } - - *RsdpPtr =3D RsdpStructurePtr; - return EFI_SUCCESS; - } - } - - return EFI_NOT_FOUND; -} - /** Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tab= les into the RSDT/XSDT using InstallAcpiTable. Some signature of the insta= lled @@ -142,6 +57,7 @@ InstallXenTables ( EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs2Table; EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs1Table; EFI_ACPI_DESCRIPTION_HEADER *DsdtTable; + EFI_XEN_INFO *XenInfo; =20 Fadt2Table =3D NULL; Fadt1Table =3D NULL; @@ -152,11 +68,34 @@ InstallXenTables ( NumberOfTableEntries =3D 0; =20 // - // Try to find Xen ACPI tables + // Detect the RSDP structure // - Status =3D GetXenAcpiRsdp (&XenAcpiRsdpStructurePtr); - if (EFI_ERROR (Status)) { - return Status; + + // + // First look for PVH one + // + XenInfo =3D XenGetInfoHOB (); + ASSERT (XenInfo !=3D NULL); + if (XenInfo->RsdpPvh !=3D NULL) { + DEBUG (( + DEBUG_INFO, + "%a: Use ACPI RSDP table at 0x%p\n", + gEfiCallerBaseName, + XenInfo->RsdpPvh + )); + XenAcpiRsdpStructurePtr =3D XenInfo->RsdpPvh; + } else { + // + // Otherwise, look for the HVM one + // + Status =3D GetAcpiRsdpFromMemory ( + XEN_ACPI_PHYSICAL_ADDRESS, + XEN_BIOS_PHYSICAL_END, + &XenAcpiRsdpStructurePtr + ); + if (EFI_ERROR (Status)) { + return Status; + } } =20 // --=20 2.40.1