Reviewed-by: Liming Gao <[email protected]>

> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, May 27, 2016 5:42 PM
> To: [email protected]
> Cc: Cohen, Eugene <[email protected]>; Gao, Liming <[email protected]>
> Subject: [PATCH V3] MdeModulePkg: Allow DxeIpl to load without
> permanent memory
> 
> From: "Cohen, Eugene" <[email protected]>
> 
> PI1.4a spec added "For S3 resume boot modes DXE IPL must be
> prepared to execute without permanent memory installed and
> invoke the S3 resume modules."
> 
> To follow PI1.4a spec, this patch is to update DxeIpl and
> PeiCore to enable S3 resume from temporary memory.
> The normal boot path still enforces the permanent memory
> requirement.
> 
> V3:
> The V3 patch is developed based on the discussion at
> http://article.gmane.org/gmane.comp.bios.edk2.devel/5606,
> it installs custom guided section extraction guid PPI and
> decompression PPI on S3 resume boot path in memory discovered
> PPI notification.
> 
> Cc: Liming Gao <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Eugene Cohen <[email protected]>
> Signed-off-by: Star Zeng <[email protected]>
> Tested-by: Katie Dellaquila <[email protected]>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.h   |  18 +++++
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf |   3 +-
>  MdeModulePkg/Core/DxeIplPeim/DxeLoad.c  | 115
> +++++++++++++++++++++++++-------
>  MdeModulePkg/Core/Pei/PeiMain/PeiMain.c |  10 +--
>  4 files changed, 116 insertions(+), 30 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> index 75372ace8dd6..30e24bc85087 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
> @@ -58,6 +58,24 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
>  //
>  extern CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi;
> 
> +/**
> +   This function installs the PPIs that require permanent memory.
> +
> +   @param  PeiServices      Indirect reference to the PEI Services Table.
> +   @param  NotifyDescriptor Address of the notification descriptor data
> structure.
> +   @param  Ppi              Address of the PPI that was installed.
> +
> +   @return EFI_SUCCESS      The PPIs were installed successfully.
> +   @return Others           Some error occurs during the execution of this
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InstallIplPermanentMemoryPpis (
> +  IN EFI_PEI_SERVICES           **PeiServices,
> +  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
> +  IN VOID                       *Ppi
> +  );
> 
>  /**
>     Searches DxeCore in all firmware Volumes and loads the first
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 04ad928c9f84..0e9badf81808 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -93,6 +93,7 @@ [Ppis]
>    ## SOMETIMES_CONSUMES
>    ## UNDEFINED # HOB
>    gEfiVectorHandoffInfoPpiGuid
> +  gEfiPeiMemoryDiscoveredPpiGuid    ## SOMETIMES_CONSUMES
> 
>  [Guids]
>    ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"
> @@ -115,7 +116,7 @@ [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> 
>  [Depex]
> -  gEfiPeiMemoryDiscoveredPpiGuid AND gEfiPeiLoadFilePpiGuid AND
> gEfiPeiMasterBootModePpiGuid
> +  gEfiPeiLoadFilePpiGuid AND gEfiPeiMasterBootModePpiGuid
> 
>  #
>  # [BootMode]
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> index d7d693fdeb40..50b5440d1503 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
> @@ -2,7 +2,8 @@
>    Last PEIM.
>    Responsibility of this module is to load the DXE Core from a Firmware
> Volume.
> 
> -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2016 HP Development Company, L.P.
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>  This program and the accompanying materials
>  are licensed and made available under the terms and conditions of the BSD
> License
>  which accompanies this distribution.  The full text of the license may be
> found at
> @@ -24,6 +25,12 @@ CONST EFI_DXE_IPL_PPI mDxeIplPpi = {
>    DxeLoadCore
>  };
> 
> +CONST EFI_PEI_PPI_DESCRIPTOR mDxeIplPpiList = {
> +  EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> +  &gEfiDxeIplPpiGuid,
> +  (VOID *) &mDxeIplPpi
> +};
> +
>  CONST EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
> mCustomGuidedSectionExtractionPpi = {
>    CustomGuidedSectionExtract
>  };
> @@ -32,17 +39,10 @@ CONST EFI_PEI_DECOMPRESS_PPI mDecompressPpi
> = {
>    Decompress
>  };
> 
> -CONST EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {
> -  {
> -    EFI_PEI_PPI_DESCRIPTOR_PPI,
> -    &gEfiDxeIplPpiGuid,
> -    (VOID *) &mDxeIplPpi
> -  },
> -  {
> -    (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> -    &gEfiPeiDecompressPpiGuid,
> -    (VOID *) &mDecompressPpi
> -  }
> +CONST EFI_PEI_PPI_DESCRIPTOR mDecompressPpiList = {
> +  (EFI_PEI_PPI_DESCRIPTOR_PPI |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> +  &gEfiPeiDecompressPpiGuid,
> +  (VOID *) &mDecompressPpi
>  };
> 
>  CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = {
> @@ -51,10 +51,16 @@ CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi
> = {
>    NULL
>  };
> 
> +CONST EFI_PEI_NOTIFY_DESCRIPTOR mMemoryDiscoveredNotifyList = {
> +  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_DISPATCH |
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
> +  &gEfiPeiMemoryDiscoveredPpiGuid,
> +  InstallIplPermanentMemoryPpis
> +};
> +
>  /**
>    Entry point of DXE IPL PEIM.
> -
> -  This function installs DXE IPL PPI and Decompress PPI.  It also reloads
> +
> +  This function installs DXE IPL PPI.  It also reloads
>    itself to memory on non-S3 resume boot path.
> 
>    @param  FileHandle  Handle of the file being invoked.
> @@ -73,10 +79,8 @@ PeimInitializeDxeIpl (
>  {
>    EFI_STATUS                                Status;
>    EFI_BOOT_MODE                             BootMode;
> -  EFI_GUID                                  *ExtractHandlerGuidTable;
> -  UINTN                                     ExtractHandlerNumber;
> -  EFI_PEI_PPI_DESCRIPTOR                    *GuidPpi;
> -
> +  VOID                                      *Dummy;
> +
>    BootMode = GetBootModeHob ();
> 
>    if (BootMode != BOOT_ON_S3_RESUME) {
> @@ -87,20 +91,81 @@ PeimInitializeDxeIpl (
>        //
>        return Status;
>      }
> -
> +
>      //
>      // Ensure that DXE IPL is shadowed to permanent memory.
>      //
>      ASSERT (Status == EFI_ALREADY_STARTED);
> +
> +    //
> +    // DXE core load requires permanent memory.
> +    //
> +    Status = PeiServicesLocatePpi (
> +               &gEfiPeiMemoryDiscoveredPpiGuid,
> +               0,
> +               NULL,
> +               (VOID **) &Dummy
> +               );
> +    ASSERT_EFI_ERROR (Status);
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +
> +    //
> +    // Now the permanent memory exists, install the PPIs for decompression
> +    // and section extraction.
> +    //
> +    Status = InstallIplPermanentMemoryPpis (NULL, NULL, NULL);
> +    ASSERT_EFI_ERROR (Status);
> +  } else {
> +    //
> +    // Install memory discovered PPI notification to install PPIs for
> +    // decompression and section extraction.
> +    //
> +    Status = PeiServicesNotifyPpi (&mMemoryDiscoveredNotifyList);
> +    ASSERT_EFI_ERROR (Status);
>    }
> -
> +
> +  //
> +  // Install DxeIpl PPI.
> +  //
> +  Status = PeiServicesInstallPpi (&mDxeIplPpiList);
> +  ASSERT_EFI_ERROR(Status);
> +
> +  return Status;
> +}
> +
> +/**
> +   This function installs the PPIs that require permanent memory.
> +
> +   @param  PeiServices      Indirect reference to the PEI Services Table.
> +   @param  NotifyDescriptor Address of the notification descriptor data
> structure.
> +   @param  Ppi              Address of the PPI that was installed.
> +
> +   @return EFI_SUCCESS      The PPIs were installed successfully.
> +   @return Others           Some error occurs during the execution of this
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +InstallIplPermanentMemoryPpis (
> +  IN EFI_PEI_SERVICES           **PeiServices,
> +  IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
> +  IN VOID                       *Ppi
> +  )
> +{
> +  EFI_STATUS                    Status;
> +  EFI_GUID                      *ExtractHandlerGuidTable;
> +  UINTN                         ExtractHandlerNumber;
> +  EFI_PEI_PPI_DESCRIPTOR        *GuidPpi;
> +
>    //
>    // Get custom extract guided section method guid list
>    //
>    ExtractHandlerNumber = ExtractGuidedSectionGetGuidList
> (&ExtractHandlerGuidTable);
> -
> +
>    //
> -  // Install custom extraction guid PPI
> +  // Install custom guided section extraction PPI
>    //
>    if (ExtractHandlerNumber > 0) {
>      GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool
> (ExtractHandlerNumber * sizeof (EFI_PEI_PPI_DESCRIPTOR));
> @@ -113,11 +178,11 @@ PeimInitializeDxeIpl (
>        ASSERT_EFI_ERROR(Status);
>      }
>    }
> -
> +
>    //
> -  // Install DxeIpl and Decompress PPIs.
> +  // Install Decompress PPI.
>    //
> -  Status = PeiServicesInstallPpi (mPpiList);
> +  Status = PeiServicesInstallPpi (&mDecompressPpiList);
>    ASSERT_EFI_ERROR(Status);
> 
>    return Status;
> diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> index d36f89c3dd0d..09b16492fe94 100644
> --- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> +++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
> @@ -420,10 +420,12 @@ PeiCore (
>    //
>    PeiDispatcher (SecCoreData, &PrivateData);
> 
> -  //
> -  // Check if InstallPeiMemory service was called.
> -  //
> -  ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
> +  if (PrivateData.HobList.HandoffInformationTable->BootMode !=
> BOOT_ON_S3_RESUME) {
> +    //
> +    // Check if InstallPeiMemory service was called on non-S3 resume boot
> path.
> +    //
> +    ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
> +  }
> 
>    //
>    // Measure PEI Core execution time.
> --
> 2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to