public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
	"Dong, Eric" <eric.dong@intel.com>,
	"Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [Patch 1/3] MdeModulePkg/EsrtFmpDxe: Add EsrtFmpDxe module
Date: Thu, 1 Feb 2018 00:58:36 +0000	[thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5B895C494@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103BA13CE6@shsmsx102.ccr.corp.intel.com>

Star,

Thanks for the feedback.  I agree with all comments.

I will send V2 soon.

Mike

> -----Original Message-----
> From: Zeng, Star
> Sent: Thursday, January 25, 2018 9:33 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; 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: RE: [edk2] [Patch 1/3] MdeModulePkg/EsrtFmpDxe:
> Add EsrtFmpDxe module
> 
> Hi Mike,
> 
> Some MINOR comments at my first sight.
> 
> 1. Should *.uni and *Extra.uni be added for this module?
> 2. Could EfiCreateEventReadyToBootEx() be used instead of
> below code? Then gEfiEventReadyToBootGuid reference in
> *.inf could be also removed.
> 
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  EsrtReadyToBootEventNotify,
> +                  NULL,
> +                  &gEfiEventReadyToBootGuid,
> +                  &mEsrtReadyToBootEvent
> +                  );
> 
> 3. Is it better to have the MODULE_TYPE to be DXE_DRIVER?
> 
> +  MODULE_TYPE    = UEFI_DRIVER
> 
> 
> Thanks,
> Star
> -----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/MsCapsule
> Support
> 
> 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/FvSimpleFile
> SystemDxe.inf
>    MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> +  MdeModulePkg/Universal/EsrtFmpDxe/EsrtFmpDxe.inf
> 
> 
> MdeModulePkg/Universal/PropertiesTableAttributesDxe/Prope
> rtiesTableAttributesDxe.inf
> 
> MdeModulePkg/Universal/FileExplorerDxe/FileExplorerDxe.in
> f  { 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.PcdSystemFmpCapsuleImageTy
> peIdGuid  ##
> +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


  reply	other threads:[~2018-02-01  0:53 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 [this message]
2018-01-26  7:15   ` Ni, Ruiyu
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=E92EE9817A31E24EB0585FDF735412F5B895C494@ORSMSX113.amr.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