]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Not use disabled AP when call StartAllAPs.
authorEric Dong <eric.dong@intel.com>
Thu, 26 Jul 2018 08:44:22 +0000 (16:44 +0800)
committerEric Dong <eric.dong@intel.com>
Thu, 26 Jul 2018 08:54:18 +0000 (16:54 +0800)
Base on UEFI spec requirement, StartAllAPs function should not use the APs which has been disabled before. This patch just change current code to follow this rule.

V3 changes:
Only called by StartUpAllAps, WakeUpAp will not wake up the disabled APs, in other cases also need to include the disabled APs, such as CpuDxe driver start up and ChangeApLoopCallback function.

WakeUpAP() is called with (Broadcast && WakeUpDisabledAps) from MpInitLibInitialize(), CollectProcessorCount() and MpInitChangeApLoopCallback() only. The first two run before the PPI or Protocol user has a chance to disable any APs. The last one runs in response to the ExitBootServices and LegacyBoot events, after which the MP protocol is unusable. For this reason, it doesn't matter that an originally disabled AP's state is not restored to Disabled, when
WakeUpAP() is called with (Broadcast && WakeUpDisabledAps).

Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
UefiCpuPkg/Library/MpInitLib/MpLib.c
UefiCpuPkg/Library/MpInitLib/MpLib.h

index d82e9aea45c0c0a4bfc607c691b7f23350606068..c17daa0fc0da7d59f373b440b351e685578e0c3b 100644 (file)
@@ -306,7 +306,7 @@ MpInitChangeApLoopCallback (
   CpuMpData->PmCodeSegment = GetProtectedModeCS ();\r
   CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);\r
   mNumberToFinish = CpuMpData->CpuCount - 1;\r
-  WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, NULL);\r
+  WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, NULL, TRUE);\r
   while (mNumberToFinish > 0) {\r
     CpuPause ();\r
   }\r
index 0e57cc86bf7965b596c7164a8fca208553d70d43..377876643f0a1247bbcc58431aead53164712237 100644 (file)
@@ -470,7 +470,7 @@ CollectProcessorCount (
   //\r
   CpuMpData->InitFlag     = ApInitConfig;\r
   CpuMpData->X2ApicEnable = FALSE;\r
-  WakeUpAP (CpuMpData, TRUE, 0, NULL, NULL);\r
+  WakeUpAP (CpuMpData, TRUE, 0, NULL, NULL, TRUE);\r
   CpuMpData->InitFlag = ApInitDone;\r
   ASSERT (CpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));\r
   //\r
