[edk2] [PATCH] 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 --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 15 +++ 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index 7480b66..e7e795d 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); -- 1.9.5.msysgit.0 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] MdeModulePkg PeiCore: PEI dispatcher need retry to process NOT_DISPATCHED FV
Good catch. Reviewed-by: Eugene Cohen -Original Message- From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Star Zeng Sent: Wednesday, November 11, 2015 3:07 AM To: edk2-devel@lists.01.org Cc: Liming Gao Subject: [edk2] [PATCH] 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 --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 15 +++ 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index 7480b66..e7e795d 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); -- 1.9.5.msysgit.0 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] MdeModulePkg PeiCore: PEI dispatcher need retry to process NOT_DISPATCHED FV
Reviewed-by: Liming Gao > -Original Message- > From: Zeng, Star > Sent: Wednesday, November 11, 2015 6:07 PM > To: edk2-devel@lists.01.org > Cc: Gao, Liming > Subject: [PATCH] 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 > --- > MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 15 +++ > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c > index 7480b66..e7e795d 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); > -- > 1.9.5.msysgit.0 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel