From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web11.10921.1682650627829945187 for ; Thu, 27 Apr 2023 19:57:07 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=j/dtCTUN; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: vincentx.ke@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1682650627; x=1714186627; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=uuhx/zCkD2CK0cJafZ1u1/XO1BAk4yru6+Dpe9O4k60=; b=j/dtCTUNzCXWRD8PhbCcpYUY/FQuoRUtXmI9SAXhF92Kj89eMqjHwM2y HqkiGCe0hOlL/j9pAeXrB6GQd5iZdjnX8yAts6fpj9eZJiArAp0Yueohr oDuUpl9yGl/DNN5f2SAkAiHFHBip/mSi3PAC47S+fW8rOn+MbNdp+8/9H MCiVNkps2GDr8PPkq0mNLYf/GZDOO6OlAOfyjf/2F5HLe33seBTSCJ95F FzNUkmVtZKzAz/D5r3OyJ3Y8zwUhOWKSDIo/S1uRaG3tkoftBlGjuTvI/ QSI+y3Zpt8EpNdXn3wrCQxpswIUpcb4RRWvvlTnHvYE9pBvw8Pyfag8r2 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10693"; a="375615231" X-IronPort-AV: E=Sophos;i="5.99,233,1677571200"; d="scan'208";a="375615231" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Apr 2023 19:57:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10693"; a="1024408822" X-IronPort-AV: E=Sophos;i="5.99,233,1677571200"; d="scan'208";a="1024408822" Received: from kxinfux-desk.gar.corp.intel.com ([10.227.107.32]) by fmsmga005.fm.intel.com with ESMTP; 27 Apr 2023 19:57:06 -0700 From: "VincentX Ke" To: devel@edk2.groups.io Cc: VincentX Ke , Chasel Chiu , Nate DeSimone , Isaac Oram , Liming Gao , Eric Dong Subject: [PATCH v3] MinPlatformPkg: Update HWSignature filed in FADT Date: Fri, 28 Apr 2023 10:56:59 +0800 Message-Id: <20230428025659.692-1-vincentx.ke@intel.com> X-Mailer: git-send-email 2.39.2.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: VincentX Ke REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4428 Calculating CRC based on checksum from all ACPI tables. Update HWSignature filed in FADT based on CRC while ACPI table changed. Signed-off-by: VincentX Ke Cc: Chasel Chiu Cc: Nate DeSimone Cc: Isaac Oram Cc: Liming Gao Cc: Eric Dong --- Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c | 110 +++++= ++++++++++++++- Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf | 1 + 2 files changed, 110 insertions(+), 1 deletion(-) diff --git a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c b= /Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c index e967031a3b..d84c1d4f6d 100644 --- a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c +++ b/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c @@ -1285,6 +1285,108 @@ IsHardwareChange ( FreePool (HWChange);=0D }=0D =0D +/**=0D + This function calculates RCR based on Checksum from all ACPI tables.=0D + It also calculates CRC and provides as HWSignature filed in FADT table.= =0D +**/=0D +VOID=0D +IsAcpiTableChange (=0D + VOID=0D + )=0D +{=0D + EFI_STATUS Status;=0D + UINTN Index;=0D + UINTN AcpiTableCount;=0D + UINT32 Table;=0D + UINT32 CRC;=0D + UINT32 *AcpiTable;=0D + EFI_ACPI_6_5_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;=0D + EFI_ACPI_DESCRIPTION_HEADER *Rsdt;=0D + EFI_ACPI_DESCRIPTION_HEADER *Xsdt;=0D + EFI_ACPI_6_5_FIRMWARE_ACPI_CONTROL_STRUCTURE *FacsPtr;=0D + EFI_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE *pFADT;=0D +=0D + AcpiTableCount =3D 0;=0D + AcpiTable =3D NULL;=0D + Rsdp =3D NULL;=0D + Rsdt =3D NULL;=0D + Xsdt =3D NULL;=0D + FacsPtr =3D NULL;=0D + pFADT =3D NULL;=0D +=0D + DEBUG ((DEBUG_INFO, "%a() - Start\n", __FUNCTION__));=0D +=0D + Status =3D EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)= &Rsdp);=0D + if (EFI_ERROR (Status) || (Rsdp =3D=3D NULL)) {=0D + return;=0D + }=0D +=0D + //=0D + // ACPI table count starts with 2 as RSDT and XSDT are already located.= =0D + // Then add ACPI tables found by XSDT and FADT.=0D + //=0D + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddre= ss;=0D + Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddre= ss;=0D + AcpiTableCount =3D AcpiTableCount + 2;=0D + AcpiTableCount =3D AcpiTableCount + (Xsdt->Length - sizeof (EFI_ACPI_DES= CRIPTION_HEADER))/sizeof (UINT64);=0D +=0D + for (Index =3D sizeof (EFI_ACPI_DESCRIPTION_HEADER); Index < (Xsdt->Leng= th); Index =3D Index + sizeof (UINT64)) {=0D + Table =3D *((UINT32 *)((UINT8 *)Xsdt + Index));=0D + if (((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Table)->Signature =3D=3D EF= I_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {=0D + pFADT =3D (EFI_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)Table;= =0D + if ((pFADT->XDsdt !=3D 0) || (pFADT->Dsdt !=3D 0)) {=0D + AcpiTableCount =3D AcpiTableCount + 1;=0D + }=0D + }=0D + }=0D +=0D + //=0D + // Allocate memory for founded ACPI tables.=0D + //=0D + AcpiTable =3D AllocateZeroPool (sizeof (UINT32) * AcpiTableCount);=0D + if (AcpiTable =3D=3D NULL) {=0D + return;=0D + }=0D +=0D + AcpiTableCount =3D 0;=0D + AcpiTable[AcpiTableCount++] =3D Rsdt->Checksum;=0D + AcpiTable[AcpiTableCount++] =3D Xsdt->Checksum;=0D +=0D + for (Index =3D sizeof (EFI_ACPI_DESCRIPTION_HEADER); Index < (Xsdt->Leng= th); Index =3D Index + sizeof (UINT64)) {=0D + Table =3D *((UINT32 *)((UINT8 *)Xsdt + Index));= =0D + AcpiTable[AcpiTableCount++] =3D ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN= )Table)->Checksum;=0D + if (((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Table)->Signature =3D=3D EF= I_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {=0D + pFADT =3D (EFI_ACPI_6_5_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)Table;= =0D + if (pFADT->XDsdt !=3D 0) {=0D + AcpiTable[AcpiTableCount++] =3D ((EFI_ACPI_DESCRIPTION_HEADER *)(U= INTN)pFADT->XDsdt)->Checksum;=0D + } else {=0D + AcpiTable[AcpiTableCount++] =3D ((EFI_ACPI_DESCRIPTION_HEADER *)(U= INTN)pFADT->Dsdt)->Checksum;=0D + }=0D + }=0D + }=0D +=0D + //=0D + // pFADT table not found.=0D + //=0D + if (pFADT =3D=3D NULL) {=0D + return;=0D + }=0D +=0D + //=0D + // Calculate CRC value.=0D + //=0D + Status =3D gBS->CalculateCrc32 (AcpiTable, AcpiTableCount, &CRC);=0D + DEBUG ((DEBUG_INFO, "CRC =3D %x and Status =3D %r\n", CRC, Status));=0D +=0D + //=0D + // Set HardwareSignature value based on CRC value.=0D + //=0D + FacsPtr =3D (EFI_ACPI_6_5_FIRMWARE_ACPI_CONTROL_STRUC= TURE *)(UINTN)pFADT->FirmwareCtrl;=0D + FacsPtr->HardwareSignature =3D CRC;=0D + FreePool (AcpiTable);=0D + DEBUG ((DEBUG_INFO, "%a() - End\n", __FUNCTION__));=0D +}=0D +=0D VOID=0D UpdateLocalTable (=0D VOID=0D @@ -1329,7 +1431,13 @@ AcpiEndOfDxeEvent ( //=0D // Calculate Hardware Signature value based on current platform configur= ations=0D //=0D - IsHardwareChange ();=0D + if ((PcdGet8 (PcdFadtMajorVersion) <=3D EFI_ACPI_6_3_FIXED_ACPI_DESCRIPT= ION_TABLE_REVISION) &&=0D + (PcdGet8 (PcdFadtMinorVersion) <=3D EFI_ACPI_6_3_FIXED_ACPI_DESCRIPT= ION_TABLE_MINOR_REVISION))=0D + {=0D + IsHardwareChange ();=0D + } else {=0D + IsAcpiTableChange ();=0D + }=0D }=0D =0D /**=0D diff --git a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf= b/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf index 694492112b..f47cc3908d 100644 --- a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf +++ b/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf @@ -128,6 +128,7 @@ gEfiGlobalVariableGuid ## CONSUMES=0D gEfiHobListGuid ## CONSUMES=0D gEfiEndOfDxeEventGroupGuid ## CONSUMES=0D + gEfiAcpiTableGuid ## CONSUMES=0D =0D [Depex]=0D gEfiAcpiTableProtocolGuid AND=0D --=20 2.39.2.windows.1