@@ -491,7 +491,7 @@ CollectProcessorCount (
     //\r
     // Wakeup all APs to enable x2APIC mode\r
     //\r
-    WakeUpAP (CpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);\r
+    WakeUpAP (CpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL, TRUE);\r
     //\r
     // Wait for all known APs finished\r
     //\r
@@ -969,6 +969,7 @@ FreeResetVector (
   @param[in] ProcessorNumber    The handle number of specified processor\r
   @param[in] Procedure          The function to be invoked by AP\r
   @param[in] ProcedureArgument  The argument to be passed into AP function\r
+  @param[in] WakeUpDisabledAps  Whether need to wake up disabled APs in broadcast mode.\r
 **/\r
 VOID\r
 WakeUpAP (\r
@@ -976,7 +977,8 @@ WakeUpAP (
   IN BOOLEAN                   Broadcast,\r
   IN UINTN                     ProcessorNumber,\r
   IN EFI_AP_PROCEDURE          Procedure,              OPTIONAL\r
-  IN VOID                      *ProcedureArgument      OPTIONAL\r
+  IN VOID                      *ProcedureArgument,     OPTIONAL\r
+  IN BOOLEAN                   WakeUpDisabledAps\r
   )\r
 {\r
   volatile MP_CPU_EXCHANGE_INFO    *ExchangeInfo;\r
@@ -1010,6 +1012,15 @@ WakeUpAP (
     for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
       if (Index != CpuMpData->BspNumber) {\r
         CpuData = &CpuMpData->CpuData[Index];\r
+        //\r
+        // All AP(include disabled AP) will be woke up by INIT-SIPI-SIPI, but\r
+        // the AP procedure will be skipped for disabled AP because AP state \r
+        // is not CpuStateReady.\r
+        //\r
+        if (GetApState (CpuData) == CpuStateDisabled && !WakeUpDisabledAps) {\r
+          continue;\r
+        }\r
+\r
         CpuData->ApFunction         = (UINTN) Procedure;\r
         CpuData->ApFunctionArgument = (UINTN) ProcedureArgument;\r
         SetApState (CpuData, CpuStateReady);\r
@@ -1289,7 +1300,7 @@ ResetProcessorToIdleState (
   CpuMpData = GetCpuMpData ();\r
 \r
   CpuMpData->InitFlag = ApInitReconfig;\r
-  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, NULL, NULL);\r
+  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, NULL, NULL, TRUE);\r
   while (CpuMpData->FinishedCount < 1) {\r
     CpuPause ();\r
   }\r
@@ -1439,7 +1450,8 @@ CheckAllAPs (
             FALSE,\r
             (UINT32) NextProcessorNumber,\r
             CpuMpData->Procedure,\r
-            CpuMpData->ProcArguments\r
+            CpuMpData->ProcArguments,\r
+            TRUE\r
             );\r
          }\r
       }\r
@@ -1711,7 +1723,7 @@ MpInitLibInitialize (
       //\r
       // Wakeup APs to do some AP initialize sync\r
       //\r
-      WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData);\r
+      WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData, TRUE);\r
       //\r
       // Wait for all APs finished initialization\r
       //\r
@@ -1906,7 +1918,7 @@ SwitchBSPWorker (
   //\r
   // Need to wakeUp AP (future BSP).\r
   //\r
-  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, FutureBSPProc, CpuMpData);\r
+  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, FutureBSPProc, CpuMpData, TRUE);\r
 \r
   AsmExchangeRole (&CpuMpData->BSPInfo, &CpuMpData->APInfo);\r
 \r
@@ -2240,14 +2252,14 @@ StartupAllAPsWorker (
   CpuMpData->WaitEvent     = WaitEvent;\r
 \r
   if (!SingleThread) {\r
-    WakeUpAP (CpuMpData, TRUE, 0, Procedure, ProcedureArgument);\r
+    WakeUpAP (CpuMpData, TRUE, 0, Procedure, ProcedureArgument, FALSE);\r
   } else {\r
     for (ProcessorNumber = 0; ProcessorNumber < ProcessorCount; ProcessorNumber++) {\r
       if (ProcessorNumber == CallerNumber) {\r
         continue;\r
       }\r
       if (CpuMpData->CpuData[ProcessorNumber].Waiting) {\r
-        WakeUpAP (CpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument);\r
+        WakeUpAP (CpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument, TRUE);\r
         break;\r
       }\r
     }\r
@@ -2359,7 +2371,7 @@ StartupThisAPWorker (
   CpuData->ExpectedTime = CalculateTimeout (TimeoutInMicroseconds, &CpuData->CurrentTime);\r
   CpuData->TotalTime    = 0;\r
 \r
-  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument);\r
+  WakeUpAP (CpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument, TRUE);\r
 \r
   //\r
   // If WaitEvent is NULL, execute in blocking mode.\r
index 0fbf9c66562999f346528f8698f3dde07a8b7072..75f3fdda1d84148177d92afc0926f1f5cf7f12db 100644 (file)
@@ -377,6 +377,7 @@ GetModeTransitionBuffer (
   @param[in] ProcessorNumber    The handle number of specified processor\r
   @param[in] Procedure          The function to be invoked by AP\r
   @param[in] ProcedureArgument  The argument to be passed into AP function\r
+  @param[in] WakeUpDisabledAps  Whether need to wake up disabled APs in broadcast mode.\r
 **/\r
 VOID\r
 WakeUpAP (\r
@@ -384,7 +385,8 @@ WakeUpAP (
   IN BOOLEAN                   Broadcast,\r
   IN UINTN                     ProcessorNumber,\r
   IN EFI_AP_PROCEDURE          Procedure,              OPTIONAL\r
-  IN VOID                      *ProcedureArgument      OPTIONAL\r
+  IN VOID                      *ProcedureArgument,     OPTIONAL\r
+  IN BOOLEAN                   WakeUpDisabledAps       OPTIONAL\r
   );\r
 \r
 /**\r