From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by mx.groups.io with SMTP id smtpd.web12.4833.1586907804075847681 for ; Tue, 14 Apr 2020 16:43:24 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: ray.ni@intel.com) IronPort-SDR: xUGRZNJXerEG2rqn+LjsvzhLGxlJUr4irq/KLsHubXhSdFwkdN8sfOyY1bYbpbWAlRpbbhVmlf 9ZIpTLx+lZyQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2020 16:43:23 -0700 IronPort-SDR: S1H2Y52NtQ58nfntLWiRSuVWDVBqHDTI8X6wwGjsIjLP5g6EdfIyZSXT1BdayMw/xW98me8Ngm IZSComks+pfg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,384,1580803200"; d="scan'208";a="298843377" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by FMSMGA003.fm.intel.com with ESMTP; 14 Apr 2020 16:43:22 -0700 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 14 Apr 2020 16:43:22 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx158.amr.corp.intel.com (10.18.116.75) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 14 Apr 2020 16:43:22 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.225]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.146]) with mapi id 14.03.0439.000; Wed, 15 Apr 2020 07:43:15 +0800 From: "Ni, Ray" To: "Shindo, Miki" , "devel@edk2.groups.io" CC: "Chaganty, Rangasai V" , "Chiu, Chasel" , "Desimone, Nathaniel L" , "Agyeman, Prince" Subject: Re: [edk2-platforms:PATCH v3] IntelSiliconPkg/DxeAslUpdateLib: Add DxeAslUpdateLib support Thread-Topic: [edk2-platforms:PATCH v3] IntelSiliconPkg/DxeAslUpdateLib: Add DxeAslUpdateLib support Thread-Index: AQHWC+UYwnYwPOB+vkKq0EFYxiFBfKh5VLzw Date: Tue, 14 Apr 2020 23:43:13 +0000 Deferred-Delivery: Tue, 14 Apr 2020 23:42:00 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C4FDF5E@SHSMSX104.ccr.corp.intel.com> References: <20200406072910.24136-1-miki.shindo@intel.com> In-Reply-To: <20200406072910.24136-1-miki.shindo@intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ray Ni > -----Original Message----- > From: Shindo, Miki > Sent: Monday, April 6, 2020 3:29 PM > To: devel@edk2.groups.io > Cc: Chaganty, Rangasai V ; Chiu, Chasel > ; Desimone, Nathaniel L > ; Agyeman, Prince > ; Ni, Ray > Subject: [edk2-platforms:PATCH v3] IntelSiliconPkg/DxeAslUpdateLib: Add > DxeAslUpdateLib support >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2536 >=20 > This commit adds DxeAslUpdateLib library support in IntelSiliconPkg, > which allows AML to be updated in DXE. >=20 > Signed-off-by: Miki Shindo > Cc: Sai Chaganty > Cc: Chasel Chiu > Cc: Nate DeSimone > Cc: Prince Agyeman > Cc: Ray Ni > Acked-by: Chasel Chiu > Acked-by: Nate DeSimone > Reviewed-by: Ray Ni > --- > Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.c = | > 512 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h = | 106 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++ > Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec = | 4 ++++ > Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.in= f | > 42 ++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 664 insertions(+) >=20 > diff --git > a/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.c > b/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.c > new file mode 100644 > index 0000000000..4e031b0edd > --- /dev/null > +++ b/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateL= ib.c > @@ -0,0 +1,512 @@ > +/** @file > + Boot service DXE ASL update library implementation. > + Note that the current version of the library updates AML. > + > + These functions in this file can be called during DXE and cannot be ca= lled > during runtime > + or in SMM which should use a RT or SMM library. > + > + This library uses the ACPI Support protocol. > + > + Copyright (c) 2020, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +// > +// Function implemenations > +// > +static EFI_ACPI_SDT_PROTOCOL *mAcpiSdt =3D NULL; > +static EFI_ACPI_TABLE_PROTOCOL *mAcpiTable =3D NULL; > + > +/** > + Initialize the ASL update library state. > + This must be called prior to invoking other library functions. > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +InitializeAslUpdateLib ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + > + /// > + /// Locate ACPI tables > + /// > + Status =3D gBS->LocateProtocol (&gEfiAcpiSdtProtocolGuid, NULL, (VOID = **) > &mAcpiSdt); > + ASSERT_EFI_ERROR (Status); > + Status =3D gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOI= D **) > &mAcpiTable); > + ASSERT_EFI_ERROR (Status); > + return Status; > +} > + > +/** > + This function calculates and updates an UINT8 checksum. > + > + @param Buffer Pointer to buffer to checksum > + @param Size Number of bytes to checksum > + @param ChecksumOffset Offset to place the checksum result in > + > + @return EFI_SUCCESS The function completed successfully. > + > +**/ > +EFI_STATUS > +AcpiPlatformChecksum ( > + IN VOID *Buffer, > + IN UINTN Size, > + IN UINTN ChecksumOffset > + ) > +{ > + UINT8 Sum; > + UINT8 *Ptr; > + > + Sum =3D 0; > + // > + // Initialize pointer > + // > + Ptr =3D Buffer; > + > + // > + // set checksum to 0 first > + // > + Ptr[ChecksumOffset] =3D 0; > + > + // > + // add all content of buffer > + // > + while ((Size--) !=3D 0) { > + Sum =3D (UINT8) (Sum + (*Ptr++)); > + } > + // > + // set checksum > + // > + Ptr =3D Buffer; > + Ptr[ChecksumOffset] =3D (UINT8) (0xff - Sum + 1); > + > + return EFI_SUCCESS; > +} > + > +/** > + This procedure will update immediate value assigned to a Name > + > + @param[in] AslSignature - The signature of Operation Region that = we > want to update. > + @param[in] Buffer - source of data to be written over origi= nal aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateNameAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DESCRIPTION_HEADER *Table; > + UINT8 *CurrPtr; > + UINT8 *EndPtr; > + UINT32 *Signature; > + UINT8 *DsdtPointer; > + UINTN Handle; > + UINT8 DataSize; > + > + if (mAcpiTable =3D=3D NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiTable =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Handle =3D 0; > + Status =3D LocateAcpiTableBySignature ( > + > EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + (EFI_ACPI_DESCRIPTION_HEADER **) &Table, > + &Handle > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /// > + /// Point to the beginning of the DSDT table > + /// > + CurrPtr =3D (UINT8 *) Table; > + if (CurrPtr =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + // > + // EndPtr =3D beginning of table + length of table > + // > + EndPtr =3D CurrPtr + ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length; > + > + /// > + /// Loop through the ASL looking for values that we must fix up. > + /// > + for (DsdtPointer =3D CurrPtr; DsdtPointer < EndPtr; DsdtPointer++) { > + /// > + /// Get a pointer to compare for signature > + /// > + Signature =3D (UINT32 *) DsdtPointer; > + /// > + /// Check if this is the Device Object signature we are looking for > + /// > + if ((*Signature) =3D=3D AslSignature) { > + /// > + /// Look for Name Encoding > + /// > + if (*(DsdtPointer-1) =3D=3D AML_NAME_OP) { > + /// > + /// Check if size of new and old data is the same > + /// > + DataSize =3D *(DsdtPointer+4); > + if ((Length =3D=3D 1 && DataSize =3D=3D 0xA) || > + (Length =3D=3D 2 && DataSize =3D=3D 0xB) || > + (Length =3D=3D 4 && DataSize =3D=3D 0xC)) { > + CopyMem (DsdtPointer+5, Buffer, Length); > + } else if (Length =3D=3D 1 && ((*(UINT8*) Buffer) =3D=3D 0 || (*= (UINT8*) Buffer) > =3D=3D 1) && (DataSize =3D=3D 0 || DataSize =3D=3D 1)) { > + CopyMem (DsdtPointer+4, Buffer, Length); > + } else { > + FreePool (Table); > + return EFI_BAD_BUFFER_SIZE; > + } > + Status =3D mAcpiTable->UninstallAcpiTable ( > + mAcpiTable, > + Handle > + ); > + Handle =3D 0; > + Status =3D mAcpiTable->InstallAcpiTable ( > + mAcpiTable, > + Table, > + Table->Length, > + &Handle > + ); > + FreePool (Table); > + return Status; > + } > + } > + } > + return EFI_NOT_FOUND; > +} > + > +/** > + This procedure will update immediate value assigned to a Name in SSDT > table > + > + @param[in] TableId - Pointer to an ASCII string containing t= he OEM > Table ID from the ACPI table header > + @param[in] TableIdSize - Length of the TableId to match. Table = ID are 8 > bytes long, this function > + @param[in] Buffer - source of data to be written over origi= nal aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateSsdtNameAslCode ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DESCRIPTION_HEADER *Table; > + UINT8 *CurrPtr; > + UINT32 *Signature; > + UINT8 *SsdtPointer; > + UINTN Handle; > + UINT8 DataSize; > + > + if (mAcpiTable =3D=3D NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiTable =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Handle =3D 0; > + Status =3D LocateAcpiTableByOemTableId ( > + TableId, > + TableIdSize, > + (EFI_ACPI_DESCRIPTION_HEADER **) &Table, > + &Handle > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /// > + /// Point to the beginning of the DSDT table > + /// > + CurrPtr =3D (UINT8 *) Table; > + if (CurrPtr =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + /// > + /// Loop through the ASL looking for values that we must fix up. > + /// > + for (SsdtPointer =3D CurrPtr; SsdtPointer <=3D (CurrPtr + > ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length); SsdtPointer++) { > + /// > + /// Get a pointer to compare for signature > + /// > + Signature =3D (UINT32 *) SsdtPointer; > + /// > + /// Check if this is the Device Object signature we are looking for > + /// > + if ((*Signature) =3D=3D AslSignature) { > + /// > + /// Look for Name Encoding > + /// > + if (*(SsdtPointer-1) =3D=3D AML_NAME_OP) { > + /// > + /// Check if size of new and old data is the same > + /// > + DataSize =3D *(SsdtPointer+4); > + if ((Length =3D=3D 1 && DataSize =3D=3D 0xA) || > + (Length =3D=3D 2 && DataSize =3D=3D 0xB) || > + (Length =3D=3D 4 && DataSize =3D=3D 0xC)) { > + CopyMem (SsdtPointer+5, Buffer, Length); > + } else if (Length =3D=3D 1 && ((*(UINT8*) Buffer) =3D=3D 0 || (*= (UINT8*) Buffer) > =3D=3D 1) && (DataSize =3D=3D 0 || DataSize =3D=3D 1)) { > + CopyMem (SsdtPointer+4, Buffer, Length); > + } else { > + return EFI_BAD_BUFFER_SIZE; > + } > + AcpiPlatformChecksum ( > + Table, > + Table->Length, > + OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, > + Checksum) > + ); > + return Status; > + } > + } > + } > + return EFI_NOT_FOUND; > +} > + > +/** > + This procedure will update the name of ASL Method > + > + @param[in] AslSignature - The signature of Operation Region that = we > want to update. > + @param[in] Buffer - source of data to be written over origi= nal aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateMethodAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DESCRIPTION_HEADER *Table; > + UINT8 *CurrPtr; > + UINT32 *Signature; > + UINT8 *DsdtPointer; > + UINTN Handle; > + > + if (mAcpiTable =3D=3D NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiTable =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Handle =3D 0; > + Status =3D LocateAcpiTableBySignature ( > + > EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + (EFI_ACPI_DESCRIPTION_HEADER **) &Table, > + &Handle > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /// > + /// Point to the beginning of the DSDT table > + /// > + CurrPtr =3D (UINT8 *) Table; > + if (CurrPtr =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + /// > + /// Loop through the ASL looking for values that we must fix up. > + /// > + for (DsdtPointer =3D CurrPtr; DsdtPointer <=3D (CurrPtr + > ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length); DsdtPointer++) { > + /// > + /// Get a pointer to compare for signature > + /// > + Signature =3D (UINT32 *) DsdtPointer; > + /// > + /// Check if this is the Device Object signature we are looking for > + /// > + if ((*Signature) =3D=3D AslSignature) { > + /// > + /// Look for Name Encoding > + /// > + if ((*(DsdtPointer-3) =3D=3D AML_METHOD_OP) > + || (*(DsdtPointer-2) =3D=3D AML_METHOD_OP) > + ) > + { > + CopyMem (DsdtPointer, Buffer, Length); > + Status =3D mAcpiTable->UninstallAcpiTable ( > + mAcpiTable, > + Handle > + ); > + Handle =3D 0; > + Status =3D mAcpiTable->InstallAcpiTable ( > + mAcpiTable, > + Table, > + Table->Length, > + &Handle > + ); > + FreePool (Table); > + return Status; > + } > + } > + } > + return EFI_NOT_FOUND; > +} > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI table. > + It is really only useful for finding tables that only have a single in= stance, > + e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc. > + > + @param[in] Signature - Pointer to an ASCII string containing= the OEM > Table ID from the ACPI table header > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for= the > table found > + @param[in, out] Version - The version of the table desired > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFIAPI > +EFI_STATUS > +LocateAcpiTableBySignature ( > + IN UINT32 Signature, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + EFI_STATUS Status; > + INTN Index; > + EFI_ACPI_TABLE_VERSION Version; > + EFI_ACPI_DESCRIPTION_HEADER *OrgTable; > + > + if (mAcpiSdt =3D=3D NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiSdt =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + } > + > + /// > + /// Locate table with matching ID > + /// > + Version =3D 0; > + Index =3D 0; > + do { > + Status =3D mAcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER > **)&OrgTable, &Version, Handle); > + if (Status =3D=3D EFI_NOT_FOUND) { > + break; > + } > + ASSERT_EFI_ERROR (Status); > + Index++; > + } while (OrgTable->Signature !=3D Signature); > + > + if (Status !=3D EFI_NOT_FOUND) { > + *Table =3D AllocateCopyPool (OrgTable->Length, OrgTable); > + ASSERT (*Table); > + } > + > + /// > + /// If we found the table, there will be no error. > + /// > + return Status; > +} > + > +/** > + This function uses the ACPI SDT protocol to locate an ACPI SSDT table. > + > + @param[in] TableId - Pointer to an ASCII string containing t= he OEM > Table ID from the ACPI table header > + @param[in] TableIdSize - Length of the TableId to match. Table = ID are 8 > bytes long, this function > + will consider it a match if the first T= ableIdSize bytes > match > + @param[in, out] Table - Updated with a pointer to the table > + @param[in, out] Handle - AcpiSupport protocol table handle for t= he table > found > + @param[in, out] Version - See AcpiSupport protocol, GetAcpiTable > function for use > + > + @retval EFI_SUCCESS - The function completed successfully. > +**/ > +EFI_STATUS > +LocateAcpiTableByOemTableId ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ) > +{ > + EFI_STATUS Status; > + INTN Index; > + EFI_ACPI_TABLE_VERSION Version; > + EFI_ACPI_DESCRIPTION_HEADER *OrgTable; > + > + if (mAcpiSdt =3D=3D NULL) { > + InitializeAslUpdateLib (); > + if (mAcpiSdt =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + } > + /// > + /// Locate table with matching ID > + /// > + Version =3D 0; > + Index =3D 0; > + do { > + Status =3D mAcpiSdt->GetAcpiTable (Index, (EFI_ACPI_SDT_HEADER > **)&OrgTable, &Version, Handle); > + if (Status =3D=3D EFI_NOT_FOUND) { > + break; > + } > + ASSERT_EFI_ERROR (Status); > + Index++; > + } while (CompareMem (&(OrgTable->OemTableId), TableId, TableIdSize)); > + > + if (Status !=3D EFI_NOT_FOUND) { > + *Table =3D OrgTable; > + ASSERT (*Table); > + } > + > + /// > + /// If we found the table, there will be no error. > + /// > + return Status; > +} > diff --git a/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > b/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > new file mode 100644 > index 0000000000..c9699e59b6 > --- /dev/null > +++ b/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > @@ -0,0 +1,106 @@ > +/** @file > + ASL dynamic update library definitions. > + > + This library provides dynamic update to various ASL structures. > + There may be different libraries for different environments (PEI, BS, = RT, > SMM). > + Make sure you meet the requirements for the library (protocol dependen= cies, > use > + restrictions, etc). > + > + Note that the current version of the library updates AML. > + > + Copyright (c) 2020 Intel Corporation. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > +#ifndef _ASL_UPDATE_LIB_H_ > +#define _ASL_UPDATE_LIB_H_ > + > +// > +// Include files > +// > +#include > +#include > +#include > +#include > + > + > +/** > + This procedure will update immediate value assigned to a Name > + > + @param[in] AslSignature The signature of Operation Regio= n that we > want to update. > + @param[in] Buffer source of data to be written ove= r original > aml > + @param[in] Length length of data to be overwritten > + > + @retval EFI_SUCCESS The function completed successfu= lly. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateNameAslCode( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ); > + > +/** > + This procedure will update the name of ASL Method > + > + @param[in] AslSignature - The signature of Operation Region that = we > want to update. > + @param[in] Buffer - source of data to be written over origi= nal aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateSsdtNameAslCode ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ); > + > +/** > + This procedure will update the name of ASL Method > + > + @param[in] AslSignature - The signature of Operation Region that = we > want to update. > + @param[in] Buffer - source of data to be written over origi= nal aml > + @param[in] Length - length of data to be overwritten > + > + @retval EFI_SUCCESS - The function completed successfully. > + @retval EFI_NOT_FOUND - Failed to locate AcpiTable. > +**/ > +EFIAPI > +EFI_STATUS > +UpdateMethodAslCode ( > + IN UINT32 AslSignature, > + IN VOID *Buffer, > + IN UINTN Length > + ); > + > +/** > + This function uses the ACPI support protocol to locate an ACPI table u= sing > the . > + It is really only useful for finding tables that only have a single in= stance, > + e.g. FADT, FACS, MADT, etc. It is not good for locating SSDT, etc. > + Matches are determined by finding the table with ACPI table that has > + a matching signature and version. > + > + @param[in] Signature Pointer to an ASCII string conta= ining the > Signature to match > + @param[in, out] Table Updated with a pointer to the ta= ble > + @param[in, out] Handle AcpiSupport protocol table handl= e for the > table found > + @param[in, out] Version On input, the version of the tab= le desired, > + on output, the versions the tabl= e belongs to > + @see AcpiSupport protocol for de= tails > + > + @retval EFI_SUCCESS The function completed successfu= lly. > +**/ > +EFIAPI > +EFI_STATUS > +LocateAcpiTableBySignature ( > + IN UINT32 Signature, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ); > + > +#endif > diff --git a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > index 3c49fb289c..d5debbf0da 100644 > --- a/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > +++ b/Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec > @@ -30,6 +30,10 @@ > # > PeiGetVtdPmrAlignmentLib|Include/Library/PeiGetVtdPmrAlignmentLib.h >=20 > + ## @libraryclass Provides services to update AML in DXE > + # > + AslUpdateLib|Include/Library/AslUpdateLib.h > + > [Guids] > ## GUID for Package token space > # {A9F8D54E-1107-4F0A-ADD0-4587E7A4A735} > diff --git > a/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.i= nf > b/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.i= nf > new file mode 100644 > index 0000000000..cefbe30628 > --- /dev/null > +++ > b/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.i= nf > @@ -0,0 +1,42 @@ > +## @file > +# Provides services to update ASL tables. > +# Note that the current version of the library updates AML. > +# > +# Copyright (c) 2020, Intel Corporation. All rights reserved.
> +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > + > + > +[Defines] > +INF_VERSION =3D 0x00010017 > +BASE_NAME =3D DxeAslUpdateLib > +FILE_GUID =3D 8621697D-4E3A-4bf2-ADB0-3E2FF06559CA > +VERSION_STRING =3D 1.0 > +MODULE_TYPE =3D DXE_DRIVER > +LIBRARY_CLASS =3D AslUpdateLib > + > + > +[LibraryClasses] > +BaseLib > +IoLib > +DebugLib > +PcdLib > +BaseMemoryLib > +UefiLib > +MemoryAllocationLib > + > + > +[Packages] > +MdePkg/MdePkg.dec > +IntelSiliconPkg/IntelSiliconPkg.dec > + > +[Sources] > +DxeAslUpdateLib.c > + > + > +[Protocols] > +gEfiAcpiTableProtocolGuid ## CONSUMES > +gEfiAcpiSdtProtocolGuid ## CONSUMES > -- > 2.16.2.windows.1