[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

