]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
UefiCpuPkg: Extend SMM CPU Service with rendezvous support.
[mirror_edk2.git] / UefiCpuPkg / PiSmmCpuDxeSmm / MpService.c
index 882dee4fe246697bc1ff6a8ae97cdefb7e8fc443..13c2cb8da4c3c6213af2dd84beeb61d74dabf624 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 SMM MP service implementation\r
 \r
-Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2022, Intel Corporation. All rights reserved.<BR>\r
 Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 \r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -293,10 +293,14 @@ SmmWaitForApArrival (
   // Sync with APs 1st timeout\r
   //\r
   for (Timer = StartSyncTimer ();\r
-       !IsSyncTimerTimeout (Timer) && !(LmceEn && LmceSignal) &&\r
-       !AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | ARRIVAL_EXCEPTION_SMI_DISABLED);\r
+       !IsSyncTimerTimeout (Timer) && !(LmceEn && LmceSignal);\r
        )\r
   {\r
+    mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | ARRIVAL_EXCEPTION_SMI_DISABLED);\r
+    if (mSmmMpSyncData->AllApArrivedWithException) {\r
+      break;\r
+    }\r
+\r
     CpuPause ();\r
   }\r
 \r
@@ -330,10 +334,14 @@ SmmWaitForApArrival (
     // Sync with APs 2nd timeout.\r
     //\r
     for (Timer = StartSyncTimer ();\r
-         !IsSyncTimerTimeout (Timer) &&\r
-         !AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | ARRIVAL_EXCEPTION_SMI_DISABLED);\r
+         !IsSyncTimerTimeout (Timer);\r
          )\r
     {\r
+      mSmmMpSyncData->AllApArrivedWithException = AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | ARRIVAL_EXCEPTION_SMI_DISABLED);\r
+      if (mSmmMpSyncData->AllApArrivedWithException) {\r
+        break;\r
+      }\r
+\r
       CpuPause ();\r
     }\r
   }\r
@@ -1887,6 +1895,8 @@ InitializeMpSyncData (
     *mSmmMpSyncData->InsideSmm     = FALSE;\r
     *mSmmMpSyncData->AllCpusInSync = FALSE;\r
 \r
+    mSmmMpSyncData->AllApArrivedWithException = FALSE;\r
+\r
     for (CpuIndex = 0; CpuIndex < gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus; CpuIndex++) {\r
       mSmmMpSyncData->CpuData[CpuIndex].Busy =\r
         (SPIN_LOCK *)((UINTN)mSmmCpuSemaphores.SemaphoreCpu.Busy + mSemaphoreSize * CpuIndex);\r