[This patch is updated from v1 to defer publication of the decompression and 
extraction PPIs
until after permanent memory is installed.  Tested for normal boots and our 
temporary
memory S3 resume path.]

This enable S3 resume from temporary memory.  The normal boot path
still enforces the permanent memory requirement.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eugene Cohen <[email protected]>
---
 MdeModulePkg/Core/DxeIplPeim/DxeIpl.h   | 13 ++++++
 MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf |  3 +-
 MdeModulePkg/Core/DxeIplPeim/DxeLoad.c  | 83 ++++++++++++++++++++++++++-------
 MdeModulePkg/Core/Pei/PeiMain/PeiMain.c |  6 ++-
 4 files changed, 84 insertions(+), 21 deletions(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h 
b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
index 75372ac..50c73cb 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.h
@@ -58,6 +58,19 @@ 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.
+
+   @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_FILE_HANDLE  FileHandle,
+  IN CONST EFI_PEI_SERVICES     **PeiServices
+  );
 
 /**
    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 04ad928..9623f96 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
@@ -93,6 +93,7 @@
   ## SOMETIMES_CONSUMES
   ## UNDEFINED # HOB
   gEfiVectorHandoffInfoPpiGuid
+  gEfiPeiMemoryDiscoveredPpiGuid    ## SOMETIMES_CONSUMES # Consumed on normal 
path
 
 [Guids]
   ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation"
@@ -115,7 +116,7 @@
   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 d7d693f..0cc6e37 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeLoad.c
@@ -2,6 +2,7 @@
   Last PEIM.
   Responsibility of this module is to load the DXE Core from a Firmware Volume.
 
+Copyright (c) 2015 HP Development Company, L.P.
 Copyright (c) 2006 - 2012, 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
@@ -32,16 +33,19 @@ CONST EFI_PEI_DECOMPRESS_PPI mDecompressPpi = {
   Decompress
 };
 
-CONST EFI_PEI_PPI_DESCRIPTOR mPpiList[] = {
+CONST EFI_PEI_PPI_DESCRIPTOR mDxeIplPpiList[] = {
   {
-    EFI_PEI_PPI_DESCRIPTOR_PPI,
+    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
     &gEfiDxeIplPpiGuid,
-    (VOID *) &mDxeIplPpi
-  },
+    (VOID *)&mDxeIplPpi
+  }
+};
+
+CONST EFI_PEI_PPI_DESCRIPTOR mDecompressPpiList[] = {
   {
     (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
     &gEfiPeiDecompressPpiGuid,
-    (VOID *) &mDecompressPpi
+    (VOID *)&mDecompressPpi
   }
 };
 
@@ -73,9 +77,6 @@ PeimInitializeDxeIpl (
 {
   EFI_STATUS                                Status;
   EFI_BOOT_MODE                             BootMode;
-  EFI_GUID                                  *ExtractHandlerGuidTable;
-  UINTN                                     ExtractHandlerNumber;
-  EFI_PEI_PPI_DESCRIPTOR                    *GuidPpi;
   
   BootMode = GetBootModeHob ();
 
@@ -92,32 +93,67 @@ PeimInitializeDxeIpl (
     // Ensure that DXE IPL is shadowed to permanent memory.
     //
     ASSERT (Status == EFI_ALREADY_STARTED);
+
+    //
+    // Now that permanent memory exists, install the PPIs for decompression
+    // and section extraction.
+    //
+    InstallIplPermanentMemoryPpis (FileHandle, PeiServices);
   }
      
   //
+  // Install DxeIpl PPI.
+  //
+  Status = PeiServicesInstallPpi(mDxeIplPpiList);
+  ASSERT_EFI_ERROR(Status);
+
+  return Status;
+}
+
+
+/**
+   This function installs the PPIs that require permanent memory.
+
+   @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_FILE_HANDLE  FileHandle,
+  IN CONST EFI_PEI_SERVICES     **PeiServices
+  )
+{
+  EFI_STATUS                                Status;
+  EFI_GUID                                  *ExtractHandlerGuidTable;
+  UINTN                                     ExtractHandlerNumber;
+  EFI_PEI_PPI_DESCRIPTOR                    *GuidPpi;
+
+  //
   // Get custom extract guided section method guid list 
   //
-  ExtractHandlerNumber = ExtractGuidedSectionGetGuidList 
(&ExtractHandlerGuidTable);
-  
+  ExtractHandlerNumber = 
ExtractGuidedSectionGetGuidList(&ExtractHandlerGuidTable);
+
   //
   // Install custom extraction guid PPI
   //
   if (ExtractHandlerNumber > 0) {
-    GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *) AllocatePool (ExtractHandlerNumber * 
sizeof (EFI_PEI_PPI_DESCRIPTOR));
-    ASSERT (GuidPpi != NULL);
+    GuidPpi = (EFI_PEI_PPI_DESCRIPTOR *)AllocatePool(ExtractHandlerNumber * 
sizeof (EFI_PEI_PPI_DESCRIPTOR));
+    ASSERT(GuidPpi != NULL);
     while (ExtractHandlerNumber-- > 0) {
       GuidPpi->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | 
EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
-      GuidPpi->Ppi   = (VOID *) &mCustomGuidedSectionExtractionPpi;
-      GuidPpi->Guid  = &ExtractHandlerGuidTable[ExtractHandlerNumber];
-      Status = PeiServicesInstallPpi (GuidPpi++);
+      GuidPpi->Ppi = (VOID *)&mCustomGuidedSectionExtractionPpi;
+      GuidPpi->Guid = &ExtractHandlerGuidTable[ExtractHandlerNumber];
+      Status = PeiServicesInstallPpi(GuidPpi++);
       ASSERT_EFI_ERROR(Status);
     }
   }
-  
+
   //
-  // Install DxeIpl and Decompress PPIs.
+  // Install Decompress PPIs.
   //
-  Status = PeiServicesInstallPpi (mPpiList);
+  Status = PeiServicesInstallPpi(mDecompressPpiList);
   ASSERT_EFI_ERROR(Status);
 
   return Status;
@@ -193,6 +229,7 @@ DxeLoadCore (
   )
 {
   EFI_STATUS                                Status;
+  VOID                                      *Dummy;
   EFI_FV_FILE_INFO                          DxeCoreFileInfo;
   EFI_PHYSICAL_ADDRESS                      DxeCoreAddress;
   UINT64                                    DxeCoreSize;
@@ -273,6 +310,16 @@ DxeLoadCore (
     //
   }
 
+  // DXE core load requires permanent memory
+  Status = PeiServicesLocatePpi (
+             &gEfiPeiMemoryDiscoveredPpiGuid,
+             0,
+             NULL,
+             (VOID **)&Dummy
+             );
+  ASSERT_EFI_ERROR (Status);
+  if( EFI_ERROR(Status)) return Status;
+
   if (GetFirstGuidHob ((CONST EFI_GUID *)&gEfiMemoryTypeInformationGuid) == 
NULL) {
     //
     // Don't build GuidHob if GuidHob has been installed.
diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c 
b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
index d36f89c..8f2dfa3 100644
--- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
+++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
@@ -421,9 +421,11 @@ PeiCore (
   PeiDispatcher (SecCoreData, &PrivateData);
 
   //
-  // Check if InstallPeiMemory service was called.
+  // If we're not doing S3 resume then we require permanent memory
   //
-  ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
+  if(PrivateData.HobList.HandoffInformationTable->BootMode != 
BOOT_ON_S3_RESUME) {
+    ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
+  }
 
   //
   // Measure PEI Core execution time.
-- 
1.9.5.msysgit.0

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

Reply via email to