From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web10.10145.1683081601329645854 for ; Tue, 02 May 2023 19:40:01 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=P43ybmbu; spf=pass (domain: intel.com, ip: 134.134.136.20, 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=1683081601; x=1714617601; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=69wXFeC4PpyGHrOXvZ9TXo0HL9GTAaZOKL1JtzNCV88=; b=P43ybmbuHVY7qWa1RIhA73YAOf1JXvmj0xgp20n/lj+5195YyIyYb/vz c00fEf+pDG92vi/5+/i08J2MHm62dVy48bL148X2xdiuQVeVftSbl+wDe gAp4cKsKEHCvxKVeELfXz++j0HVAjmjIAgH1rxTyT7x0Kk9Hm/POK228M pEdQHPyVZmuhuhR6G4e2trOX66r1IVURpZQ9OASBxkp9t9WC6Bd1nO29A oz7/MHhRPb1iXlGmLrt5wdjvOYP23lWWsnluBx+74lRwbSQP5MZ8F8Se+ 9Tjubi3TWTTNCUO/oBPTHtBmlr56T6a+9lv0aFzk6N+inoE0Bb7wd2rkA w==; X-IronPort-AV: E=McAfee;i="6600,9927,10698"; a="337687644" X-IronPort-AV: E=Sophos;i="5.99,246,1677571200"; d="scan'208";a="337687644" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2023 19:40:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10698"; a="870776697" X-IronPort-AV: E=Sophos;i="5.99,246,1677571200"; d="scan'208";a="870776697" Received: from kxinfux-desk.gar.corp.intel.com ([10.227.107.32]) by orsmga005.jf.intel.com with ESMTP; 02 May 2023 19:39:59 -0700 From: "VincentX Ke" To: devel@edk2.groups.io Cc: VincentX Ke , Chasel Chiu , Nate DeSimone , Isaac Oram , Liming Gao , Eric Dong Subject: [PATCH v5] MinPlatformPkg: Update HWSignature filed in FACS Date: Wed, 3 May 2023 10:39:54 +0800 Message-Id: <20230503023954.119-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 each ACPI table. Update HWSignature filed in FACS based on CRC while ACPI table changed. Change-Id: Ic0ca66ff10cda0fbcd0683020fab1bc9aea9b78c Signed-off-by: VincentX Ke Cc: Chasel Chiu Cc: Nate DeSimone Cc: Isaac Oram Cc: Liming Gao Cc: Eric Dong Signed-off-by: VincentX Ke --- Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c | 182 +++++= ++++++++------- Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.inf | 1 + 2 files changed, 118 insertions(+), 65 deletions(-) diff --git a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c b= /Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c index e967031a3b..a940424ced 100644 --- a/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c +++ b/Platform/Intel/MinPlatformPkg/Acpi/AcpiTables/AcpiPlatform.c @@ -1191,98 +1191,150 @@ PlatformUpdateTables ( }=0D =0D /**=0D - This function calculates RCR based on PCI Device ID and Vendor ID from t= he devices=0D - available on the platform.=0D - It also includes other instances of BIOS change to calculate CRC and pro= vides as=0D - HWSignature filed in FADT table.=0D + This function calculates CRC based on each offset in the ACPI table.=0D +=0D + @param[in] Table The pointer to ACPI table that=0D + required to calculate CRC.=0D +=0D + @retval CRC A pointer to allocate UINT32 that=0D + contains the CRC32 data.=0D +**/=0D +UINT32=0D +AcpiTableCrcCalculator (=0D + IN VOID *Table=0D + )=0D +{=0D + UINT32 CRC;=0D +=0D + CRC =3D 0;=0D +=0D + //=0D + // Calculate CRC value.=0D + //=0D + if (((EFI_ACPI_6_5_COMMON_HEADER *)(UINTN)Table)->Signature =3D=3D EFI_A= CPI_6_5_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {=0D + //=0D + // Zero HardwareSignature field before Calculating FACS CRC=0D + //=0D + do {=0D + ((EFI_ACPI_6_5_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Table)->Hard= wareSignature =3D 0;=0D + } while (((EFI_ACPI_6_5_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Table= )->HardwareSignature);=0D +=0D + gBS->CalculateCrc32 ((UINT8 *)Table, (UINTN)((EFI_ACPI_6_5_FIRMWARE_AC= PI_CONTROL_STRUCTURE *)(UINTN)Table)->Length, &CRC);=0D + } else {=0D + gBS->CalculateCrc32 ((UINT8 *)Table, (UINTN)((EFI_ACPI_DESCRIPTION_HEA= DER *)(UINTN)Table)->Length, &CRC);=0D + }=0D +=0D + return CRC;=0D +}=0D +=0D +/**=0D + This function calculates CRC based on each ACPI table.=0D + It also calculates CRC and provides as HWSignature filed in FACS.=0D **/=0D VOID=0D -IsHardwareChange (=0D +IsAcpiTableChange (=0D VOID=0D )=0D {=0D - EFI_STATUS Status;=0D - UINTN Index;=0D - UINTN HandleCount;=0D - EFI_HANDLE *HandleBuffer;=0D - EFI_PCI_IO_PROTOCOL *PciIo;=0D - UINT32 CRC;=0D - UINT32 *HWChange;=0D - UINTN HWChangeSize;=0D - UINT32 PciId;=0D - UINTN Handle;=0D - EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE *FacsPtr;=0D - EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE *pFADT;=0D -=0D - HandleCount =3D 0;=0D - HandleBuffer =3D NULL;=0D -=0D - Status =3D gBS->LocateHandleBuffer (=0D - ByProtocol,=0D - &gEfiPciIoProtocolGuid,=0D - NULL,=0D - &HandleCount,=0D - &HandleBuffer=0D - );=0D - if (EFI_ERROR (Status)) {=0D - return; // PciIO protocol not installed yet!=0D + EFI_STATUS Status;=0D + UINTN Index;=0D + UINTN AcpiTableCount;=0D + UINT32 Table;=0D + UINT32 HWSignature;=0D + UINT32 *AcpiTableCrc;=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 + AcpiTableCrc =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 - // Allocate memory for HWChange and add additional entrie for=0D - // pFADT->XDsdt=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 - HWChangeSize =3D HandleCount + 1;=0D - HWChange =3D AllocateZeroPool (sizeof(UINT32) * HWChangeSize);=0D - ASSERT(HWChange !=3D NULL);=0D + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddr= ess;=0D + Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddr= ess;=0D + AcpiTableCount +=3D 2;=0D + AcpiTableCount =3D AcpiTableCount + (Xsdt->Length - sizeof (EFI_ACPI_DE= SCRIPTION_HEADER))/sizeof (UINT64);=0D =0D - if (HWChange =3D=3D NULL) return;=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->FirmwareCtrl) {=0D + AcpiTableCount++;=0D + }=0D =0D - //=0D - // add HWChange inputs: PCI devices=0D - //=0D - for (Index =3D 0; HandleCount > 0; HandleCount--) {=0D - PciId =3D 0;=0D - Status =3D gBS->HandleProtocol (HandleBuffer[Index], &gEfiPciIoProtoco= lGuid, (VOID **) &PciIo);=0D - if (!EFI_ERROR (Status)) {=0D - Status =3D PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0, 1, &PciId= );=0D - if (EFI_ERROR (Status)) {=0D - continue;=0D + if ((pFADT->XDsdt) || (pFADT->Dsdt)) {=0D + AcpiTableCount++;=0D }=0D - HWChange[Index++] =3D PciId;=0D }=0D }=0D =0D //=0D - // Locate FACP Table=0D + // Allocate memory for founded ACPI tables.=0D //=0D - Handle =3D 0;=0D - Status =3D LocateAcpiTableBySignature (=0D - EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,=0D - (EFI_ACPI_DESCRIPTION_HEADER **) &pFADT,=0D - &Handle=0D - );=0D - if (EFI_ERROR (Status) || (pFADT =3D=3D NULL)) {=0D - return; //Table not found or out of memory resource for pFADT table=0D + AcpiTableCrc =3D AllocateZeroPool (sizeof (UINT32) * AcpiTableCount);=0D + if (AcpiTableCrc =3D=3D NULL) {=0D + return;=0D + }=0D +=0D + AcpiTableCount =3D 0;=0D + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *)(UINT= N)Rsdt);=0D + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *)(UINT= N)Xsdt);=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 + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *)(UI= NTN)Table);=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->FirmwareCtrl) {=0D + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *= )(UINTN)pFADT->FirmwareCtrl);=0D + }=0D +=0D + if (pFADT->XDsdt) {=0D + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *= )(UINTN)pFADT->XDsdt);=0D + } else {=0D + AcpiTableCrc[AcpiTableCount++] =3D AcpiTableCrcCalculator ((VOID *= )(UINTN)pFADT->Dsdt);=0D + }=0D + }=0D }=0D =0D //=0D - // add HWChange inputs: others=0D + // pFADT table not found.=0D //=0D - HWChange[Index++] =3D (UINT32)pFADT->XDsdt;=0D + if (pFADT =3D=3D NULL) {=0D + return;=0D + }=0D =0D //=0D - // Calculate CRC value with HWChange data.=0D + // Calculate HWSignature data.=0D //=0D - Status =3D gBS->CalculateCrc32(HWChange, HWChangeSize, &CRC);=0D - DEBUG ((DEBUG_INFO, "CRC =3D %x and Status =3D %r\n", CRC, Status));=0D + Status =3D gBS->CalculateCrc32 (AcpiTableCrc, AcpiTableCount, &HWSignatu= re);=0D + DEBUG ((DEBUG_INFO, "HardwareSignature =3D %x and Status =3D %r\n", HWSi= gnature, Status));=0D =0D //=0D // Set HardwareSignature value based on CRC value.=0D //=0D - FacsPtr =3D (EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)pFADT= ->FirmwareCtrl;=0D - FacsPtr->HardwareSignature =3D CRC;=0D - FreePool (HWChange);=0D + FacsPtr =3D (EFI_ACPI_6_5_FIRMWARE_ACPI_CONTROL_STRUC= TURE *)(UINTN)pFADT->FirmwareCtrl;=0D + FacsPtr->HardwareSignature =3D HWSignature;=0D + FreePool (AcpiTableCrc);=0D + DEBUG ((DEBUG_INFO, "%a() - End\n", __FUNCTION__));=0D }=0D =0D VOID=0D @@ -1329,7 +1381,7 @@ AcpiEndOfDxeEvent ( //=0D // Calculate Hardware Signature value based on current platform configur= ations=0D //=0D - IsHardwareChange ();=0D + IsAcpiTableChange ();=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