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.4470.1686043328661642428 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=hd7kH1ga; 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 4Qb4k80TVTz492l; Tue, 6 Jun 2023 09:22:08 +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 4Qb4k803s1z4CyN; Tue, 6 Jun 2023 09:22:08 +0000 (UTC) (envelope-from corvink@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686043328; 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=c+ee4r/E3Vn1lM/b7wuaW9N3qhTFoSNu6qdg2iCORgg=; b=hd7kH1gaWJt2MEJQWpxzzQhCIl2/dSmxDnNXOs1xqCf+AzyX2GpcWw6m2NA0ssV+f1X3X6 fNcbkLVPJb06cDCLkWYlLscjaRMzdoJByEqUzqwjcfTWA3xJaQI67UWpD3pFX6YTmmMrj+ DKRr3EQcFw7KZBKIVtcqg5vNi93SdNux+Kj0zRTmqkhndqKEtq0cKFSNkPOdvzybsxXzN9 STBPSC36Pot+SzmoVZzqHUFraN6aRtJMDSG0FkNKYwZfX90wPGd5FImojrVLzDQ8+Pc2cc e8FPNJZVj9XERtmV+w4wt0ia6Oks6vcEaefH2YAz7wbRBTGYBDBifD5/uEuOMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686043328; 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=c+ee4r/E3Vn1lM/b7wuaW9N3qhTFoSNu6qdg2iCORgg=; b=k6/NEr/wE1HC0la2SiQxIf7z/XA4KkUqqIyRPcvAsk2SgeRxPI2zX+5yGP9CnH/mO2NaoE hhusmE/GHqrXzVE5NNDAN4N33Fw6bfGTvYVREF6WzIuvtaJ19y2mObTIO6o+kkAbRH2zAt uufRmBrpMI+INEHFrJnGS+6qaWFHje31ie4xKdakfEUGtRHXs07CaWJafpht5Ul8OFwd/Y u+BMue0kRah1b2//D+gIfUzsJ2ZQGilaIr03WBTvYHMhTH1n/VbFRY0SN1mKmQjweJ3otA K8R28MKzvaZrdx4pKMn/EwsxEtJDdnnV+K9VUbRVZfXiUGLhwpo+TFIi1H5xfw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1686043328; a=rsa-sha256; cv=none; b=SqzPgtUjPlhUvqgaRr4yND6EojTaugjjus4tsazlPcD7uQuVIGBmFtAeB/bJPTPIOpoyAs C4dhDBfwdxjw6GkTN8cT+AUdSTLyZclt2+iLz1DzrQhHBjj9cBDAoATzX/ofWnkTaoJFm2 q89rY9ICsLmW2h9hKg0BRuZ0J4k03qE4fk0u3CcnDIsKLjS5gTmv6h1zSvb0P43WDtbKPf q77sIZ97FMYhThXT0DC1iYCWs9N3GkMoEXWbkekjaX+DO0OSmU1iRqQA0lx8QtpYeoOAa4 k7G0nWtjh7XlWq79fNJg/PXh2tbVFQkCJuMXGPAHdh+NSZ8ABbETtOdz0D2AXw== 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 4Qb4k65F4rzfm1; Tue, 6 Jun 2023 09:22:06 +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 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Date: Tue, 6 Jun 2023 11:21:38 +0200 Message-Id: <20230606092139.115800-3-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 This makes the function reuseable by bhyve. 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 --- .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf | 1 - OvmfPkg/Include/Library/AcpiPlatformLib.h | 25 ++ .../AcpiPlatformLib/DxeAcpiPlatformLib.c | 185 +++++++++++++ OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c | 47 +++- OvmfPkg/XenAcpiPlatformDxe/Xen.c | 257 ------------------ 5 files changed, 254 insertions(+), 261 deletions(-) delete mode 100644 OvmfPkg/XenAcpiPlatformDxe/Xen.c diff --git a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf b/OvmfPkg/= XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf index 65374569ddc2..be175d290f92 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf +++ b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf @@ -25,7 +25,6 @@ [Sources] AcpiPlatform.c AcpiPlatform.h EntryPoint.c - Xen.c =20 [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Include/Library/AcpiPlatformLib.h b/OvmfPkg/Include/= Library/AcpiPlatformLib.h index b0a3c5bd0048..73a170636032 100644 --- a/OvmfPkg/Include/Library/AcpiPlatformLib.h +++ b/OvmfPkg/Include/Library/AcpiPlatformLib.h @@ -4,6 +4,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 +#include + /** Searches and returns the address of the ACPI Root System Description P= ointer (RSDP) in system memory. =20 @@ -22,3 +24,26 @@ GetAcpiRsdpFromMemory ( IN UINT64 EndAddress, OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr ); + +/** + Get Acpi tables from the RSDP structure. And installs ACPI tables + into the RSDT/XSDT using InstallAcpiTable. Some signature of the insta= lled + ACPI tables are: FACP, APIC, HPET, WAET, SSDT, FACS, DSDT. + + @param AcpiProtocol Protocol instance pointer. + + @return EFI_SUCCESS The table was successfully inserted. + @return EFI_INVALID_PARAMETER Either AcpiTableBuffer is NULL, TableHa= ndle is + NULL, or AcpiTableBufferSize and the si= ze + field embedded in the ACPI table pointe= d to + by AcpiTableBuffer are not in sync. + @return EFI_OUT_OF_RESOURCES Insufficient resources exist to complet= e the +request. + +**/ +EFI_STATUS +EFIAPI +InstallAcpiTablesFromRsdp ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp + ); diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfP= kg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c index 9dd9026edb12..228cb20ee697 100644 --- a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c @@ -65,3 +65,188 @@ GetAcpiRsdpFromMemory ( =20 return EFI_NOT_FOUND; } + +EFI_STATUS +EFIAPI +InstallAcpiTablesFromRsdp ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp + ) +{ + EFI_STATUS Status; + UINTN TableHandle; + + EFI_ACPI_DESCRIPTION_HEADER *Rsdt; + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; + VOID *CurrentTableEntry; + UINTN CurrentTablePointer; + EFI_ACPI_DESCRIPTION_HEADER *CurrentTable; + UINTN Index; + UINTN NumberOfTableEntries; + EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt2Table; + EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt1Table; + EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs2Table; + EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs1Table; + EFI_ACPI_DESCRIPTION_HEADER *DsdtTable; + + Fadt2Table =3D NULL; + Fadt1Table =3D NULL; + Facs2Table =3D NULL; + Facs1Table =3D NULL; + DsdtTable =3D NULL; + TableHandle =3D 0; + NumberOfTableEntries =3D 0; + + // + // If XSDT table is find, just install its tables. + // Otherwise, try to find and install the RSDT tables. + // + if (Rsdp->XsdtAddress) { + // + // Retrieve the addresses of XSDT and + // calculate the number of its table entries. + // + Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp-= >XsdtAddress; + NumberOfTableEntries =3D + (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UI= NT64); + + // + // Install ACPI tables found in XSDT. + // + for (Index =3D 0; Index < NumberOfTableEntries; Index++) { + // + // Get the table entry from XSDT + // + CurrentTableEntry =3D + (VOID *)((UINT8 *)Xsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) + + Index * sizeof (UINT64)); + CurrentTablePointer =3D (UINTN)*(UINT64 *)CurrentTableEntry; + CurrentTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl= ePointer; + + // + // Install the XSDT tables + // + Status =3D AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + CurrentTable, + CurrentTable->Length, + &TableHandle + ); + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the FACS and DSDT table address from the table FADT + // + if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) = { + Fadt2Table =3D (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UIN= TN) + CurrentTablePointer; + Facs2Table =3D (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(= UINTN) + Fadt2Table->FirmwareCtrl; + DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->= Dsdt; + } + } + } else if (Rsdp->RsdtAddress) { + // + // Retrieve the addresses of RSDT and + // calculate the number of its table entries. + // + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp-= >RsdtAddress; + NumberOfTableEntries =3D + (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UI= NT32); + + // + // Install ACPI tables found in XSDT. + // + for (Index =3D 0; Index < NumberOfTableEntries; Index++) { + // + // Get the table entry from RSDT + // + CurrentTableEntry =3D + (UINT32 *)((UINT8 *)Rsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) = + + Index * sizeof (UINT32)); + CurrentTablePointer =3D *(UINT32 *)CurrentTableEntry; + CurrentTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl= ePointer; + + // + // Install the RSDT tables + // + Status =3D AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + CurrentTable, + CurrentTable->Length, + &TableHandle + ); + + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the FACS and DSDT table address from the table FADT + // + if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) = { + Fadt1Table =3D (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UIN= TN) + CurrentTablePointer; + Facs1Table =3D (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(= UINTN) + Fadt1Table->FirmwareCtrl; + DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->= Dsdt; + } + } + } + + // + // Install the FACS table. + // + if (Fadt2Table) { + // + // FACS 2.0 + // + Status =3D AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + Facs2Table, + Facs2Table->Length, + &TableHandle + ); + if (EFI_ERROR (Status)) { + return Status; + } + } else if (Fadt1Table) { + // + // FACS 1.0 + // + Status =3D AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + Facs1Table, + Facs1Table->Length, + &TableHandle + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + // + // Install DSDT table. If we reached this point without finding the DS= DT, + // then we're out of sync with the hypervisor, and cannot continue. + // + if (DsdtTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__)); + ASSERT (FALSE); + CpuDeadLoop (); + } + + Status =3D AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + DsdtTable, + DsdtTable->Length, + &TableHandle + ); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} diff --git a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c b/OvmfPkg/XenAcpiP= latformDxe/AcpiPlatform.c index e06bb25dfc15..2dbc812953d2 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c +++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c @@ -7,10 +7,15 @@ =20 **/ =20 -#include // XenDetected() +#include // InstallAcpiTablesFromMemory() +#include // DEBUG() +#include // XenDetected() =20 #include "AcpiPlatform.h" =20 +#define XEN_ACPI_PHYSICAL_ADDRESS 0x000EA020 +#define XEN_BIOS_PHYSICAL_END 0x000FFFFF + /** Effective entrypoint of Acpi Platform driver. =20 @@ -28,10 +33,46 @@ InstallAcpiTables ( IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable ) { - EFI_STATUS Status; + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr; + EFI_XEN_INFO *XenInfo; + EFI_STATUS Status; =20 if (XenDetected ()) { - Status =3D InstallXenTables (AcpiTable); + // + // 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 + )); + RsdpStructurePtr =3D XenInfo->RsdpPvh; + } else { + // + // Otherwise, look for the HVM one + // + Status =3D GetAcpiRsdpFromMemory ( + XEN_ACPI_PHYSICAL_ADDRESS, + XEN_BIOS_PHYSICAL_END, + &RsdpStructurePtr + ); + if (EFI_ERROR (Status)) { + return Status; + } + } + + Status =3D InstallAcpiTablesFromRsdp ( + AcpiTable, + RsdpStructurePtr + ); } else { Status =3D EFI_UNSUPPORTED; } diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDx= e/Xen.c deleted file mode 100644 index a3812cb8d6d9..000000000000 --- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c +++ /dev/null @@ -1,257 +0,0 @@ -/** @file - OVMF ACPI Xen 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 // CpuDeadLoop() -#include // DEBUG() -#include // XenGetInfoHOB() - -#include "AcpiPlatform.h" - -#define XEN_ACPI_PHYSICAL_ADDRESS 0x000EA020 -#define XEN_BIOS_PHYSICAL_END 0x000FFFFF - -EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr =3D= NULL; - -/** - 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 - ACPI tables are: FACP, APIC, HPET, WAET, SSDT, FACS, DSDT. - - @param AcpiProtocol Protocol instance pointer. - - @return EFI_SUCCESS The table was successfully inserted. - @return EFI_INVALID_PARAMETER Either AcpiTableBuffer is NULL, TableHa= ndle is - NULL, or AcpiTableBufferSize and the si= ze - field embedded in the ACPI table pointe= d to - by AcpiTableBuffer are not in sync. - @return EFI_OUT_OF_RESOURCES Insufficient resources exist to complet= e the request. - -**/ -EFI_STATUS -EFIAPI -InstallXenTables ( - IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol - ) -{ - EFI_STATUS Status; - UINTN TableHandle; - - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; - VOID *CurrentTableEntry; - UINTN CurrentTablePointer; - EFI_ACPI_DESCRIPTION_HEADER *CurrentTable; - UINTN Index; - UINTN NumberOfTableEntries; - EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt2Table; - EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt1Table; - 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; - - Fadt2Table =3D NULL; - Fadt1Table =3D NULL; - Facs2Table =3D NULL; - Facs1Table =3D NULL; - DsdtTable =3D NULL; - TableHandle =3D 0; - NumberOfTableEntries =3D 0; - - // - // 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 - )); - 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; - } - } - - // - // If XSDT table is find, just install its tables. - // Otherwise, try to find and install the RSDT tables. - // - if (XenAcpiRsdpStructurePtr->XsdtAddress) { - // - // Retrieve the addresses of XSDT and - // calculate the number of its table entries. - // - Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) - XenAcpiRsdpStructurePtr->XsdtAddress; - NumberOfTableEntries =3D (Xsdt->Length - - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / - sizeof (UINT64); - - // - // Install ACPI tables found in XSDT. - // - for (Index =3D 0; Index < NumberOfTableEntries; Index++) { - // - // Get the table entry from XSDT - // - CurrentTableEntry =3D (VOID *)((UINT8 *)Xsdt + - sizeof (EFI_ACPI_DESCRIPTION_HEADER) = + - Index * sizeof (UINT64)); - CurrentTablePointer =3D (UINTN)*(UINT64 *)CurrentTableEntry; - CurrentTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl= ePointer; - - // - // Install the XSDT tables - // - Status =3D AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - CurrentTable, - CurrentTable->Length, - &TableHandle - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the FACS and DSDT table address from the table FADT - // - if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) = { - Fadt2Table =3D (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) - (UINTN)CurrentTablePointer; - Facs2Table =3D (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) - (UINTN)Fadt2Table->FirmwareCtrl; - DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->= Dsdt; - } - } - } else if (XenAcpiRsdpStructurePtr->RsdtAddress) { - // - // Retrieve the addresses of RSDT and - // calculate the number of its table entries. - // - Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) - XenAcpiRsdpStructurePtr->RsdtAddress; - NumberOfTableEntries =3D (Rsdt->Length - - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / - sizeof (UINT32); - - // - // Install ACPI tables found in XSDT. - // - for (Index =3D 0; Index < NumberOfTableEntries; Index++) { - // - // Get the table entry from RSDT - // - CurrentTableEntry =3D (UINT32 *)((UINT8 *)Rsdt + - sizeof (EFI_ACPI_DESCRIPTION_HEADER= ) + - Index * sizeof (UINT32)); - CurrentTablePointer =3D *(UINT32 *)CurrentTableEntry; - CurrentTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl= ePointer; - - // - // Install the RSDT tables - // - Status =3D AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - CurrentTable, - CurrentTable->Length, - &TableHandle - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the FACS and DSDT table address from the table FADT - // - if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) = { - Fadt1Table =3D (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *) - (UINTN)CurrentTablePointer; - Facs1Table =3D (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) - (UINTN)Fadt1Table->FirmwareCtrl; - DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->= Dsdt; - } - } - } - - // - // Install the FACS table. - // - if (Fadt2Table) { - // - // FACS 2.0 - // - Status =3D AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - Facs2Table, - Facs2Table->Length, - &TableHandle - ); - if (EFI_ERROR (Status)) { - return Status; - } - } else if (Fadt1Table) { - // - // FACS 1.0 - // - Status =3D AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - Facs1Table, - Facs1Table->Length, - &TableHandle - ); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // Install DSDT table. If we reached this point without finding the DS= DT, - // then we're out of sync with the hypervisor, and cannot continue. - // - if (DsdtTable =3D=3D NULL) { - DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__)); - ASSERT (FALSE); - CpuDeadLoop (); - } - - Status =3D AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - DsdtTable, - DsdtTable->Length, - &TableHandle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} --=20 2.40.1