Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- UefiCpuPkg/CpuDxe/CpuMp.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 1759f16..1ef1cf3 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -1227,6 +1227,7 @@ CheckAllAPsStatus ( { CPU_DATA_BLOCK *CpuData; UINTN Number; + EFI_STATUS Status; if (mMpSystemData.TimeoutActive) { mMpSystemData.Timeout -= gPollInterval; @@ -1236,6 +1237,16 @@ CheckAllAPsStatus ( return; } + // + // avoid next timer enter. + // + Status = gBS->SetTimer ( + mMpSystemData.CheckAllAPsEvent, + TimerCancel, + 0 + ); + ASSERT_EFI_ERROR (Status); + if (mMpSystemData.WaitEvent != NULL) { CheckAndUpdateAllAPsToIdleState (); // @@ -1250,13 +1261,15 @@ CheckAllAPsStatus ( } if (mMpSystemData.FinishCount != mMpSystemData.StartCount) { - return; + goto EXIT; } mMpSystemData.TimeoutActive = FALSE; gBS->SignalEvent (mMpSystemData.WaitEvent); mMpSystemData.WaitEvent = NULL; mStopCheckAllAPsStatus = TRUE; + + goto EXIT; } // @@ -1282,6 +1295,14 @@ CheckAllAPsStatus ( CheckThisAPStatus (NULL, (VOID *)CpuData); } } + +EXIT: + Status = gBS->SetTimer ( + mMpSystemData.CheckAllAPsEvent, + TimerPeriodic, + EFI_TIMER_PERIOD_MICROSECONDS (100) + ); + ASSERT_EFI_ERROR (Status); } /** -- 1.9.3 ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel