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

Reply via email to