public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ruiyu" <ruiyu.ni@intel.com>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Dong, Eric" <eric.dong@intel.com>,
	"Yao, Jiewen" <jiewen.yao@intel.com>,
	 "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [Patch 1/3] MdeModulePkg/EsrtFmpDxe: Add EsrtFmpDxe module
Date: Fri, 26 Jan 2018 07:15:21 +0000	[thread overview]
Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BB5BB6D@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180125230756.23844-2-michael.d.kinney@intel.com>

Mike,
Should all code use BSD licenses?

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Kinney, Michael D
> Sent: Friday, January 26, 2018 7:08 AM
> To: edk2-devel@lists.01.org
> Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; Dong, Eric <eric.dong@intel.com>; Yao,
> Jiewen <jiewen.yao@intel.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>; Zeng, Star <star.zeng@intel.com>
> Subject: [edk2] [Patch 1/3] MdeModulePkg/EsrtFmpDxe: Add EsrtFmpDxe
> module
> 
> From: Michael D Kinney <michael.d.kinney@intel.com>
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=802
> 
> 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 <sean.brogan@microsoft.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> ---
>  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 @@
> 
>    MdeModulePkg/Universal/FvSimpleFileSystemDxe/FvSimpleFileSystemDxe.inf
>    MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> +  MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
> 
> 
> MdeModulePkg/Universal/PropertiesTableAttributesDxe/PropertiesTableAttribu
> tesDxe.inf
>    MdeModulePkg/Universal/FileExplorerDxe/FileExplorerDxe.inf  { diff --git
> a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmp.c
> b/MdeModulePkg/Universal/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.<BR>
> +
> +  All rights reserved.
> +  Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions are met:
> +  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
> + notice,  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 IMPLIED  WARRANTIES OF MERCHANTABILITY AND FITNESS
> FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> +  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> FOR
> + ANY DIRECT,  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + CONSEQUENTIAL DAMAGES (INCLUDING,  BUT NOT LIMITED TO,
> PROCUREMENT OF
> + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  DATA, OR PROFITS; OR
> + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> LIABILITY,
> + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> NEGLIGENCE
> + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
> EVEN IF  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h> #include
> +<Library/UefiBootServicesTableLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/UefiLib.h>
> +#include <Protocol/FirmwareManagement.h> #include <Guid/EventGroup.h>
> +#include <Guid/SystemResourceTable.h>
> +
> +/*
> +  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 = NULL;
> +BOOLEAN                    mEsrtInstalled = FALSE;
> +EFI_EVENT                  mFmpInstallEvent;
> +VOID                       *mFmpInstallEventRegistration = NULL;
> +
> +/**
> +  Install EFI System Resource Table into the UEFI Configuration Table
> +
> +  @return  Status code.
> +
> +**/
> +EFI_STATUS
> +InstallEfiSystemResourceTableInUefiConfigurationTable (
> +   VOID
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  Status = EFI_SUCCESS;
> +  if (!mEsrtInstalled) {
> +    if (mTable == NULL) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table because it is
> NULL. \n"));
> +      Status = EFI_OUT_OF_RESOURCES;
> +    } else if (mTable->FwResourceCount == 0) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table because it
> has zero Entries. \n"));
> +      Status = EFI_UNSUPPORTED;
> +    } else {
> +      //
> +      // Install the pointer into config table
> +      //
> +      Status = gBS->InstallConfigurationTable (&gEfiSystemResourceTableGuid,
> mTable);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Can't install ESRT table.  Status: %r.
> \n", Status));
> +      } else {
> +        DEBUG ((DEBUG_INFO, "EsrtFmpDxe: Installed ESRT table. \n"));
> +        mEsrtInstalled = TRUE;
> +      }
> +    }
> +  }
> +  return Status;
> +}
> +
> +/**
> +  Return if this FMP is a system FMP or a device FMP, based upon
> FmpImageInfo.
> +
> +  @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  = PcdGetPtr (PcdSystemFmpCapsuleImageTypeIdGuid);
> +  Count = PcdGetSize (PcdSystemFmpCapsuleImageTypeIdGuid) /
> + sizeof(GUID);
> +
> +  for (Index = 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 = 0;
> +  Entry = NULL;
> +
> +  //
> +  // Get our ESRT table.  This should never be null at this point  //
> + if (mTable == NULL) {
> +    return EFI_DEVICE_ERROR;
> +  }
> +
> +  Entry = (EFI_SYSTEM_RESOURCE_ENTRY *)(mTable + 1);  //  // Make sure
> + Guid isn't already in the list  //  for (Index = 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 >= 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 ESRT
> table needed to grow after table already installed. \n"));
> +      return EFI_OUT_OF_RESOURCES;
> +    }
> +
> +    NewSize  = ((mTable->FwResourceCountMax + GROWTH_STEP) * sizeof
> (EFI_SYSTEM_RESOURCE_ENTRY)) + sizeof (EFI_SYSTEM_RESOURCE_TABLE);
> +    NewTable = AllocateRuntimeZeroPool (NewSize);
> +    if (NewTable == NULL) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory larger
> table 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 = NewTable->FwResourceCountMax +
> GROWTH_STEP;
> +    //
> +    // Free old table
> +    //
> +    FreePool (mTable);
> +    //
> +    // Reassign pointer to new table.
> +    //
> +    mTable = NewTable;
> +  }
> +
> +  //
> +  // ESRT table has enough room for the new entry so add new entry  //
> + Entry = (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)mTable) + sizeof
> + (EFI_SYSTEM_RESOURCE_TABLE));  //  // Move to the location of new
> + entry  //  Entry = 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
> Device.\n"));
> +    Entry->FwType = (UINT32)(ESRT_FW_TYPE_SYSTEMFIRMWARE);
> +  } else {
> +    Entry->FwType = (UINT32)(ESRT_FW_TYPE_DEVICEFIRMWARE);
> +  }
> +
> +  Entry->FwVersion = FmpImageInfoBuf->Version;
> + Entry->LowestSupportedFwVersion = 0;  Entry->CapsuleFlags = 0;
> + Entry->LastAttemptVersion = 0;  Entry->LastAttemptStatus = 0;
> +
> +  //
> +  // VERSION 2 has Lowest Supported
> +  //
> +  if (FmpVersion >= 2) {
> +    Entry->LowestSupportedFwVersion =
> + FmpImageInfoBuf->LowestSupportedImageVersion;
> +  }
> +
> +  //
> +  // VERSION 3 supports last attempt values  //  if (FmpVersion >= 3) {
> +    Entry->LastAttemptVersion = FmpImageInfoBuf->LastAttemptVersion;
> +    Entry->LastAttemptStatus = 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             = EFI_SUCCESS;
> +  Handle             = 0;
> +  BufferSize         = 0;
> +  PackageVersionName = NULL;
> +  FmpImageInfoBuf    = NULL;
> +  FmpImageInfoBufOrg = NULL;
> +  Fmp                = NULL;
> +
> +  DEBUG ((DEBUG_INFO, "FMP Installed Notify\n"));  while (TRUE) {
> +    BufferSize = sizeof (EFI_HANDLE);
> +    Status = gBS->LocateHandle (ByRegisterNotify, NULL,
> mFmpInstallEventRegistration, &BufferSize, &Handle);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_WARN, "EsrtFmpDxe: Failed to Locate handle from notify
> value. Status: %r\n", Status));
> +      return;
> +    }
> +
> +    Status = gBS->HandleProtocol (Handle,
> &gEfiFirmwareManagementProtocolGuid, (VOID **)&Fmp);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to get FMP for a handle
> 0x%x\n", Handle));
> +      continue;
> +    }
> +    ImageInfoSize = 0;
> +
> +    Status = 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 != EFI_BUFFER_TOO_SMALL) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Unexpected Failure in
> GetImageInfo.  Status = %r\n", Status));
> +      continue;
> +    }
> +
> +    FmpImageInfoBuf = NULL;
> +    FmpImageInfoBuf = AllocateZeroPool (ImageInfoSize);
> +    if (FmpImageInfoBuf == NULL) {
> +      DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to get memory for
> descriptors.\n"));
> +      continue;
> +    }
> +
> +    FmpImageInfoBufOrg = FmpImageInfoBuf;
> +    PackageVersionName = NULL;
> +    Status = 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
> = %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 otherwise
> ignore.
> +      //
> +      if ((FmpImageInfoBuf->AttributesSetting & FmpImageInfoBuf-
> >AttributesSupported & IMAGE_ATTRIBUTE_IN_USE) ==
> IMAGE_ATTRIBUTE_IN_USE) {
> +        //
> +        // Create ESRT entry
> +        //
> +        CreateEsrtEntry (FmpImageInfoBuf, FmpImageInfoDescriptorVer);
> +      }
> +      FmpImageInfoCount--;
> +      //
> +      // Increment the buffer pointer ahead by the size of the descriptor
> +      //
> +      FmpImageInfoBuf = (EFI_FIRMWARE_IMAGE_DESCRIPTOR *)(((UINT8
> *)FmpImageInfoBuf) + DescriptorSize);
> +    }
> +
> +    if (PackageVersionName != NULL) {
> +      FreePool (PackageVersionName);
> +      PackageVersionName = NULL;
> +    }
> +    if (FmpImageInfoBufOrg != NULL) {
> +      FreePool (FmpImageInfoBufOrg);
> +      FmpImageInfoBufOrg = NULL;
> +    }
> +  }
> +
> +CleanUp:
> +  if (FmpImageInfoBufOrg != NULL) {
> +    FreePool (FmpImageInfoBufOrg);
> +  }
> +  return;
> +}
> +
> +/**
> +  Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT. This
> +is used 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 = AllocateRuntimeZeroPool (
> +             (GROWTH_STEP * sizeof (EFI_SYSTEM_RESOURCE_ENTRY)) + sizeof
> (EFI_SYSTEM_RESOURCE_TABLE)
> +             );
> +  ASSERT (mTable != NULL);
> +  if (mTable == NULL) {
> +    DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to allocate memory for
> ESRT.\n"));
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  mTable->FwResourceCount    = 0;
> +  mTable->FwResourceCountMax = GROWTH_STEP;  mTable-
> >FwResourceVersion
> + = EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_VERSION;
> +
> +  //
> +  // Register notify function for all FMP installed  //
> + mFmpInstallEvent = EfiCreateProtocolNotifyEvent (
> +                       &gEfiFirmwareManagementProtocolGuid,
> +                       TPL_CALLBACK,
> +                       FmpInstallProtocolNotify,
> +                       NULL,
> +                       &mFmpInstallEventRegistration
> +                       );
> +
> +  ASSERT (mFmpInstallEvent != NULL);
> +
> +  if (mFmpInstallEvent == NULL) {
> +    DEBUG ((DEBUG_ERROR, "EsrtFmpDxe: Failed to Create Protocol Notify
> + Event for FMP.\n"));  }
> +
> +  //
> +  // Register notify function to install ESRT on ReadyToBoot Event.
> +  //
> +  Status = 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/MdeModulePkg/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.<BR>
> +
> +  All rights reserved.
> +  Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions are met:
> +  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
> + notice,  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 IMPLIED  WARRANTIES OF MERCHANTABILITY AND FITNESS
> FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> +  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> FOR
> + ANY DIRECT,  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + CONSEQUENTIAL DAMAGES (INCLUDING,  BUT NOT LIMITED TO,
> PROCUREMENT OF
> + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  DATA, OR PROFITS; OR
> + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
> LIABILITY,
> + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> NEGLIGENCE
> + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
> EVEN IF  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Protocol/FirmwareManagement.h> #include
> +<Guid/SystemResourceTable.h>
> +
> +/**
> +  Function to print a single ESRT Entry (ESRE) to the debug console
> +
> +  Print Format:
> +  | 00000000-0000-0000-0000-000000000000 | SSSSSSSSSSSS | 0x00000000 |
> + 0x00000000 | 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 == 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 = (EFI_SYSTEM_RESOURCE_ENTRY *)(((UINT8 *)Table) + sizeof
> + (EFI_SYSTEM_RESOURCE_TABLE));
> +
> +  //
> +  // Print ESRT table information
> +  //
> +  DEBUG ((DEBUG_INFO, "ESRT Table Information:\n"));  if (Table ==
> + 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 !=
> EFI_SYSTEM_RESOURCE_TABLE_FIRMWARE_RESOURCE_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 = 0; Index < Table->FwResourceCount; Index++) {
> +    PrintOutEsrtEntry (&(Entry[Index]));  }
> +
> +  DEBUG ((DEBUG_INFO,
> +"+--------------------------------------+--------------+------------"))
> +;
> +  DEBUG ((DEBUG_INFO,
> +"+------------+------------+------------+------------+\n"));
> +}
> +
> diff --git a/MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
> b/MdeModulePkg/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.<BR> # # All rights reserved.
> +# Redistribution and use in source and binary forms, with or without #
> +modification, are permitted provided that the following conditions are met:
> +# 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
> +notice, # 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 IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS
> FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
> FOR
> +ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> +CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO,
> PROCUREMENT OF
> +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR
> +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF #
> LIABILITY,
> +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> NEGLIGENCE #
> +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    = 0x00010005
> +  BASE_NAME      = EsrtFmpDxe
> +  FILE_GUID      = FF626DA9-17EE-4949-A8B8-B10FA0044E9F
> +  MODULE_TYPE    = UEFI_DRIVER
> +  VERSION_STRING = 1.0
> +  ENTRY_POINT    = EsrtFmpEntryPoint
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +#  VALID_ARCHITECTURES           = 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
> ##
> +CONSUMES
> +
> +[Guids]
> +  gEfiEventReadyToBootGuid     ## CONSUMES
> +  gEfiSystemResourceTableGuid  ## PRODUCES
> --
> 2.14.2.windows.3
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


  parent reply	other threads:[~2018-01-26  7:09 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-25 23:07 [Patch 0/3] MdeModulePkg/EsrtFmpDxe: Add EsrtFmpDxe module Kinney, Michael D
2018-01-25 23:07 ` [Patch 1/3] " Kinney, Michael D
2018-01-26  5:33   ` Zeng, Star
2018-02-01  0:58     ` Kinney, Michael D
2018-01-26  7:15   ` Ni, Ruiyu [this message]
2018-01-31 23:48     ` Kinney, Michael D
2018-01-25 23:07 ` [Patch 2/3] QuarkPlatformPkg: Switch from EsrtDxe to EsrtFmpDxe Kinney, Michael D
2018-01-25 23:07 ` [Patch 3/3] Vlv2TbltDevicePkg: " Kinney, Michael D

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=734D49CCEBEEF84792F5B80ED585239D5BB5BB6D@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox