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.13331.1683099159371205828 for ; Wed, 03 May 2023 00:32:39 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@freebsd.org header.s=dkim header.b=CWItKS7I; spf=pass (domain: freebsd.org, ip: 96.47.72.81, mailfrom: corvink@freebsd.org) Received: from mx1.freebsd.org (mx1.freebsd.org [96.47.72.80]) (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 4QB7vV2DdQz464w; Wed, 3 May 2023 07:32:38 +0000 (UTC) (envelope-from corvink@FreeBSD.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (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 4QB7vV1lPLz4XQx; Wed, 3 May 2023 07:32:38 +0000 (UTC) (envelope-from corvink@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683099158; 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=XYTpj9csMrMOwiyKTF4gyCeteS9800O9Okk5nPL7Ix4=; b=CWItKS7Ijg/1Pcs6MRvIlVWhrxAlNpQkAWjGF7lT22lP7QzXx5XKcJmJyc29DCEtQT+2b8 +x0rYV+iFuTBrTanMLw4z64XCibthXKbIgRX/rg2Uh7lrQ3lPhkEHQJuId+xV7cdmxDSxm 2OOqSFs3Z/jDoo7WmVAPtAAfz8qB0y/dVCoeR7+LDK8di50OiUK7ReCwdkn/f7hf44BSyn hhaXd49G4bSpicwd41eTx6ZJaP4+/IMZ8QguCtfyECG/3NkOaFiRg4OKFw7rG3U/l6om8U h3CgoHv100f1QOd45D+3Wn3wvyV/QbfGRpEdXmbLK0Njht6Hvatpp7Ly8LZpTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683099158; 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=XYTpj9csMrMOwiyKTF4gyCeteS9800O9Okk5nPL7Ix4=; b=lFIip9i9LiO9uhOJ0UczamwFjX5O+MS2WzOo0uOpn+XI9L9+83xJclupjuJjIwhxQT9xTV BtpelafzLdbiD7SkjMWSTNHSg7IP+si0t0elLuCYwXlIDwRu2OWzS9DplZzI9zBJdo9YSG cLzaoFiqUtHSL+qO+smv1eqJAnl7qiK5QRpt+OPX9lIud6lluWRj0C7czpnjmE+LQZwjaY B4rIYE+dTe4l4dJgYpgorNxMBt9N7cAQL4eA2jHxnLZkcShgyTbmN0x93TDIrZVroH+duA NXPVeoBRuRowur16fJ0/6ip/B4UF97W09jW7MZYe/A9LaZUvsUHySeZ+pOqvEA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683099158; a=rsa-sha256; cv=none; b=wvRRN7T99AibkbSnfrQf3J08uJsWSDzJCzIDfArswnyembOdLSq6i7jI0PTEZnqNOszm3l h+0048dGqFKry1Xk1l+hxbK544uKdGAa1PZIDuGoq2d50DsMSAF+USBvcNYtOsHkcax7yV 8vg5CfeQ7Nu2OSx/enseni3E3fs0Ik7Lr1GXKFLe1SzPRst/aNWARyRh03VdCeQEjDV3im 0iH6jrRrbpqDq8+XmfxPPnnX9nR1cxMu3WUYgoCTALXni44bgbqN6LbGINuT996MydIBA/ +6MAcYYTsrcF97f5kvt5QtKBNkJiwNMSQWOb6QJlcM+FVVpwizmFjH0Dy4kOGg== Received: from corvink-nb.beckhoff.com (unknown [IPv6:2001:9e8:da7b:3000:a559:ee9a:32a4:e1d9]) (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 4QB7vS6N0kzYJW; Wed, 3 May 2023 07:32:36 +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?= , Ard Biesheuvel , Jiewen Yao , Jordan Justen , Gerd Hoffmann , Anthony Perard , Julien Grall , Leif Lindholm , Sami Mujawar Subject: [PATCH v3 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Date: Wed, 3 May 2023 09:32:04 +0200 Message-Id: <20230503073205.306090-2-corvink@FreeBSD.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230503073205.306090-1-corvink@FreeBSD.org> References: <20230503073205.306090-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 Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Jordan Justen Cc: Gerd Hoffmann Cc: Anthony Perard Cc: Julien Grall Cc: Leif Lindholm Cc: Sami Mujawar --- .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf | 1 - OvmfPkg/Include/Library/AcpiPlatformLib.h | 26 ++ .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.c | 2 + .../AcpiPlatformLib/DxeAcpiPlatformLib.c | 195 ++++++++++++++ OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c | 12 +- OvmfPkg/XenAcpiPlatformDxe/Xen.c | 237 ------------------ 6 files changed, 233 insertions(+), 240 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 431ab1c54f5b..6ae44e42bec3 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 @@ -23,3 +25,27 @@ 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 +InstallAcpiTablesFromMemory ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN UINT64 StartAddress, + IN UINT64 EndAddress + ); diff --git a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c b/ArmVirt= Pkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c index 32c8b1e94ed2..caa1a510321e 100644 --- a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c +++ b/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c @@ -17,6 +17,8 @@ =20 #include =20 +EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr =3D= NULL; + /** Get the address of Xen ACPI Root System Description Pointer (RSDP) structure. diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfP= kg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c index 80f9b5367b6d..48f2758231e7 100644 --- a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c @@ -88,3 +88,198 @@ GetAcpiRsdpFromMemory ( DEBUG ((DEBUG_WARN, "%a: RSDP not found\n", __func__)); return EFI_NOT_FOUND; } + +EFI_STATUS +EFIAPI +InstallAcpiTablesFromMemory ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN UINT64 StartAddress, + IN UINT64 EndAddress + ) +{ + EFI_STATUS Status; + UINTN TableHandle; + + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; + 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; + + // + // Try to find Xen ACPI tables + // + Status =3D GetAcpiRsdpFromMemory (StartAddress, EndAddress, &Rsdp); + 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 (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..604a66877ef4 100644 --- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c +++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c @@ -7,10 +7,14 @@ =20 **/ =20 -#include // XenDetected() +#include // InstallAcpiTablesFromMemory() +#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 @@ -31,7 +35,11 @@ InstallAcpiTables ( EFI_STATUS Status; =20 if (XenDetected ()) { - Status =3D InstallXenTables (AcpiTable); + Status =3D InstallAcpiTablesFromMemory ( + AcpiTable, + XEN_ACPI_PHYSICAL_ADDRESS, + XEN_BIOS_PHYSICAL_END + ); } else { Status =3D EFI_UNSUPPORTED; } diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDx= e/Xen.c deleted file mode 100644 index 28fa1d1e0e03..000000000000 --- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c +++ /dev/null @@ -1,237 +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; - - Fadt2Table =3D NULL; - Fadt1Table =3D NULL; - Facs2Table =3D NULL; - Facs1Table =3D NULL; - DsdtTable =3D NULL; - TableHandle =3D 0; - NumberOfTableEntries =3D 0; - - // - // Try to find Xen ACPI tables - // - 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