From nobody Sat Apr 27 12:41:41 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+44901+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+44901+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1564992332; cv=none; d=zoho.com; s=zohoarc; b=NCn9dEsaV70c3F0nZAqzJNcZ+sParLC/tQmfbCWf/OIiFr220yTj47o0Gdjkh00j5ONExLjiXRQTOK5t4/wp1VrCJ3L6yQQ8hEW+SPMRLJqRO/NZUF+r3aixXBgM8U0/YScEjHGaSn2z5k0QwyN1TBBzkC7cXVjRtSkYqyJ0lyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564992332; h=Content-Transfer-Encoding:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To:ARC-Authentication-Results; bh=3nHqn1JAbe1lkUuiXLVdTSDKXElvWpZni0lcpFP7g/U=; b=ZzWtn5Ob6f4Vr0ivefOhXO72airvMex4sDd6Fh20FBwzdMiMPxqzp4pLyQ/h2UT0KUgTqrgI5fdUTn2JQyCYIfqW8hlIfcamhfpIkEzx+yukGMKXDgolb2V395jrgxudZzs051z/bK1m+vUZyyQlkizEfjaWXiHsEEjthvABKSo= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+44901+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1564992332147538.6139051122989; Mon, 5 Aug 2019 01:05:32 -0700 (PDT) Return-Path: X-Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Mon, 05 Aug 2019 01:05:31 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Aug 2019 01:03:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,349,1559545200"; d="scan'208";a="167898419" X-Received: from jjin9-mobl.ccr.corp.intel.com ([10.239.192.211]) by orsmga008.jf.intel.com with ESMTP; 05 Aug 2019 01:03:01 -0700 From: "Eric Jin" To: devel@edk2.groups.io Cc: Sean Brogan , Bret Barkelew , Jian J Wang , Hao A Wu , Michael D Kinney Subject: [edk2-devel] [PATCH v2] MdeModulePkg/EsrtFmpDxe: Enhance ESRT to support multiple controllers Date: Mon, 5 Aug 2019 16:02:48 +0800 Message-Id: <20190805080248.10360-1-eric.jin@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,eric.jin@intel.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1564992331; bh=+UJBEECIX0TS4t9DfrvImaOrARWWNmsiru+2a1hNJZ8=; h=Cc:Date:From:Reply-To:Subject:To; b=q1JFKKQnhKKIE0yBb5MHt+L9X7pFd2fDTgSCFKOuN8vVdoOS51awhyRuxR3BjpeshPo 5aPao+E5OzQN55GYG5zy1OosDyv9URU4jYQWOA7agqvxn5Io07iEoHM0BfxwCuMuR3WkS QQEJxRonFlcMnBLq0FNlLDmiiN9LO4mnA0I= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1525 The patch is to merge multiple FMP instances into single ESRT entry when they have the same GUID. The policy to LastAttemptStatus/LastAttemptVersion of ESRT entry is: If all the LastAttemptStatus are LAST_ATTEMPT_STATUS_SUCCESS, then LastAttemptVersion should be the smallest of LastAttemptVersion. If any of the LastAttemptStatus is not LAST_ATTEMPT_STATUS_SUCCESS, then the LastAttemptVersion/LastAttemptStatus should be the values of the first FMP instance whose LastAttemptStatus is not LAST_ATTEMPT_STATUS_SUCCESS. To detect possible duplicated GUID/HardwareInstance, a table of GUID/HardwareInstance pairs from all the EFI_FIRMWARE_IMAGE_DESCRIPTORs from all FMP instances is built. If a duplicate is found, then generate a DEBUG_ERROR message, generate an ASSERT(), and ignore the duplicate EFI_FIRMWARE_IMAGE_DESCRIPTOR. Add an internal worker function called FmpGetFirmwareImageDescriptor() that retrieves the list of EFI_FIRMWARE_IMAGE_DESCRIPTORs from a single FMP instance and returns the descriptors in an allocated buffer. This function is used to get the descriptors used to build the table of unique GUID/HardwareInstance pairs. It is then used again to generate the ESRT Table from all the EFI_FIRMWARE_IMAGE_DESCRIPTORs from all the FMP instances. 2 passes are performed so the total number of descriptors is known. This allows the correct sized buffers to always be allocated. Cc: Sean Brogan Cc: Bret Barkelew Cc: Jian J Wang Cc: Hao A Wu Signed-off-by: Michael D Kinney Signed-off-by: Eric Jin Reviewed-by: Hao A Wu --- MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c | 394 +++++++++++++------- 1 file changed, 257 insertions(+), 137 deletions(-) diff --git a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c b/MdeModulePkg/Uni= versal/EsrtFmpDxe/EsrtFmp.c index 2356da662e..4670349f89 100644 --- a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c +++ b/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c @@ -2,7 +2,7 @@ Publishes ESRT table from Firmware Management Protocol instances =20 Copyright (c) 2016, Microsoft Corporation - Copyright (c) 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
=20 All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -21,6 +21,22 @@ #include #include =20 +/// +/// Structure for array of unique GUID/HardwareInstance pairs from the +/// current set of EFI_FIRMWARE_IMAGE_DESCRIPTORs from all FMP Protocols. +/// +typedef struct { + /// + /// A unique GUID identifying the firmware image type. + /// + EFI_GUID ImageTypeGuid; + /// + /// An optional number to identify the unique hardware instance within t= he + /// system for devices that may have multiple instances whenever possibl= e. + /// + UINT64 HardwareInstance; +} GUID_HARDWAREINSTANCE_PAIR; + /** Print ESRT to debug console. =20 @@ -33,11 +49,6 @@ PrintTable ( IN EFI_SYSTEM_RESOURCE_TABLE *Table ); =20 -// -// Number of ESRT entries to grow by each time we run out of room -// -#define GROWTH_STEP 10 - /** Install EFI System Resource Table into the UEFI Configuration Table =20 @@ -101,90 +112,129 @@ IsSystemFmp ( } =20 /** - Function to create a single ESRT Entry and add it to the ESRT - given a FMP descriptor. If the guid is already in the ESRT it - will be ignored. The ESRT will grow if it does not have enough room. - - @param[in, out] Table On input, pointer to the pointer to th= e ESRT. - On output, same as input or pointer to= the pointer - to new enlarged ESRT. - @param[in] FmpImageInfoBuf Pointer to the EFI_FIRMWARE_IMAGE_DESC= RIPTOR. - @param[in] FmpVersion FMP Version. - - @return Status code. + Function to create a single ESRT Entry and add it to the ESRT with + a given FMP descriptor. If the GUID is already in the ESRT, then the ES= RT + entry is updated. + + @param[in,out] Table Pointer to the ESRT Table. + @param[in,out] HardwareInstances Pointer to the GUID_HARDWAREINSTANCE= _PAIR. + @param[in,out] NumberOfDescriptors The number of EFI_FIRMWARE_IMAGE_DES= CRIPTORs. + @param[in] FmpImageInfoBuf Pointer to the EFI_FIRMWARE_IMAGE_DE= SCRIPTOR. + @param[in] FmpVersion FMP Version. + + @retval EFI_SUCCESS FmpImageInfoBuf was use to fill in a new ESRT e= ntry + in Table. + @retval EFI_SUCCESS The ImageTypeId GUID in FmpImageInfoBuf matches= an + existing ESRT entry in Table, and the informati= on + from FmpImageInfoBuf was merged into the the ex= isting + ESRT entry. + @retval EFI_UNSPOORTED The GUID/HardareInstance in FmpImageInfoBuf has= is a + duplicate. =20 **/ EFI_STATUS CreateEsrtEntry ( - IN OUT EFI_SYSTEM_RESOURCE_TABLE **Table, - IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf, - IN UINT32 FmpVersion + IN OUT EFI_SYSTEM_RESOURCE_TABLE *Table, + IN OUT GUID_HARDWAREINSTANCE_PAIR *HardwareInstances, + IN OUT UINT32 *NumberOfDescriptors, + IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf, + IN UINT32 FmpVersion ) { UINTN Index; EFI_SYSTEM_RESOURCE_ENTRY *Entry; - UINTN NewSize; - EFI_SYSTEM_RESOURCE_TABLE *NewTable; + UINT64 FmpHardwareInstance; =20 - Index =3D 0; - Entry =3D NULL; + FmpHardwareInstance =3D 0; + if (FmpVersion >=3D 3) { + FmpHardwareInstance =3D FmpImageInfoBuf->HardwareInstance; + } =20 - Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)((*Table) + 1); // - // Make sure Guid isn't already in the list + // Check to see of FmpImageInfoBuf GUID/HardwareInstance is unique // - for (Index =3D 0; Index < (*Table)->FwResourceCount; Index++) { - if (CompareGuid (&Entry->FwClass, &FmpImageInfoBuf->ImageTypeId)) { - DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: ESRT Entry already exists for FMP = Instance with GUID %g\n", &Entry->FwClass)); - return EFI_INVALID_PARAMETER; + for (Index =3D 0; Index < *NumberOfDescriptors; Index++) { + if (CompareGuid (&HardwareInstances[Index].ImageTypeGuid, &FmpImageInf= oBuf->ImageTypeId)) { + if (HardwareInstances[Index].HardwareInstance =3D=3D FmpHardwareInst= ance) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Duplicate firmware image descrip= tor with GUID %g HardwareInstance:0x%x\n", &FmpImageInfoBuf->ImageTypeId, F= mpHardwareInstance)); + ASSERT ( + !CompareGuid (&HardwareInstances[Index].ImageTypeGuid, &FmpImage= InfoBuf->ImageTypeId) || + HardwareInstances[Index].HardwareInstance !=3D FmpHardwareInstan= ce + ); + return EFI_UNSUPPORTED; + } } - Entry++; } =20 // - // Grow table if needed + // Record new GUID/HardwareInstance pair // - if ((*Table)->FwResourceCount >=3D (*Table)->FwResourceCountMax) { - NewSize =3D (((*Table)->FwResourceCountMax + GROWTH_STEP) * sizeof (E= FI_SYSTEM_RESOURCE_ENTRY)) + sizeof (EFI_SYSTEM_RESOURCE_TABLE); - NewTable =3D AllocateZeroPool (NewSize); - if (NewTable =3D=3D NULL) { - DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory larger t= able for ESRT. \n")); - return EFI_OUT_OF_RESOURCES; + CopyGuid (&HardwareInstances[*NumberOfDescriptors].ImageTypeGuid, &FmpIm= ageInfoBuf->ImageTypeId); + HardwareInstances[*NumberOfDescriptors].HardwareInstance =3D FmpHardware= Instance; + *NumberOfDescriptors =3D *NumberOfDescriptors + 1; + + DEBUG ((DEBUG_INFO, "EsrtFmpDxe: Add new image descriptor with GUID %g H= ardwareInstance:0x%x\n", &FmpImageInfoBuf->ImageTypeId, FmpHardwareInstance= )); + + // + // Check to see if GUID is already in the ESRT table + // + Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(Table + 1); + for (Index =3D 0; Index < Table->FwResourceCount; Index++, Entry++) { + if (!CompareGuid (&Entry->FwClass, &FmpImageInfoBuf->ImageTypeId)) { + continue; } + DEBUG ((DEBUG_INFO, "EsrtFmpDxe: ESRT Entry already exists for FMP Ins= tance with GUID %g\n", &Entry->FwClass)); + // - // Copy the whole old table into new table buffer - // - CopyMem ( - NewTable, - (*Table), - (((*Table)->FwResourceCountMax) * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)= ) + sizeof (EFI_SYSTEM_RESOURCE_TABLE) - ); - // - // Update max + // Set ESRT FwVersion to the smaller of the two values // - NewTable->FwResourceCountMax =3D NewTable->FwResourceCountMax + GROWTH= _STEP; + Entry->FwVersion =3D MIN (FmpImageInfoBuf->Version, Entry->FwVersion); + // - // Free old table + // VERSION 2 has Lowest Supported // - FreePool ((*Table)); + if (FmpVersion >=3D 2) { + // + // Set ESRT LowestSupportedFwVersion to the smaller of the two values + // + Entry->LowestSupportedFwVersion =3D + MIN ( + FmpImageInfoBuf->LowestSupportedImageVersion, + Entry->LowestSupportedFwVersion + ); + } + // - // Reassign pointer to new table. + // VERSION 3 supports last attempt values // - (*Table) =3D NewTable; + if (FmpVersion >=3D 3) { + // + // Update the ESRT entry with the last attempt status and last attem= pt + // version from the first FMP instance whose last attempt status is = not + // SUCCESS. If all FMP instances are SUCCESS, then set version to t= he + // smallest value from all FMP instances. + // + if (Entry->LastAttemptStatus =3D=3D LAST_ATTEMPT_STATUS_SUCCESS) { + if (FmpImageInfoBuf->LastAttemptStatus !=3D LAST_ATTEMPT_STATUS_SU= CCESS) { + Entry->LastAttemptStatus =3D FmpImageInfoBuf->LastAttemptStatus; + Entry->LastAttemptVersion =3D FmpImageInfoBuf->LastAttemptVersio= n; + } else { + Entry->LastAttemptVersion =3D + MIN ( + FmpImageInfoBuf->LastAttemptVersion, + Entry->LastAttemptVersion + ); + } + } + } + + return EFI_SUCCESS; } =20 // - // ESRT table has enough room for the new entry so add new entry - // - Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)(*Table)) + sizeof (EF= I_SYSTEM_RESOURCE_TABLE)); - // - // Move to the location of new entry - // - Entry =3D Entry + (*Table)->FwResourceCount; + // Add a new ESRT Table Entry // - // Increment resource count - // - (*Table)->FwResourceCount++; + Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(Table + 1) + Table->FwResourceCo= unt; =20 CopyGuid (&Entry->FwClass, &FmpImageInfoBuf->ImageTypeId); =20 @@ -195,11 +245,11 @@ CreateEsrtEntry ( Entry->FwType =3D (UINT32)(ESRT_FW_TYPE_DEVICEFIRMWARE); } =20 - Entry->FwVersion =3D FmpImageInfoBuf->Version; + Entry->FwVersion =3D FmpImageInfoBuf->Version; Entry->LowestSupportedFwVersion =3D 0; - Entry->CapsuleFlags =3D 0; - Entry->LastAttemptVersion =3D 0; - Entry->LastAttemptStatus =3D 0; + Entry->CapsuleFlags =3D 0; + Entry->LastAttemptVersion =3D 0; + Entry->LastAttemptStatus =3D 0; =20 // // VERSION 2 has Lowest Supported @@ -213,12 +263,93 @@ CreateEsrtEntry ( // if (FmpVersion >=3D 3) { Entry->LastAttemptVersion =3D FmpImageInfoBuf->LastAttemptVersion; - Entry->LastAttemptStatus =3D FmpImageInfoBuf->LastAttemptStatus; + Entry->LastAttemptStatus =3D FmpImageInfoBuf->LastAttemptStatus; } =20 + // + // Increment the number of active ESRT Table Entries + // + Table->FwResourceCount++; + return EFI_SUCCESS; } =20 +/** + Function to retrieve the EFI_FIRMWARE_IMAGE_DESCRIPTOR from an FMP Insta= nce. + The returned buffer is allocated using AllocatePool() and must be freed = by the + caller using FreePool(). + + @param[in] Fmp Pointer to an EFI_FIRMWARE_MANAGE= MENT_PROTOCOL. + @param[out] FmpImageInfoDescriptorVer Pointer to the version number ass= ociated + with the returned EFI_FIRMWARE_IM= AGE_DESCRIPTOR. + @param[out] FmpImageInfoCount Pointer to the number of the retu= rned + EFI_FIRMWARE_IMAGE_DESCRIPTORs. + @param[out] DescriptorSize Pointer to the size, in bytes, of= each + returned EFI_FIRMWARE_IMAGE_DESCR= IPTOR. + + @return Pointer to the retrieved EFI_FIRMWARE_IMAGE_DESCRIPTOR. If the + descriptor can not be retrieved, then NULL is returned. + +**/ +EFI_FIRMWARE_IMAGE_DESCRIPTOR * +FmpGetFirmwareImageDescriptor ( + IN EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp, + OUT UINT32 *FmpImageInfoDescriptorVer, + OUT UINT8 *FmpImageInfoCount, + OUT UINTN *DescriptorSize + ) +{ + EFI_STATUS Status; + UINTN ImageInfoSize; + UINT32 PackageVersion; + CHAR16 *PackageVersionName; + EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf; + + ImageInfoSize =3D 0; + Status =3D Fmp->GetImageInfo ( + Fmp, // FMP Pointer + &ImageInfoSize, // Buffer Size (in this case= 0) + NULL, // NULL so we can get size + FmpImageInfoDescriptorVer, // DescriptorVersion + FmpImageInfoCount, // DescriptorCount + DescriptorSize, // DescriptorSize + &PackageVersion, // PackageVersion + &PackageVersionName // PackageVersionName + ); + if (Status !=3D EFI_BUFFER_TOO_SMALL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Unexpected Failure in GetImageInfo. = Status =3D %r\n", Status)); + return NULL; + } + + FmpImageInfoBuf =3D AllocateZeroPool (ImageInfoSize); + if (FmpImageInfoBuf =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to get memory for FMP descrip= tor.\n")); + return NULL; + } + + PackageVersionName =3D NULL; + Status =3D Fmp->GetImageInfo ( + Fmp, // FMP Pointer + &ImageInfoSize, // ImageInfoSize + FmpImageInfoBuf, // ImageInfo + FmpImageInfoDescriptorVer, // DescriptorVersion + FmpImageInfoCount, // DescriptorCount + DescriptorSize, // DescriptorSize + &PackageVersion, // PackageVersion + &PackageVersionName // PackageVersionName + ); + if (PackageVersionName !=3D NULL) { + FreePool (PackageVersionName); + } + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failure in GetImageInfo. Status =3D= %r\n", Status)); + FreePool (FmpImageInfoBuf); + return NULL; + } + + return FmpImageInfoBuf; +} + /** Function to create ESRT based on FMP Instances. Create ESRT table, get the descriptors from FMP Instance and @@ -232,29 +363,26 @@ CreateFmpBasedEsrt ( VOID ) { - EFI_STATUS Status; - EFI_SYSTEM_RESOURCE_TABLE *Table; - UINTN NoProtocols; - VOID **Buffer; - UINTN Index; - EFI_FIRMWARE_MANAGEMENT_PROTOCOL *Fmp; - UINTN DescriptorSize; - EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf; - EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBufOrg; - UINT8 FmpImageInfoCount; - UINT32 FmpImageInfoDescriptorVer; - UINTN ImageInfoSize; - UINT32 PackageVersion; - CHAR16 *PackageVersionName; + EFI_STATUS Status; + UINTN NoProtocols; + VOID **Buffer; + UINTN Index; + UINT32 FmpImageInfoDescriptorVer; + UINT8 FmpImageInfoCount; + UINTN DescriptorSize; + UINT32 NumberOfDescriptors; + EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf; + EFI_FIRMWARE_IMAGE_DESCRIPTOR *OrgFmpImageInfoBuf; + EFI_SYSTEM_RESOURCE_TABLE *Table; + GUID_HARDWAREINSTANCE_PAIR *HardwareInstances; =20 Status =3D EFI_SUCCESS; - Table =3D NULL; NoProtocols =3D 0; Buffer =3D NULL; - PackageVersionName =3D NULL; FmpImageInfoBuf =3D NULL; - FmpImageInfoBufOrg =3D NULL; - Fmp =3D NULL; + OrgFmpImageInfoBuf =3D NULL; + Table =3D NULL; + HardwareInstances =3D NULL; =20 Status =3D EfiLocateProtocolBuffer ( &gEfiFirmwareManagementProtocolGuid, @@ -266,69 +394,64 @@ CreateFmpBasedEsrt ( } =20 // - // Allocate Memory for table + // Count the total number of EFI_FIRMWARE_IMAGE_DESCRIPTORs + // + for (Index =3D 0, NumberOfDescriptors =3D 0; Index < NoProtocols; Index+= +) { + FmpImageInfoBuf =3D FmpGetFirmwareImageDescriptor ( + (EFI_FIRMWARE_MANAGEMENT_PROTOCOL *) Buffer[Index], + &FmpImageInfoDescriptorVer, + &FmpImageInfoCount, + &DescriptorSize + ); + if (FmpImageInfoBuf !=3D NULL) { + NumberOfDescriptors +=3D FmpImageInfoCount; + FreePool (FmpImageInfoBuf); + } + } + + // + // Allocate ESRT Table and GUID/HardwareInstance table // Table =3D AllocateZeroPool ( - (GROWTH_STEP * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)) + sizeof (= EFI_SYSTEM_RESOURCE_TABLE) + (NumberOfDescriptors * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)) + = sizeof (EFI_SYSTEM_RESOURCE_TABLE) ); if (Table =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory for ESRT.\= n")); - gBS->FreePool (Buffer); + FreePool (Buffer); return NULL; } =20 + HardwareInstances =3D AllocateZeroPool (NumberOfDescriptors * sizeof (GU= ID_HARDWAREINSTANCE_PAIR)); + if (HardwareInstances =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory for HW Ins= tance Table.\n")); + FreePool (Table); + FreePool (Buffer); + return NULL; + } + + // + // Initialize ESRT Table + // Table->FwResourceCount =3D 0; - Table->FwResourceCountMax =3D GROWTH_STEP; + Table->FwResourceCountMax =3D NumberOfDescriptors; Table->FwResourceVersion =3D EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURC= E_VERSION; =20 + NumberOfDescriptors =3D 0; for (Index =3D 0; Index < NoProtocols; Index++) { - Fmp =3D (EFI_FIRMWARE_MANAGEMENT_PROTOCOL *) Buffer[Index]; - - ImageInfoSize =3D 0; - Status =3D Fmp->GetImageInfo ( - Fmp, // FMP Pointer - &ImageInfoSize, // Buffer Size (in this c= ase 0) - NULL, // NULL so we can get size - &FmpImageInfoDescriptorVer, // DescriptorVersion - &FmpImageInfoCount, // DescriptorCount - &DescriptorSize, // DescriptorSize - &PackageVersion, // PackageVersion - &PackageVersionName // PackageVersionName - ); - - if (Status !=3D EFI_BUFFER_TOO_SMALL) { - DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Unexpected Failure in GetImageInfo= . Status =3D %r\n", Status)); - continue; - } - - FmpImageInfoBuf =3D AllocateZeroPool (ImageInfoSize); + FmpImageInfoBuf =3D FmpGetFirmwareImageDescriptor ( + (EFI_FIRMWARE_MANAGEMENT_PROTOCOL *) Buffer[Index], + &FmpImageInfoDescriptorVer, + &FmpImageInfoCount, + &DescriptorSize + ); if (FmpImageInfoBuf =3D=3D NULL) { - DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to get memory for descripto= rs.\n")); - continue; - } - - FmpImageInfoBufOrg =3D FmpImageInfoBuf; - PackageVersionName =3D NULL; - Status =3D Fmp->GetImageInfo ( - Fmp, - &ImageInfoSize, // ImageInfoSize - FmpImageInfoBuf, // ImageInfo - &FmpImageInfoDescriptorVer, // DescriptorVersion - &FmpImageInfoCount, // DescriptorCount - &DescriptorSize, // DescriptorSize - &PackageVersion, // PackageVersion - &PackageVersionName // PackageVersionName - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failure in GetImageInfo. Status = =3D %r\n", Status)); - FreePool (FmpImageInfoBufOrg); - FmpImageInfoBufOrg =3D NULL; continue; } =20 // // Check each descriptor and read from the one specified // + OrgFmpImageInfoBuf =3D FmpImageInfoBuf; while (FmpImageInfoCount > 0) { // // If the descriptor has the IN USE bit set, create ESRT entry other= wise ignore. @@ -337,7 +460,7 @@ CreateFmpBasedEsrt ( // // Create ESRT entry // - CreateEsrtEntry (&Table, FmpImageInfoBuf, FmpImageInfoDescriptorVe= r); + CreateEsrtEntry (Table, HardwareInstances, &NumberOfDescriptors, F= mpImageInfoBuf, FmpImageInfoDescriptorVer); } FmpImageInfoCount--; // @@ -346,15 +469,12 @@ CreateFmpBasedEsrt ( FmpImageInfoBuf =3D (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)(((UINT8 *)FmpI= mageInfoBuf) + DescriptorSize); } =20 - if (PackageVersionName !=3D NULL) { - FreePool (PackageVersionName); - PackageVersionName =3D NULL; - } - FreePool (FmpImageInfoBufOrg); - FmpImageInfoBufOrg =3D NULL; + FreePool (OrgFmpImageInfoBuf); + OrgFmpImageInfoBuf =3D NULL; } =20 - gBS->FreePool (Buffer); + FreePool (Buffer); + FreePool (HardwareInstances); return Table; } =20 --=20 2.20.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#44901): https://edk2.groups.io/g/devel/message/44901 Mute This Topic: https://groups.io/mt/32723459/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-