From 116cd8563cd51a96785936b57b44aa08e217bd9c Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Fri, 13 Nov 2015 02:43:37 +0000 Subject: MdeModulePkg PeiCore: PEI dispatcher need retry to process NOT_DISPATCHED FV A corner case like below will cause a NOT_DISPATCHED FV has no opportunity to be dispatched. 1. FV_RECOVERY has SecCore, PeiCore and some other PEI modules, a module will report FVMAIN_COMPACT and FV_RECOVERY2 in sequence. 2. FVMAIN_COMPACT has a FV image file with GUIDED FV image section in it. 3. FV_RECOVERY2 has DxeIpl and other PEI modules, the DxeIpl will install SectionExtractionPpi If ALL the PEIMs in FV_RECOVERY and FV_RECOVERY2 have DEPEX satisfied and executed in one loop, PeimNeedingDispatch will be always FALSE, FVMAIN_COMPACT will have no opportunity to be decompressed and dispatched as DxeIpl executes after the first processing to FVMAIN_COMPACT. The patch is to set PeimNeedingDispatch to TRUE when ProcessFvFile() not successfully, then the NOT_DISPATCHED FV could have another opportunity to be processed. Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng Reviewed-by: Eugene Cohen Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18781 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'MdeModulePkg/Core') diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index 7480b662c5..e7e795d123 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -1056,7 +1056,7 @@ PeiDispatcher ( ASSERT_EFI_ERROR (Status); if (FvFileInfo.FileType == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) { // - // For Fv type file, Produce new FV PPI and FV hob + // For Fv type file, Produce new FvInfo PPI and FV hob // Status = ProcessFvFile (Private, &Private->Fv[FvCount], PeimFileHandle); if (Status == EFI_SUCCESS) { @@ -1065,6 +1065,13 @@ PeiDispatcher ( // Private->Fv[FvCount].PeimState[PeimCount]++; Private->PeimDispatchOnThisPass = TRUE; + } else { + // + // The related GuidedSectionExtraction/Decompress PPI for the + // encapsulated FV image section may be installed in the rest + // of this do-while loop, so need to make another pass. + // + Private->PeimNeedingDispatch = TRUE; } } else { // @@ -1192,11 +1199,11 @@ PeiDispatcher ( Private->CurrentPeimFvCount = 0; // - // PeimNeedingDispatch being TRUE means we found a PEIM that did not get + // PeimNeedingDispatch being TRUE means we found a PEIM/FV that did not get // dispatched. So we need to make another pass // - // PeimDispatchOnThisPass being TRUE means we dispatched a PEIM on this - // pass. If we did not dispatch a PEIM there is no point in trying again + // PeimDispatchOnThisPass being TRUE means we dispatched a PEIM/FV on this + // pass. If we did not dispatch a PEIM/FV there is no point in trying again // as it will fail the next time too (nothing has changed). // } while (Private->PeimNeedingDispatch && Private->PeimDispatchOnThisPass); -- cgit v1.2.3