From 1bd90a4c479759542f86dbac953855552cbb31fa Mon Sep 17 00:00:00 2001 From: klu2 Date: Tue, 12 Aug 2008 03:27:57 +0000 Subject: [PATCH] Add PeimDispatcherReenter to fix bug of PeiDispatch can not be quit correctly. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5628 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 19 ++++++++++++++++--- MdeModulePkg/Core/Pei/PeiMain.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c index 1ea443f6ef..3463987149 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -335,7 +335,16 @@ PeiDispatcher ( // satisfied, this dipatcher should run only once. // do { - + // + // In case that reenter PeiCore happens, the last pass record is still available. + // + if (!Private->PeimDispatcherReenter) { + Private->PeimNeedingDispatch = FALSE; + Private->PeimDispatchOnThisPass = FALSE; + } else { + Private->PeimDispatcherReenter = FALSE; + } + for (FvCount = Private->CurrentPeimFvCount; FvCount < Private->FvCount; FvCount++) { Private->CurrentPeimFvCount = FvCount; VolumeHandle = Private->Fv[FvCount].FvHeader; @@ -581,6 +590,11 @@ PeiDispatcher ( // PrivateInMem->PeiMemoryInstalled = TRUE; + // + // Indicate that PeiCore reenter + // + Private->PeimDispatcherReenter = TRUE; + // // Shadow PEI Core. When permanent memory is avaiable, shadow // PEI Core and PEIMs to get high performance. @@ -689,8 +703,7 @@ InitializeDispatcherData ( ) { if (OldCoreData == NULL) { - PrivateData->PeimNeedingDispatch = FALSE; - PrivateData->PeimDispatchOnThisPass = FALSE; + PrivateData->PeimDispatcherReenter = FALSE; PeiInitializeFv (PrivateData, SecCoreData); } diff --git a/MdeModulePkg/Core/Pei/PeiMain.h b/MdeModulePkg/Core/Pei/PeiMain.h index c6dd03dd21..0524d95636 100644 --- a/MdeModulePkg/Core/Pei/PeiMain.h +++ b/MdeModulePkg/Core/Pei/PeiMain.h @@ -139,6 +139,7 @@ typedef struct{ EFI_PEI_FILE_HANDLE CurrentFileHandle; BOOLEAN PeimNeedingDispatch; BOOLEAN PeimDispatchOnThisPass; + BOOLEAN PeimDispatcherReenter; UINTN AllFvCount; EFI_PEI_FV_HANDLE AllFv[FixedPcdGet32 (PcdPeiCoreMaxFvSupported)]; EFI_PEI_HOB_POINTERS HobList;