From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web12.2850.1583906278056224974 for ; Tue, 10 Mar 2020 22:57:58 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.43, mailfrom: ray.ni@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Mar 2020 22:57:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,539,1574150400"; d="scan'208";a="234618410" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga007.fm.intel.com with ESMTP; 10 Mar 2020 22:57:56 -0700 Received: from FMSMSX110.amr.corp.intel.com (10.18.116.10) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Mar 2020 22:57:56 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by fmsmsx110.amr.corp.intel.com (10.18.116.10) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 10 Mar 2020 22:57:56 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.206]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.43]) with mapi id 14.03.0439.000; Wed, 11 Mar 2020 13:57:52 +0800 From: "Ni, Ray" To: "Shindo, Miki" , "devel@edk2.groups.io" CC: "Chaganty, Rangasai V" , "Chiu, Chasel" , "Desimone, Nathaniel L" , "Agyeman, Prince" , "Zeng, Star" Subject: Re: [edk2-platform:PATCH v2] IntelSiliconPkg/DxeAslUpdateLib: Add DxeAslUpdateLib support Thread-Topic: [edk2-platform:PATCH v2] IntelSiliconPkg/DxeAslUpdateLib: Add DxeAslUpdateLib support Thread-Index: AQHV8zt3Puu4+RRouUGTjcjdc/YjsqhCtXfw Date: Wed, 11 Mar 2020 05:57:52 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C49129B@SHSMSX104.ccr.corp.intel.com> References: <20200305221423.24224-1-miki.shindo@intel.com> In-Reply-To: <20200305221423.24224-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 Several comments: 1. All the functions in AslUpdateLib.h don't have "EFIAPI" prefix. "EFIAPI"= is required for any public APIs according to EDKII coding standards specification: https://edk2-docs.gitbooks.io/= edk-ii-c-coding-standards-specification/content/5_source_files/56_declarati= ons_and_types.html#table-7-modifiers-for-common-efi-data-types-reference-th= e-uefi-specification-and-beyond-bios 2. LocateAcpiTableBySignature() It looks like a duplicated API as the existing one EfiLocateFirstAcpiT= able() defined in UefiLib.h though the implementations are different. I have high confidence that existing API could be used directly in all= existing usages that use LocateAcpiTableBySignature(). Can you please double confirm and remove this API if ok? 3. PSS_PACKAGE_LAYOUT, AML_RESRC_TEMP_END_TAG It seems this structure and the macro are not needed. Can you please r= emove them? 4. InitializeAslUpdateLib() This can be removed with two methods: a. Put the initialization in a library constructor. b. Downgrade it as a location function and call it on demand. I prefer to use option b. 5. LocateAcpiTableByOemTableId() The only consumer I can find is the library implementation itself. Can = you please remove this library API from the library header file? The function can be a local function without "EFIAPI" modifier. 6. AcpiChecksum() Can you please evaluate whether CalculateSum8 ()/CallculateCheckSum8() = can be used for ACPI table checksum? If yes I prefer we don't add this API = and use existing API. 7. AslUpdateLib.h should only include the necessary header files. I suggest AslUpdateLib.h only includes and should be included from DxeAslUpdateLib.c. =20 8. According to EDKII INF specification https://edk2-docs.gitbooks.io/edk-i= i-inf-specification/content/appendix_f_module_types.html, a "BASE" type module can be ported to any execution environment. Because the library implementation does reply on AcpiSdt protocol to en= umerate the table instances, it's not proper to use "BASE" type. You need to change to "DXE_DRIVER". Thanks, Ray > -----Original Message----- > From: Shindo, Miki > Sent: Friday, March 6, 2020 6:14 AM > To: devel@edk2.groups.io > Cc: Chaganty, Rangasai V ; Chiu, Chasel > ; Desimone, Nathaniel L > ; Agyeman, Prince > ; Ni, Ray > Subject: [edk2-platform:PATCH v2] 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 > Reviewed-by: Chasel Chiu > --- > Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.c = | > 553 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++ > Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h = | 178 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++ > Silicon/Intel/IntelSiliconPkg/IntelSiliconPkg.dec = | 4 ++++ > Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.in= f | > 42 ++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 777 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..1eae8bca62 > --- /dev/null > +++ > b/Silicon/Intel/IntelSiliconPkg/Library/DxeAslUpdateLib/DxeAslUpdateLib.c > @@ -0,0 +1,553 @@ > +/** @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. > +**/ > +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. > +**/ > +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. > +**/ > +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. > +**/ > +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; > +} > + > +/** > + This function calculates and updates an UINT8 checksum. > + > + @param[in] Buffer Pointer to buffer to checksum > + @param[in] Size Number of bytes to checksum > + @param[in] ChecksumOffset Offset to place the checksum result in > + > + @retval EFI_SUCCESS The function completed successfully. > +**/ > +EFI_STATUS > +AcpiChecksum ( > + 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--) { > + Sum =3D (UINT8) (Sum + (*Ptr++)); > + } > + /// > + /// set checksum > + /// > + Ptr =3D Buffer; > + Ptr[ChecksumOffset] =3D (UINT8) (0xff - Sum + 1); > + > + return EFI_SUCCESS; > +} > diff --git a/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > b/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > new file mode 100644 > index 0000000000..108bb52413 > --- /dev/null > +++ b/Silicon/Intel/IntelSiliconPkg/Include/Library/AslUpdateLib.h > @@ -0,0 +1,178 @@ > +/** @file > + ASL dynamic update library definitions. > + > + This library provides dymanic 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 > dependencies, 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 > + > +// > +// AML parsing definitions > +// > +#define AML_RESRC_TEMP_END_TAG 0x0079 > + > +// > +// ASL PSS package structure layout > +// > +#pragma pack (1) > +typedef struct { > + UINT8 NameOp; // 12h ;First opcode is a NameOp. > + UINT8 PackageLead; // 20h ;First opcode is a NameOp. > + UINT8 NumEntries; // 06h ;First opcode is a NameOp. > + UINT8 DwordPrefix1; // 0Ch > + UINT32 CoreFrequency; // 00h > + UINT8 DwordPrefix2; // 0Ch > + UINT32 Power; // 00h > + UINT8 DwordPrefix3; // 0Ch > + UINT32 TransLatency; // 00h > + UINT8 DwordPrefix4; // 0Ch > + UINT32 BmLatency; // 00h > + UINT8 DwordPrefix5; // 0Ch > + UINT32 Control; // 00h > + UINT8 DwordPrefix6; // 0Ch > + UINT32 Status; // 00h > +} PSS_PACKAGE_LAYOUT; > +#pragma pack() > + > +/** > + Initialize the ASL update library state. > + This must be called prior to invoking other library functions. > + > + > + @retval EFI_SUCCESS The function completed successfu= lly. > +**/ > +EFI_STATUS > +InitializeAslUpdateLib ( > + VOID > + ); > + > +/** > + 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. > +**/ > +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. > +**/ > +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. > +**/ > +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. > +**/ > +EFI_STATUS > +LocateAcpiTableBySignature ( > + IN UINT32 Signature, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ); > + > +/** > + This function uses the ACPI support protocol to locate an ACPI SSDT ta= ble. > + The table is located by searching for a matching OEM Table ID field. > + Partial match searches are supported via the TableIdSize parameter. > + > + @param[in] TableId Pointer to an ASCII string conta= ining the 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 TableIdSize bytes > 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 See AcpiSupport protocol, GetAcp= iTable > function for use > + > + @retval EFI_SUCCESS The function completed successfu= lly. > +**/ > +EFI_STATUS > +LocateAcpiTableByOemTableId ( > + IN UINT8 *TableId, > + IN UINT8 TableIdSize, > + IN OUT EFI_ACPI_DESCRIPTION_HEADER **Table, > + IN OUT UINTN *Handle > + ); > + > +/** > + This function calculates and updates an UINT8 checksum. > + > + @param[in] Buffer Pointer to buffer to checksum > + @param[in] Size Number of bytes to checksum > + @param[in] ChecksumOffset Offset to place the checksum res= ult in > + > + @retval EFI_SUCCESS The function completed successfu= lly. > +**/ > +EFI_STATUS > +AcpiChecksum ( > + IN VOID *Buffer, > + IN UINTN Size, > + IN UINTN ChecksumOffset > + ); > + > +#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..1183b320d5 > --- /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 BASE > +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