From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com []) by mx.groups.io with SMTP id smtpd.web11.6831.1623748371467770763 for ; Tue, 15 Jun 2021 02:12:53 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=fail (domain: intel.com, ip: , mailfrom: zhiguang.liu@intel.com) IronPort-SDR: 8792uOYISETiDkZlBG069XFQoLg5N/tWNNaSKk4nKSrKnWQ3gYrAAeLdSE5pJsDAvEzL35rhUH FOvnsvDbbocA== X-IronPort-AV: E=McAfee;i="6200,9189,10015"; a="185647649" X-IronPort-AV: E=Sophos;i="5.83,275,1616482800"; d="scan'208";a="185647649" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2021 02:12:35 -0700 IronPort-SDR: /C+5FA7eF7xVLVNRgxtoUiqq+2DWyn/V+XCAo5GPmWLBBf7A6J697R6BCqW8v/JQ5la7FF5hqr AqgLmIFzLEew== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,275,1616482800"; d="scan'208";a="487713226" Received: from fieedk002.ccr.corp.intel.com ([10.239.158.144]) by fmsmga002.fm.intel.com with ESMTP; 15 Jun 2021 02:12:33 -0700 From: "Zhiguang Liu" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Dandan Bi , Liming Gao , Ray Ni Subject: [Patch V5 8/9] MdeModulePkg/ACPI: Install ACPI table from HOB. Date: Tue, 15 Jun 2021 17:12:10 +0800 Message-Id: <20210615091211.801-9-zhiguang.liu@intel.com> X-Mailer: git-send-email 2.30.0.windows.2 In-Reply-To: <20210615091211.801-1-zhiguang.liu@intel.com> References: <20210615091211.801-1-zhiguang.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable If HOB contains APCI table information, entry point of AcpiTableDxe.inf should parse the APCI table from HOB, and install these tables. We assume the whole ACPI table (starting with EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER) is contained by a single gEfiAcpiTableGuid HOB. If error happens when installing ACPI table, stop installing and removing all the tables that are already added. Cc: Jian J Wang Cc: Hao A Wu Cc: Dandan Bi Cc: Liming Gao Cc: Ray Ni Reviewed-by: Hao A Wu Signed-off-by: Zhiguang Liu --- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c | 92 +++++++= ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------= ---------- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h | 38 +++++++= ++++++++++++++++++++++++++++++- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 8 +++++--- MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 171 +++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++------- 4 files changed, 271 insertions(+), 38 deletions(-) diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c b/MdeModule= Pkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c index 14ced68e64..d98573d613 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c @@ -1,7 +1,7 @@ /** @file=0D ACPI Sdt Protocol Driver=0D =0D - Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.
= =0D + Copyright (c) 2010 - 2021, Intel Corporation. All rights reserved.
= =0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D **/=0D @@ -191,8 +191,7 @@ SdtNotifyAcpiList ( /**=0D Returns a requested ACPI table.=0D =0D - The GetAcpiTable() function returns a pointer to a buffer containing the= ACPI table associated=0D - with the Index that was input. The following structures are not consider= ed elements in the list of=0D + The following structures are not considered elements in the list of=0D ACPI tables:=0D - Root System Description Pointer (RSD_PTR)=0D - Root System Description Table (RSDT)=0D @@ -201,42 +200,32 @@ SdtNotifyAcpiList ( member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi= Table() interface,=0D the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D =0D - @param[in] Index The zero-based index of the table to retrieve.= =0D - @param[out] Table Pointer for returning the table buffer.=0D - @param[out] Version On return, updated with the ACPI versions to w= hich this table belongs. Type=0D - EFI_ACPI_TABLE_VERSION is defined in "Related = Definitions" in the=0D - EFI_ACPI_SDT_PROTOCOL.=0D - @param[out] TableKey On return, points to the table key for the spe= cified ACPI system definition table.=0D - This is identical to the table key used in the= EFI_ACPI_TABLE_PROTOCOL.=0D - The TableKey can be passed to EFI_ACPI_TABLE_P= ROTOCOL.UninstallAcpiTable()=0D - to uninstall the table.=0D - @retval EFI_SUCCESS The function completed successfully.=0D - @retval EFI_NOT_FOUND The requested index is too large and a table w= as not found.=0D + @param[in] AcpiTableInstance ACPI table Instance.=0D + @param[in] Index The zero-based index of the table to re= trieve.=0D + @param[out] Table Pointer for returning the table buffer.= =0D + @param[out] Version On return, updated with the ACPI versio= ns to which this table belongs. Type=0D + EFI_ACPI_TABLE_VERSION is defined in "R= elated Definitions" in the=0D + EFI_ACPI_SDT_PROTOCOL.=0D + @param[out] TableKey On return, points to the table key for = the specified ACPI system definition table.=0D + This is identical to the table key used= in the EFI_ACPI_TABLE_PROTOCOL.=0D + The TableKey can be passed to EFI_ACPI_= TABLE_PROTOCOL.UninstallAcpiTable()=0D + to uninstall the table.=0D + @retval EFI_SUCCESS The function completed successfully.=0D + @retval EFI_NOT_FOUND The requested index is too large and a = table was not found.=0D **/=0D EFI_STATUS=0D -EFIAPI=0D -GetAcpiTable2 (=0D +SdtGetAcpiTable (=0D + IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance,=0D IN UINTN Index,=0D OUT EFI_ACPI_SDT_HEADER **Table,=0D OUT EFI_ACPI_TABLE_VERSION *Version,=0D OUT UINTN *TableKey=0D )=0D {=0D - EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance;=0D UINTN TableIndex;=0D LIST_ENTRY *CurrentLink;=0D LIST_ENTRY *StartLink;=0D EFI_ACPI_TABLE_LIST *CurrentTable;=0D -=0D - ASSERT (Table !=3D NULL);=0D - ASSERT (Version !=3D NULL);=0D - ASSERT (TableKey !=3D NULL);=0D -=0D - //=0D - // Get the instance of the ACPI Table=0D - //=0D - AcpiTableInstance =3D SdtGetAcpiTableInstance ();=0D -=0D //=0D // Find the table=0D //=0D @@ -270,6 +259,55 @@ GetAcpiTable2 ( return EFI_SUCCESS;=0D }=0D =0D +/**=0D + Returns a requested ACPI table.=0D +=0D + The GetAcpiTable() function returns a pointer to a buffer containing the= ACPI table associated=0D + with the Index that was input. The following structures are not consider= ed elements in the list of=0D + ACPI tables:=0D + - Root System Description Pointer (RSD_PTR)=0D + - Root System Description Table (RSDT)=0D + - Extended System Description Table (XSDT)=0D + Version is updated with a bit map containing all the versions of ACPI of= which the table is a=0D + member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi= Table() interface,=0D + the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D +=0D + @param[in] Index The zero-based index of the table to retrieve.= =0D + @param[out] Table Pointer for returning the table buffer.=0D + @param[out] Version On return, updated with the ACPI versions to w= hich this table belongs. Type=0D + EFI_ACPI_TABLE_VERSION is defined in "Related = Definitions" in the=0D + EFI_ACPI_SDT_PROTOCOL.=0D + @param[out] TableKey On return, points to the table key for the spe= cified ACPI system definition table.=0D + This is identical to the table key used in the= EFI_ACPI_TABLE_PROTOCOL.=0D + The TableKey can be passed to EFI_ACPI_TABLE_P= ROTOCOL.UninstallAcpiTable()=0D + to uninstall the table.=0D + @retval EFI_SUCCESS The function completed successfully.=0D + @retval EFI_NOT_FOUND The requested index is too large and a table w= as not found.=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +GetAcpiTable2 (=0D + IN UINTN Index,=0D + OUT EFI_ACPI_SDT_HEADER **Table,=0D + OUT EFI_ACPI_TABLE_VERSION *Version,=0D + OUT UINTN *TableKey=0D + )=0D +{=0D + EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance;=0D +=0D + ASSERT (Table !=3D NULL);=0D + ASSERT (Version !=3D NULL);=0D + ASSERT (TableKey !=3D NULL);=0D +=0D + //=0D + // Get the instance of the ACPI Table=0D + //=0D + AcpiTableInstance =3D SdtGetAcpiTableInstance ();=0D +=0D + return SdtGetAcpiTable (AcpiTableInstance, Index, Table, Version, TableK= ey);=0D +}=0D +=0D +=0D /**=0D Register a callback when an ACPI table is installed.=0D =0D diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h b/MdeModu= lePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h index 9d7cf7ccfc..0af2d11a1a 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTable.h @@ -1,7 +1,7 @@ /** @file=0D ACPI Table Protocol Driver=0D =0D - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
=0D + Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D **/=0D @@ -24,6 +24,8 @@ #include =0D #include =0D #include =0D +#include =0D +#include =0D =0D //=0D // Statements that include other files=0D @@ -228,6 +230,40 @@ SdtAcpiTableAcpiSdtConstructor ( IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance=0D );=0D =0D +/**=0D + Returns a requested ACPI table.=0D +=0D + The following structures are not considered elements in the list of=0D + ACPI tables:=0D + - Root System Description Pointer (RSD_PTR)=0D + - Root System Description Table (RSDT)=0D + - Extended System Description Table (XSDT)=0D + Version is updated with a bit map containing all the versions of ACPI of= which the table is a=0D + member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpi= Table() interface,=0D + the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.=0D +=0D + @param[in] AcpiTableInstance ACPI table Instance.=0D + @param[in] Index The zero-based index of the table to re= trieve.=0D + @param[out] Table Pointer for returning the table buffer.= =0D + @param[out] Version On return, updated with the ACPI versio= ns to which this table belongs. Type=0D + EFI_ACPI_TABLE_VERSION is defined in "R= elated Definitions" in the=0D + EFI_ACPI_SDT_PROTOCOL.=0D + @param[out] TableKey On return, points to the table key for = the specified ACPI system definition table.=0D + This is identical to the table key used= in the EFI_ACPI_TABLE_PROTOCOL.=0D + The TableKey can be passed to EFI_ACPI_= TABLE_PROTOCOL.UninstallAcpiTable()=0D + to uninstall the table.=0D + @retval EFI_SUCCESS The function completed successfully.=0D + @retval EFI_NOT_FOUND The requested index is too large and a = table was not found.=0D +**/=0D +EFI_STATUS=0D +SdtGetAcpiTable (=0D + IN EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance,=0D + IN UINTN Index,=0D + OUT EFI_ACPI_SDT_HEADER **Table,=0D + OUT EFI_ACPI_TABLE_VERSION *Version,=0D + OUT UINTN *TableKey=0D + );=0D +=0D //=0D // export PrivateData symbol, because we need that in AcpiSdtProtol implem= entation=0D //=0D diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf b/Md= eModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf index d341df439e..86dea43e27 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf @@ -4,7 +4,7 @@ # This driver initializes ACPI tables (Rsdp, Rsdt and Xsdt) and produces = UEFI/PI=0D # services to install/uninstall/manage ACPI tables.=0D #=0D -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
= =0D +# Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
= =0D # Copyright (c) 2016, Linaro Ltd. All rights reserved.
=0D # SPDX-License-Identifier: BSD-2-Clause-Patent=0D #=0D @@ -51,10 +51,12 @@ DebugLib=0D BaseLib=0D PcdLib=0D + HobLib=0D =0D [Guids]=0D - gEfiAcpi10TableGuid ## PRODUCES ## SystemTable= =0D - gEfiAcpiTableGuid ## PRODUCES ## SystemTable= =0D + gEfiAcpi10TableGuid ## PRODUCES ## S= ystemTable=0D + gEfiAcpiTableGuid ## PRODUCES ## S= ystemTable=0D + gUniversalPayloadAcpiTableGuid ## SOMETIMES_CONSUMES ## H= OB=0D =0D [FeaturePcd]=0D gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol ## CONSUMES=0D diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b= /MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index 5a2afdff27..34d4a1cec0 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -1,7 +1,7 @@ /** @file=0D ACPI Table Protocol Implementation=0D =0D - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
=0D + Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.
=0D Copyright (c) 2016, Linaro Ltd. All rights reserved.
=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D @@ -30,6 +30,7 @@ STATIC EFI_ALLOCATE_TYPE mAcpiTableAllocType; @param Table Table to add.=0D @param Checksum Does the table require checksumming.=0D @param Version The version of the list to add the tab= le to.=0D + @param IsFromHob True, if add Apci Table from Hob List.= =0D @param Handle Pointer for returning the handle.=0D =0D @return EFI_SUCCESS The function completed successfully.=0D @@ -44,6 +45,7 @@ AddTableToList ( IN VOID *Table,=0D IN BOOLEAN Checksum,=0D IN EFI_ACPI_TABLE_VERSION Version,=0D + IN BOOLEAN IsFromHob,=0D OUT UINTN *Handle=0D );=0D =0D @@ -238,6 +240,7 @@ InstallAcpiTable ( AcpiTableBufferConst,=0D TRUE,=0D Version,=0D + FALSE,=0D TableKey=0D );=0D if (!EFI_ERROR (Status)) {=0D @@ -472,6 +475,7 @@ FreeTableMemory ( @param Table Table to add.=0D @param Checksum Does the table require checksumming.=0D @param Version The version of the list to add the tab= le to.=0D + @param IsFromHob True, if add Apci Table from Hob List.= =0D @param Handle Pointer for returning the handle.=0D =0D @return EFI_SUCCESS The function completed successfully.=0D @@ -487,6 +491,7 @@ AddTableToList ( IN VOID *Table,=0D IN BOOLEAN Checksum,=0D IN EFI_ACPI_TABLE_VERSION Version,=0D + IN BOOLEAN IsFromHob,=0D OUT UINTN *Handle=0D )=0D {=0D @@ -553,12 +558,17 @@ AddTableToList ( // SMM communication ACPI table.=0D //=0D ASSERT ((EFI_PAGE_SIZE % 64) =3D=3D 0);=0D - Status =3D gBS->AllocatePages (=0D - AllocateMaxAddress,=0D - EfiACPIMemoryNVS,=0D - EFI_SIZE_TO_PAGES (CurrentTableList->TableSize),=0D - &AllocPhysAddress=0D - );=0D + if (IsFromHob){=0D + AllocPhysAddress =3D (UINTN)Table;=0D + Status =3D EFI_SUCCESS;=0D + } else {=0D + Status =3D gBS->AllocatePages (=0D + AllocateMaxAddress,=0D + EfiACPIMemoryNVS,=0D + EFI_SIZE_TO_PAGES (CurrentTableList->TableSize),=0D + &AllocPhysAddress=0D + );=0D + }=0D } else if (mAcpiTableAllocType =3D=3D AllocateAnyPages) {=0D //=0D // If there is no allocation limit, there is also no need to use page= =0D @@ -1689,6 +1699,151 @@ ChecksumCommonTables ( return EFI_SUCCESS;=0D }=0D =0D +/**=0D + This function will find gUniversalPayloadAcpiTableGuid Guid Hob, and ins= tall Acpi table from it.=0D +=0D + @param AcpiTableInstance Protocol instance private data.=0D +=0D + @return EFI_SUCCESS The function completed successfully.=0D + @return EFI_NOT_FOUND The function doesn't find the gEfiAcpiTableGu= id Guid Hob.=0D + @return EFI_ABORTED The function could not complete successfully.= =0D +=0D +**/=0D +EFI_STATUS=0D +InstallAcpiTableFromHob (=0D + EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance=0D + )=0D +{=0D + EFI_HOB_GUID_TYPE *GuidHob;=0D + EFI_ACPI_TABLE_VERSION Version;=0D + EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;=0D + EFI_ACPI_DESCRIPTION_HEADER *Rsdt;=0D + EFI_ACPI_DESCRIPTION_HEADER *ChildTable;=0D + UINT64 ChildTableAddress;=0D + UINTN Count;=0D + UINTN Index;=0D + UINTN TableKey;=0D + EFI_STATUS Status;=0D + UINTN EntrySize;=0D + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableAdress;=0D + VOID *TableToInstall;=0D + EFI_ACPI_SDT_HEADER *Table;=0D + UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;=0D +=0D + TableKey =3D 0;=0D + Version =3D PcdGet32 (PcdAcpiExposedTableVersions);=0D + Status =3D EFI_SUCCESS;=0D + //=0D + // HOB only contains the ACPI table in 2.0+ format.=0D + //=0D + GuidHob =3D GetFirstGuidHob (&gUniversalPayloadAcpiTableGuid);=0D + if (GuidHob =3D=3D NULL) {=0D + return EFI_NOT_FOUND;=0D + }=0D +=0D + GenericHeader =3D (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) GET_GUID_HOB_DATA= (GuidHob);=0D + if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) > GET_GUID_HOB_DATA_SIZE = (GuidHob)) || (GenericHeader->Length > GET_GUID_HOB_DATA_SIZE (GuidHob))) {= =0D + return EFI_NOT_FOUND;=0D + }=0D + if (GenericHeader->Revision =3D=3D UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION= ) {=0D + //=0D + // UNIVERSAL_PAYLOAD_ACPI_TABLE structure is used when Revision equals= to UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION=0D + //=0D + AcpiTableAdress =3D (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA= (GuidHob);=0D + if (AcpiTableAdress->Header.Length < UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_= FIELD (UNIVERSAL_PAYLOAD_ACPI_TABLE, Rsdp)) {=0D + //=0D + // Retrun if can't find the ACPI Info Hob with enough length=0D + //=0D + return EFI_NOT_FOUND;=0D + }=0D + Rsdp =3D (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) (UINTN) (Acp= iTableAdress->Rsdp);=0D +=0D + //=0D + // An ACPI-compatible OS must use the XSDT if present.=0D + // It shouldn't happen that XsdtAddress points beyond 4G range in 32-b= it environment.=0D + //=0D + ASSERT ((UINTN) Rsdp->XsdtAddress =3D=3D Rsdp->XsdtAddress);=0D +=0D + EntrySize =3D sizeof (UINT64);=0D + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;=0D + if (Rsdt =3D=3D NULL) {=0D + //=0D + // XsdtAddress is zero, then we use Rsdt which has 32 bit entry=0D + //=0D + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;= =0D + EntrySize =3D sizeof (UINT32);=0D + }=0D +=0D + if (Rsdt->Length <=3D sizeof (EFI_ACPI_DESCRIPTION_HEADER)) {=0D + return EFI_ABORTED;=0D + }=0D +=0D + Count =3D (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / Entr= ySize;=0D +=0D + for (Index =3D 0; Index < Count; Index++){=0D + ChildTableAddress =3D 0;=0D + CopyMem (&ChildTableAddress, (UINT8 *) (Rsdt + 1) + EntrySize * Inde= x, EntrySize);=0D + //=0D + // If the address is of UINT64 while this module runs at 32 bits,=0D + // make sure the upper bits are all-zeros.=0D + //=0D + ASSERT (ChildTableAddress =3D=3D (UINTN) ChildTableAddress);=0D + if (ChildTableAddress !=3D (UINTN) ChildTableAddress) {=0D + Status =3D EFI_ABORTED;=0D + break;=0D + }=0D +=0D + ChildTable =3D (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) ChildTableAdd= ress;=0D + Status =3D AddTableToList (AcpiTableInstance, ChildTable, TRUE, Vers= ion, TRUE, &TableKey);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACPI ta= ble at 0x%p\n", ChildTable));=0D + ASSERT_EFI_ERROR (Status);=0D + break;=0D + }=0D + if (ChildTable->Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION= _TABLE_SIGNATURE){=0D + //=0D + // Add the FACS and DSDT tables if it is not NULL.=0D + //=0D + if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) ChildTable)->Fi= rmwareCtrl !=3D 0) {=0D + TableToInstall =3D (VOID *) (UINTN) ((EFI_ACPI_3_0_FIXED_ACPI_DE= SCRIPTION_TABLE *) ChildTable)->FirmwareCtrl;=0D + Status =3D AddTableToList (AcpiTableInstance, TableToInstall, TR= UE, Version, TRUE, &TableKey);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACP= I table FACS\n"));=0D + ASSERT_EFI_ERROR (Status);=0D + break;=0D + }=0D + }=0D +=0D + if (((EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *) ChildTable)->Ds= dt !=3D 0) {=0D + TableToInstall =3D (VOID *) (UINTN) ((EFI_ACPI_3_0_FIXED_ACPI_DE= SCRIPTION_TABLE *) ChildTable)->Dsdt;=0D + Status =3D AddTableToList (AcpiTableInstance, TableToInstall, TR= UE, Version, TRUE, &TableKey);=0D + if (EFI_ERROR (Status)) {=0D + DEBUG ((DEBUG_ERROR, "InstallAcpiTableFromHob: Fail to add ACP= I table DSDT\n"));=0D + ASSERT_EFI_ERROR (Status);=0D + break;=0D + }=0D + }=0D + }=0D + }=0D + } else {=0D + return EFI_NOT_FOUND;=0D + }=0D +=0D + if (EFI_ERROR (Status)) {=0D + //=0D + // Error happens when trying to add ACPI table to the list.=0D + // Remove all of them from list because at this time, no other tables = except from HOB are in the list=0D + //=0D + while (SdtGetAcpiTable (AcpiTableInstance, 0, &Table, &Version, &Table= Key) =3D=3D EFI_SUCCESS) {=0D + RemoveTableFromList (AcpiTableInstance, Version, TableKey);=0D + }=0D + } else {=0D + Status =3D PublishTables (AcpiTableInstance, Version);=0D + }=0D +=0D + ASSERT_EFI_ERROR (Status);=0D + return Status;=0D +}=0D =0D /**=0D Constructor for the ACPI table protocol. Initializes instance=0D @@ -1918,6 +2073,8 @@ AcpiTableAcpiTableConstructor ( =0D ChecksumCommonTables (AcpiTableInstance);=0D =0D + InstallAcpiTableFromHob (AcpiTableInstance);=0D +=0D //=0D // Completed successfully=0D //=0D --=20 2.30.0.windows.2