From nobody Mon Dec 23 18:15:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1516921686590267.52750914649323; Thu, 25 Jan 2018 15:08:06 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id AF0A422333772; Thu, 25 Jan 2018 15:02:34 -0800 (PST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 91CE321D2BF04 for ; Thu, 25 Jan 2018 15:02:32 -0800 (PST) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jan 2018 15:08:02 -0800 Received: from mdkinney-mobl2.amr.corp.intel.com ([10.254.79.209]) by fmsmga006.fm.intel.com with ESMTP; 25 Jan 2018 15:08:01 -0800 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.115; helo=mga14.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,413,1511856000"; d="scan'208";a="198870517" From: "Kinney, Michael D" To: edk2-devel@lists.01.org Date: Thu, 25 Jan 2018 15:07:54 -0800 Message-Id: <20180125230756.23844-2-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180125230756.23844-1-michael.d.kinney@intel.com> References: <20180125230756.23844-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch 1/3] MdeModulePkg/EsrtFmpDxe: Add EsrtFmpDxe module X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ruiyu Ni , Eric Dong , Jiewen Yao , Michael D Kinney , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Michael D Kinney https://bugzilla.tianocore.org/show_bug.cgi?id=3D802 Based on content from the following branch/commits: https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport The EsrtFmpDxe module is a lightweight version of the EsrtDxe module that produces ESRT entries based only on FMP Protocol instances. Cc: Sean Brogan Cc: Jiewen Yao Cc: Star Zeng Cc: Eric Dong Cc: Ruiyu Ni Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney --- MdeModulePkg/MdeModulePkg.dsc | 1 + MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c | 484 +++++++++++++++++= ++++ .../Universal/EsrtFmpDxe/EsrtFmpDebugPrint.c | 161 +++++++ MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf | 68 +++ 4 files changed, 714 insertions(+) create mode 100644 MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c create mode 100644 MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDebugPrint.c create mode 100644 MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index dd7e9d5988..c7dd76b774 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -417,6 +417,7 @@ =20 MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf + MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf =20 MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttri= butesDxe.inf MdeModulePkg/Universal/FileExplorerDxe/FileExplorerDxe.inf { diff --git a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c b/MdeModulePkg/Uni= versal/EsrtFmpDxe/EsrtFmp.c new file mode 100644 index 0000000000..9fb281c666 --- /dev/null +++ b/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c @@ -0,0 +1,484 @@ +/** @file + Publishes ESRT table from Firmware Management Protocol instances + + Copyright (c) 2016, Microsoft Corporation + Copyright (c) 2018, Intel Corporation. All rights reserved.
+ + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright not= ice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS = IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IM= PLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + Print ESRT to debug console +*/ +VOID +EFIAPI +PrintTable ( + IN EFI_SYSTEM_RESOURCE_TABLE *Table + ); + +// +// Number of ESRT entries to grow by each time we run out of room +// +#define GROWTH_STEP 10 + +// +// Module globals. +// +EFI_EVENT mEsrtReadyToBootEvent; +EFI_SYSTEM_RESOURCE_TABLE *mTable =3D NULL; +BOOLEAN mEsrtInstalled =3D FALSE; +EFI_EVENT mFmpInstallEvent; +VOID *mFmpInstallEventRegistration =3D NULL; + +/** + Install EFI System Resource Table into the UEFI Configuration Table + + @return Status code. + +**/ +EFI_STATUS +InstallEfiSystemResourceTableInUefiConfigurationTable ( + VOID + ) +{ + EFI_STATUS Status; + + Status =3D EFI_SUCCESS; + if (!mEsrtInstalled) { + if (mTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table because i= t is NULL. \n")); + Status =3D EFI_OUT_OF_RESOURCES; + } else if (mTable->FwResourceCount =3D=3D 0) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table because i= t has zero Entries. \n")); + Status =3D EFI_UNSUPPORTED; + } else { + // + // Install the pointer into config table + // + Status =3D gBS->InstallConfigurationTable (&gEfiSystemResourceTableG= uid, mTable); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table. Statu= s: %r. \n", Status)); + } else { + DEBUG ((DEBUG_INFO, "EsrtFmpDxe: Installed ESRT table. \n")); + mEsrtInstalled =3D TRUE; + } + } + } + return Status; +} + +/** + Return if this FMP is a system FMP or a device FMP, based upon FmpImageI= nfo. + + @param[in] FmpImageInfo A pointer to EFI_FIRMWARE_IMAGE_DESCRIPTOR + + @return TRUE It is a system FMP. + @return FALSE It is a device FMP. +**/ +BOOLEAN +IsSystemFmp ( + IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfo + ) +{ + GUID *Guid; + UINTN Count; + UINTN Index; + + Guid =3D PcdGetPtr (PcdSystemFmpCapsuleImageTypeIdGuid); + Count =3D PcdGetSize (PcdSystemFmpCapsuleImageTypeIdGuid) / sizeof(GUID); + + for (Index =3D 0; Index < Count; Index++, Guid++) { + if (CompareGuid (&FmpImageInfo->ImageTypeId, Guid)) { + return TRUE; + } + } + + return FALSE; +} + +/** + 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. + + @return Status code. + +**/ +EFI_STATUS +EFIAPI +CreateEsrtEntry ( + IN EFI_FIRMWARE_IMAGE_DESCRIPTOR *FmpImageInfoBuf, + IN UINT32 FmpVersion + ) +{ + UINTN Index; + EFI_SYSTEM_RESOURCE_ENTRY *Entry; + UINTN NewSize; + EFI_SYSTEM_RESOURCE_TABLE *NewTable; + + Index =3D 0; + Entry =3D NULL; + + // + // Get our ESRT table. This should never be null at this point + // + if (mTable =3D=3D NULL) { + return EFI_DEVICE_ERROR; + } + + Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(mTable + 1); + // + // Make sure Guid isn't already in the list + // + for (Index =3D 0; Index < mTable->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; + } + Entry++; + } + + // + // Grow table if needed + // + if (mTable->FwResourceCount >=3D mTable->FwResourceCountMax) { + // + // Can't grow table after installed. + // Only because didn't add support for this. + // Would need to re-install ESRT in system table if wanted to support + // + if (mEsrtInstalled) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to install entry because ES= RT table needed to grow after table already installed. \n")); + return EFI_OUT_OF_RESOURCES; + } + + NewSize =3D ((mTable->FwResourceCountMax + GROWTH_STEP) * sizeof (EFI= _SYSTEM_RESOURCE_ENTRY)) + sizeof (EFI_SYSTEM_RESOURCE_TABLE); + NewTable =3D AllocateRuntimeZeroPool (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; + } + // + // Copy the whole old table into new table buffer + // + CopyMem ( + NewTable, + mTable, + ((mTable->FwResourceCountMax) * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)) = + sizeof (EFI_SYSTEM_RESOURCE_TABLE) + ); + // + // Update max + // + NewTable->FwResourceCountMax =3D NewTable->FwResourceCountMax + GROWTH= _STEP; + // + // Free old table + // + FreePool (mTable); + // + // Reassign pointer to new table. + // + mTable =3D NewTable; + } + + // + // ESRT table has enough room for the new entry so add new entry + // + Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)mTable) + sizeof (EFI_= SYSTEM_RESOURCE_TABLE)); + // + // Move to the location of new entry + // + Entry =3D Entry + mTable->FwResourceCount; + // + // Increment resource count + // + mTable->FwResourceCount++; + + CopyGuid (&Entry->FwClass, &FmpImageInfoBuf->ImageTypeId); + + if (IsSystemFmp (FmpImageInfoBuf)) { + DEBUG ((DEBUG_INFO, "EsrtFmpDxe: Found an ESRT entry for a System Devi= ce.\n")); + Entry->FwType =3D (UINT32)(ESRT_FW_TYPE_SYSTEMFIRMWARE); + } else { + Entry->FwType =3D (UINT32)(ESRT_FW_TYPE_DEVICEFIRMWARE); + } + + Entry->FwVersion =3D FmpImageInfoBuf->Version; + Entry->LowestSupportedFwVersion =3D 0; + Entry->CapsuleFlags =3D 0; + Entry->LastAttemptVersion =3D 0; + Entry->LastAttemptStatus =3D 0; + + // + // VERSION 2 has Lowest Supported + // + if (FmpVersion >=3D 2) { + Entry->LowestSupportedFwVersion =3D FmpImageInfoBuf->LowestSupportedIm= ageVersion; + } + + // + // VERSION 3 supports last attempt values + // + if (FmpVersion >=3D 3) { + Entry->LastAttemptVersion =3D FmpImageInfoBuf->LastAttemptVersion; + Entry->LastAttemptStatus =3D FmpImageInfoBuf->LastAttemptStatus; + } + + return EFI_SUCCESS; +} + +/** + Notify function for every Firmware Management Protocol being installed. + Get the descriptors from FMP Instance and create ESRT entries (ESRE) + + @param[in] Event The Event that is being processed. + @param[in] Context The Event Context. + +**/ +VOID +EFIAPI +FmpInstallProtocolNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + UINTN BufferSize; + 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; + + Status =3D EFI_SUCCESS; + Handle =3D 0; + BufferSize =3D 0; + PackageVersionName =3D NULL; + FmpImageInfoBuf =3D NULL; + FmpImageInfoBufOrg =3D NULL; + Fmp =3D NULL; + + DEBUG ((DEBUG_INFO, "FMP Installed Notify\n")); + while (TRUE) { + BufferSize =3D sizeof (EFI_HANDLE); + Status =3D gBS->LocateHandle (ByRegisterNotify, NULL, mFmpInstallEvent= Registration, &BufferSize, &Handle); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "EsrtFmpDxe: Failed to Locate handle from notify= value. Status: %r\n", Status)); + return; + } + + Status =3D gBS->HandleProtocol (Handle, &gEfiFirmwareManagementProtoco= lGuid, (VOID **)&Fmp); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to get FMP for a handle 0x%= x\n", Handle)); + continue; + } + 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 NULL; + FmpImageInfoBuf =3D AllocateZeroPool (ImageInfoSize); + 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)); + goto CleanUp; + } + + // + // Check each descriptor and read from the one specified + // + while (FmpImageInfoCount > 0) { + // + // If the descriptor has the IN USE bit set, create ESRT entry other= wise ignore. + // + if ((FmpImageInfoBuf->AttributesSetting & FmpImageInfoBuf->Attribute= sSupported & IMAGE_ATTRIBUTE_IN_USE) =3D=3D IMAGE_ATTRIBUTE_IN_USE) { + // + // Create ESRT entry + // + CreateEsrtEntry (FmpImageInfoBuf, FmpImageInfoDescriptorVer); + } + FmpImageInfoCount--; + // + // Increment the buffer pointer ahead by the size of the descriptor + // + FmpImageInfoBuf =3D (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)(((UINT8 *)FmpI= mageInfoBuf) + DescriptorSize); + } + + if (PackageVersionName !=3D NULL) { + FreePool (PackageVersionName); + PackageVersionName =3D NULL; + } + if (FmpImageInfoBufOrg !=3D NULL) { + FreePool (FmpImageInfoBufOrg); + FmpImageInfoBufOrg =3D NULL; + } + } + +CleanUp: + if (FmpImageInfoBufOrg !=3D NULL) { + FreePool (FmpImageInfoBufOrg); + } + return; +} + +/** + Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT. This is u= sed to + install the Efi System Resource Table. + + @param[in] Event The Event that is being processed. + @param[in] Context The Event Context. + +**/ +VOID +EFIAPI +EsrtReadyToBootEventNotify ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + InstallEfiSystemResourceTableInUefiConfigurationTable (); + + // + // Print table on debug builds + // + DEBUG_CODE_BEGIN (); + PrintTable (mTable); + DEBUG_CODE_END (); +} + +/** + The module Entry Point of the Efi System Resource Table DXE driver. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +EsrtFmpEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Allocate Memory for table + // + mTable =3D AllocateRuntimeZeroPool ( + (GROWTH_STEP * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)) + sizeof (= EFI_SYSTEM_RESOURCE_TABLE) + ); + ASSERT (mTable !=3D NULL); + if (mTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory for ESRT.\= n")); + return EFI_OUT_OF_RESOURCES; + } + + mTable->FwResourceCount =3D 0; + mTable->FwResourceCountMax =3D GROWTH_STEP; + mTable->FwResourceVersion =3D EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOUR= CE_VERSION; + + // + // Register notify function for all FMP installed + // + mFmpInstallEvent =3D EfiCreateProtocolNotifyEvent ( + &gEfiFirmwareManagementProtocolGuid, + TPL_CALLBACK, + FmpInstallProtocolNotify, + NULL, + &mFmpInstallEventRegistration + ); + + ASSERT (mFmpInstallEvent !=3D NULL); + + if (mFmpInstallEvent =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to Create Protocol Notify Eve= nt for FMP.\n")); + } + + // + // Register notify function to install ESRT on ReadyToBoot Event. + // + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + EsrtReadyToBootEventNotify, + NULL, + &gEfiEventReadyToBootGuid, + &mEsrtReadyToBootEvent + ); + + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to register for ready to boot= \n")); + } + + return Status; +} diff --git a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDebugPrint.c b/MdeMod= ulePkg/Universal/EsrtFmpDxe/EsrtFmpDebugPrint.c new file mode 100644 index 0000000000..b4e5135e05 --- /dev/null +++ b/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDebugPrint.c @@ -0,0 +1,161 @@ +/** @file + Publishes ESRT table from Firmware Management Protocol instances + + Copyright (c) 2016, Microsoft Corporation + Copyright (c) 2018, Intel Corporation. All rights reserved.
+ + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright not= ice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS = IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IM= PLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +**/ + +#include +#include +#include +#include +#include +#include + +/** + Function to print a single ESRT Entry (ESRE) to the debug console + + Print Format: + | 00000000-0000-0000-0000-000000000000 | SSSSSSSSSSSS | 0x00000000 | 0x0= 0000000 | 0x00000000 | 0x00000000 | 0x00000000 | + + @param[in] Entry - Pointer to an ESRE entry + @retval EFI_SUCCESS + EFI_INVALID_PARAMETER +**/ +EFI_STATUS +EFIAPI +PrintOutEsrtEntry ( + IN EFI_SYSTEM_RESOURCE_ENTRY *Entry + ) +{ + if (Entry =3D=3D NULL) { + DEBUG ((DEBUG_INFO, "| ERROR: Invalid resource entry pointer = ")); + DEBUG ((DEBUG_INFO, " = |\n")); + return EFI_INVALID_PARAMETER; + } + + // + // GUID FW Class (36 chars plus table formatting) + // + DEBUG ((DEBUG_INFO, "| %g |", &Entry->FwClass)); + + // + // Entry Type (12 chars plus table formatting) + // + switch (Entry->FwType) { + case (ESRT_FW_TYPE_SYSTEMFIRMWARE) : + DEBUG ((DEBUG_INFO, " System FW |")); + break; + case (ESRT_FW_TYPE_DEVICEFIRMWARE) : + DEBUG ((DEBUG_INFO, " Device FW |")); + break; + case (ESRT_FW_TYPE_UEFIDRIVER) : + DEBUG ((DEBUG_INFO, " Uefi Driver |")); + break; + case (ESRT_FW_TYPE_UNKNOWN) : + DEBUG ((DEBUG_INFO, " Unknown Type |")); + break; + default: + DEBUG ((DEBUG_INFO, " ? 0x%8X |", Entry->FwType)); + break; + } + + // + // FW Version (10 char UINT32 string plus table formatting) + // Lowest Supported Version (10 char UINT32 string plus table formatting) + // Capsule Flags (10 char UINT32 string plus table formatting) + // Last Attempt Version (10 char UINT32 string plus table formatting) + // Last Attempt Status (10 char UINT32 string plus table formatting) + // + DEBUG ((DEBUG_INFO, + " 0x%8X | 0x%8X | 0x%8X | 0x%8X | 0x%8X |\n", + Entry->FwVersion, + Entry->LowestSupportedFwVersion, + Entry->CapsuleFlags, + Entry->LastAttemptVersion, + Entry->LastAttemptStatus + )); + + return EFI_SUCCESS; +} + +/** + Function to print the ESRT table to the debug console + + @param[in] Table - Pointer to the ESRT table +**/ +VOID +EFIAPI +PrintTable ( + IN EFI_SYSTEM_RESOURCE_TABLE *Table + ) +{ + EFI_SYSTEM_RESOURCE_ENTRY *Entry; + UINTN Index; + + Entry =3D (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)Table) + sizeof (EFI_S= YSTEM_RESOURCE_TABLE)); + + // + // Print ESRT table information + // + DEBUG ((DEBUG_INFO, "ESRT Table Information:\n")); + if (Table =3D=3D NULL) { + DEBUG ((DEBUG_INFO, "ERROR: Invalid table pointer\n")); + return; + } + + DEBUG ((DEBUG_INFO, "+--------------------------------------------------= ------+\n")); + DEBUG ((DEBUG_INFO, "| Firmware Resource Count : 0x%08x = |\n", Table->FwResourceCount)); + DEBUG ((DEBUG_INFO, "| Firmware Resource Count Max : 0x%08x = |\n", Table->FwResourceCountMax)); + DEBUG ((DEBUG_INFO, "| Firmware Resource Entry Version : 0x%016x |\n",= Table->FwResourceVersion)); + DEBUG ((DEBUG_INFO, "+--------------------------------------------------= ------+\n")); + + // + // Print table entry information + // + DEBUG ((DEBUG_INFO, "ESRT Table Entries:\n")); + if (Table->FwResourceVersion !=3D EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RES= OURCE_VERSION) { + DEBUG ((DEBUG_INFO, "ERROR: Unsupported Resource Entry Version\n")); + return; + } + + DEBUG ((DEBUG_INFO, "+--------------------------------------+-----------= ---+------------")); + DEBUG ((DEBUG_INFO, "+------------+------------+------------+-----------= -+\n")); + DEBUG ((DEBUG_INFO, "| | = | ")); + DEBUG ((DEBUG_INFO, "| Lowest | | Last | Last = |\n")); + DEBUG ((DEBUG_INFO, "| | Firmware = | ")); + DEBUG ((DEBUG_INFO, "| Supported | Capsule | Attempted | Attempted = |\n")); + DEBUG ((DEBUG_INFO, "| CLASS GUID | Type = | Version ")); + DEBUG ((DEBUG_INFO, "| Version | Flags | Version | Status = |\n")); + DEBUG ((DEBUG_INFO, "+--------------------------------------+-----------= ---+------------")); + DEBUG ((DEBUG_INFO, "+------------+------------+------------+-----------= -+\n")); + + for (Index =3D 0; Index < Table->FwResourceCount; Index++) { + PrintOutEsrtEntry (&(Entry[Index])); + } + + DEBUG ((DEBUG_INFO, "+--------------------------------------+-----------= ---+------------")); + DEBUG ((DEBUG_INFO, "+------------+------------+------------+-----------= -+\n")); +} + diff --git a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf b/MdeModulePk= g/Universal/EsrtFmpDxe/EsrtFmpDxe.inf new file mode 100644 index 0000000000..1ad2fe55a1 --- /dev/null +++ b/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf @@ -0,0 +1,68 @@ +## @file +# Publishes ESRT table from Firmware Management Protocol instances +# +# Copyright (c) 2016, Microsoft Corporation +# Copyright (c) 2018, Intel Corporation. All rights reserved.
+# +# All rights reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are m= et: +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright not= ice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS = IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IM= PLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D EsrtFmpDxe + FILE_GUID =3D FF626DA9-17EE-4949-A8B8-B10FA0044E9F + MODULE_TYPE =3D UEFI_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D EsrtFmpEntryPoint + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + EsrtFmp.c + EsrtFmpDebugPrint.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + BaseLib + BaseMemoryLib + MemoryAllocationLib + UefiLib + UefiBootServicesTableLib + DebugLib + PcdLib + +[Protocols] + gEfiFirmwareManagementProtocolGuid ## CONSUMES + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid ## CO= NSUMES + +[Guids] + gEfiEventReadyToBootGuid ## CONSUMES + gEfiSystemResourceTableGuid ## PRODUCES --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel