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.web11.10721.1683703448544927922 for ; Wed, 10 May 2023 00:24:08 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@freebsd.org header.s=dkim header.b=F64LroUu; 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 4QGRNR1MZhz3wHf; Wed, 10 May 2023 07:24:07 +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 4QGRNQ6MY9z4Kmv; Wed, 10 May 2023 07:24:06 +0000 (UTC) (envelope-from corvink@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683703446; 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; bh=yZH7Ju1hDUyTw17ix+9Ej0kxJwm4Y2NFPifONzO0tfw=; b=F64LroUu5sUIkqWP37e6pxKQP+lgpkD+w7wlv62xT2g5OOuidobWstjtu5ULQEALtkxrhO bQTHDhQmGGhBbzNSrXt0pHINYhtyzslWsggQaJPahSi1/pfxRkE6mso/mGSddAs+JkMykt BNzm0sdp3uBJM0appcGwf46C3PoB47ixEopLTIE0jVNOszPsV2BYVhdVO944poBVvnLn4/ JG0PBSkioxdsKEfcFZFskgjOjhryU63L2EKnudhg180oM1qPDou3X+bSB6YkXr+meF3OGF owYhX1aagPBNQ9VJuTOvdoUSeuJD9/rIT4zQ2Uhf5HHiLATGMwcRvcRV9Iq06w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683703446; 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; bh=yZH7Ju1hDUyTw17ix+9Ej0kxJwm4Y2NFPifONzO0tfw=; b=cAYm1drbt9kuc7xM5ozK6R2pnfWbONWHYbRSOlVSWt+gaJ9budaDeJLSjUC67x2pd2pViN kCT+2hh658hWJJJLfemMQI1TirIQ2605/0J20zZhXq7VG2peb0sVUQGH3RUb27PSCXw4ED Rxt0y4TzoNoxF7ECX24MiHgmIYzyU4775OXbGjW431XXiM/F/SYa0AYJOqcETJFf3ppee7 LP4RPHT/bRZZ5dWxkfOOAWUJq5A+aMEjpBtsuLy5AzpS2ZdMJk4x24cv51CORaTVl/ZqbM OTxNnnMI1FOOwngZMp+4xoCDiFpfhSBQKj4i8GbeS/6xJ9wcJrZ2zqEfTSHiWg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683703446; a=rsa-sha256; cv=none; b=xqAVV01Y+JckuNOes598ppaR12lsxCilBxMOSvr3s1ihIxiu8QPY/bXn3KzmVShvZB4iGl hh8VSbh6qgEBkd3MQg37faERHXPxsmQIMGu+rzZ25cJV126fpNE6lgUytBZWZR4ELsM2D7 6/s40MO4A+3SFfl3pbWlIr3ygZSY6kruUTEOscArqNrvI12wY4YrA1nI+sSwbHrvQjO2Ku 9VADstbP0mvSMFCMVMxu8H6PfhSKAxITnMmUdZ55ABlzxg82ecmBT5fuNhkwzruV728Ucj ivpitj6ke0OF2ZRNatYJoTPLifQ5AcANWinK/bgDHqSuE+NcojdZI0hlUHd4tw== Received: from corvink-nb.beckhoff.com (unknown [IPv6:2001:9e8:da4f:c300:5a72:6c71:9bf9:8839]) (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 4QGRNP65DGzgw5; Wed, 10 May 2023 07:24: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?= , Gerd Hoffmann , Ard Biesheuvel , Jiewen Yao , Jordan Justen , Anthony Perard , Julien Grall Subject: [PATCH v4 1/3] OvmfPkg/Xen: export search of RSDP into a library function Date: Wed, 10 May 2023 09:23:24 +0200 Message-Id: <20230510072326.309805-1-corvink@FreeBSD.org> X-Mailer: git-send-email 2.40.1 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 Acked-by: Gerd Hoffmann Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Jordan Justen Cc: Anthony Perard Cc: Julien Grall --- 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 | 62 +++++++++ OvmfPkg/XenAcpiPlatformDxe/Xen.c | 119 +++++------------- 7 files changed, 147 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 03ae29e7b034..7b321ba01d72 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 1f44ec86c9c7..ddcf8a36f513 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -321,6 +321,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..ce52ad31cf25 --- /dev/null +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c @@ -0,0 +1,62 @@ +/** @file + Copyright (c) 2023, Corvin K=C3=B6hne + + 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