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

