Re: [edk2] [PATCH] MdeModulePkg PeiCore: PEI dispatcher need retry to process NOT_DISPATCHED FV

2015-11-12 Thread Gao, Liming
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, >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] [PATCH] MdeModulePkg PeiCore: PEI dispatcher need retry to process NOT_DISPATCHED FV

2015-11-11 Thread Star Zeng
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, >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

2015-11-11 Thread Cohen, Eugene
Good catch.

Reviewed-by: Eugene Cohen <eug...@hp.com>


-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 <liming@intel.com>
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 <liming@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.z...@intel.com>
---
 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, >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