Jiewen,

One typo in a comment noted below.  With that fix:

Reviewed-by: Michael Kinney <michael.d.kin...@intel.com>

Mike

> -----Original Message-----
> From: Yao, Jiewen
> Sent: Tuesday, November 24, 2015 12:21 AM
> To: edk2-de...@ml01.01.org
> Cc: Yao, Jiewen <jiewen....@intel.com>; Zeng, Star <star.z...@intel.com>; 
> Fan, Jeff <jeff....@intel.com>; Kinney, Michael D
> <michael.d.kin...@intel.com>
> Subject: [patch] MdeModulePkg/PiSmmCore: Install LoadedImage protocol.
> 
> PiSmmCore installs LoadedImage for each SMM driver. However itself is missing.
> So we follow DxeCore style, let PiSmmCore installs LoadedImage protocol for 
> itself,
> then the SMM image information is complete.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: "Yao, Jiewen" <jiewen....@intel.com>
> Cc: "Zeng, Star" <star.z...@intel.com>
> Cc: "Fan, Jeff" <jeff....@intel.com>
> Cc: "Kinney, Michael D" <michael.d.kin...@intel.com>
> ---
>  MdeModulePkg/Core/PiSmmCore/Dispatcher.c | 33 +++++++++++++++++++--
>  MdeModulePkg/Core/PiSmmCore/PiSmmCore.c  | 49 
> ++++++++++++++++++++++++++++++++
>  MdeModulePkg/Core/PiSmmCore/PiSmmCore.h  |  2 ++
>  3 files changed, 82 insertions(+), 2 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c 
> b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
> index cbaf549..e7e2e86 100644
> --- a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
> +++ b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c
> @@ -103,7 +103,8 @@ BOOLEAN  gRequestDispatch = FALSE;
>  //
>  EFI_FV_FILETYPE mSmmFileTypes[] = {
>    EFI_FV_FILETYPE_SMM,
> -  EFI_FV_FILETYPE_COMBINED_SMM_DXE
> +  EFI_FV_FILETYPE_COMBINED_SMM_DXE,
> +  EFI_FV_FILETYPE_SMM_CORE,
>    //
>    // Note: DXE core will process the FV image file, so skip it in SMM core
>    // EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
> @@ -1283,6 +1284,7 @@ SmmDriverDispatchHandler (
>      //
>      // Discover Drivers in FV and add them to the Discovered Driver List.
>      // Process EFI_FV_FILETYPE_SMM type and then 
> EFI_FV_FILETYPE_COMBINED_SMM_DXE
> +    //  EFI_FV_FILETYPE_SMM_CORE is processed to produce a Loaded Image 
> protocol for the core
>      //
>      for (SmmTypeIndex = 0; SmmTypeIndex < sizeof (mSmmFileTypes)/sizeof 
> (EFI_FV_FILETYPE); SmmTypeIndex++) {
>        //
> @@ -1300,7 +1302,34 @@ SmmDriverDispatchHandler (
>                                    &Size
>                                    );
>          if (!EFI_ERROR (GetNextFileStatus)) {
> -          SmmAddToDriverList (Fv, FvHandle, &NameGuid);
> +          if (Type == EFI_FV_FILETYPE_SMM_CORE) {
> +            //
> +            // If this is the SMM core fill in it's DevicePath & DeviceHandle
> +            //
> +            if (mSmmCoreLoadedImage->FilePath == NULL) {
> +              //
> +              // Maybe One specail Fv cantains only one SMM_CORE module, so 
> its device path must

Typos in comment.  Should be:

// Maybe one special FV contains only one SMM_CORE module, so its device path 
must

> +              // be initialized completely.
> +              //
> +              EfiInitializeFwVolDevicepathNode (&mFvDevicePath.File, 
> &NameGuid);
> +              SetDevicePathEndNode (&mFvDevicePath.End);
> +
> +              //
> +              // Make an EfiBootServicesData buffer copy of FilePath
> +              //
> +              Status = gBS->AllocatePool (
> +                              EfiBootServicesData,
> +                              GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL 
> *)&mFvDevicePath),
> +                              (VOID **)&mSmmCoreLoadedImage->FilePath
> +                              );
> +              ASSERT_EFI_ERROR (Status);
> +              CopyMem (mSmmCoreLoadedImage->FilePath, &mFvDevicePath, 
> GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL
> *)&mFvDevicePath));
> +
> +              mSmmCoreLoadedImage->DeviceHandle = FvHandle;
> +            }
> +          } else {
> +            SmmAddToDriverList (Fv, FvHandle, &NameGuid);
> +          }
>          }
>        } while (!EFI_ERROR (GetNextFileStatus));
>      }
> diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c 
> b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
> index cc7ccec..7245f20 100644
> --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
> +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
> @@ -87,6 +87,8 @@ SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = {
>  UINTN                           mFullSmramRangeCount;
>  EFI_SMRAM_DESCRIPTOR            *mFullSmramRanges;
> 
> +EFI_LOADED_IMAGE_PROTOCOL       *mSmmCoreLoadedImage;
> +
>  /**
>    Place holder function until all the SMM System Table Service are available.
> 
> @@ -521,6 +523,51 @@ SmmEntryPoint (
>  }
> 
>  /**
> +  Install LoadedImage protocol for SMM Core.
> +**/
> +VOID
> +SmmCoreInstallLoadedImage (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                 Status;
> +  EFI_HANDLE                 Handle;
> +
> +  //
> +  // Allocate a Loaded Image Protocol in EfiBootServicesData
> +  //
> +  Status = gBS->AllocatePool (EfiBootServicesData, 
> sizeof(EFI_LOADED_IMAGE_PROTOCOL), (VOID **)&mSmmCoreLoadedImage);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  ZeroMem (mSmmCoreLoadedImage, sizeof (EFI_LOADED_IMAGE_PROTOCOL));
> +  //
> +  // Fill in the remaining fields of the Loaded Image Protocol instance.
> +  // Note: ImageBase is an SMRAM address that can not be accessed outside of 
> SMRAM if SMRAM window is closed.
> +  //
> +  mSmmCoreLoadedImage->Revision      = EFI_LOADED_IMAGE_PROTOCOL_REVISION;
> +  mSmmCoreLoadedImage->ParentHandle  = gSmmCorePrivate->SmmIplImageHandle;
> +  mSmmCoreLoadedImage->SystemTable   = gST;
> +
> +  mSmmCoreLoadedImage->ImageBase     = (VOID 
> *)(UINTN)gSmmCorePrivate->PiSmmCoreImageBase;
> +  mSmmCoreLoadedImage->ImageSize     = gSmmCorePrivate->PiSmmCoreImageSize;
> +  mSmmCoreLoadedImage->ImageCodeType = EfiRuntimeServicesCode;
> +  mSmmCoreLoadedImage->ImageDataType = EfiRuntimeServicesData;
> +
> +  //
> +  // Create a new image handle in the UEFI handle database for the SMM Driver
> +  //
> +  Handle = NULL;
> +  Status = gBS->InstallMultipleProtocolInterfaces (
> +                  &Handle,
> +                  &gEfiLoadedImageProtocolGuid, mSmmCoreLoadedImage,
> +                  NULL
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  return ;
> +}
> +
> +/**
>    The Entry Point for SMM Core
> 
>    Install DXE Protocols and reload SMM Core into SMRAM and register SMM Core
> @@ -586,5 +633,7 @@ SmmMain (
> 
>    RegisterSmramProfileHandler ();
> 
> +  SmmCoreInstallLoadedImage ();
> +
>    return EFI_SUCCESS;
>  }
> diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h 
> b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h
> index e34bd8a..0e9c92a 100644
> --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h
> +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h
> @@ -959,6 +959,8 @@ SmramProfileReadyToLock (
>  extern UINTN                    mFullSmramRangeCount;
>  extern EFI_SMRAM_DESCRIPTOR     *mFullSmramRanges;
> 
> +extern EFI_LOADED_IMAGE_PROTOCOL  *mSmmCoreLoadedImage;
> +
>  //
>  // Page management
>  //
> --
> 1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to