]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/MpServicesOnFrameworkMpServicesThunk.c
Fix the risk of AP stack conflict.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / MpServicesOnFrameworkMpServicesThunk / MpServicesOnFrameworkMpServicesThunk.c
index f3db9f6b7c01b11037047a2e24d27507199bbed4..479362dd8704fcf045b8aad2f04ae5b15b012d21 100644 (file)
@@ -22,7 +22,6 @@ EFI_HANDLE                          mHandle = NULL;
 MP_SYSTEM_DATA                      mMPSystemData;\r
 EFI_PHYSICAL_ADDRESS                mStartupVector;\r
 MP_CPU_EXCHANGE_INFO                *mExchangeInfo;\r
-VOID                                *mStackStartAddress;\r
 BOOLEAN                             mStopCheckAPsStatus = FALSE;\r
 UINTN                               mNumberOfProcessors;\r
 EFI_GENERIC_MEMORY_TEST_PROTOCOL    *mGenMemoryTest;\r
@@ -1254,14 +1253,14 @@ ApProcWrapper (
 \r
   This function sends INIT-SIPI-SIPI to AP, and assign procedure specified by ApFunction.\r
 \r
-  @param  Broadcast   If TRUE, broadcase IPI to all APs; otherwise, send to specified AP.\r
-  @param  ApicID      The Local APIC ID of the specified AP. If Broadcast is TRUE, it is ignored.\r
-  @param  ApFunction  The procedure for AP to work on.\r
+  @param  ProcessorNumber The processor number of the specified AP.\r
+  @param  ApicID          The Local APIC ID of the specified AP.\r
+  @param  ApFunction      The procedure for AP to work on.\r
 \r
 **/\r
 VOID\r
 SendInitSipiSipi (\r
-  IN BOOLEAN            Broadcast,\r
+  IN UINTN              ProcessorNumber,\r
   IN UINT32             ApicID,\r
   IN VOID               *ApFunction\r
   )\r
@@ -1274,15 +1273,10 @@ SendInitSipiSipi (
   UINT32                DeliveryMode;\r
 \r
   mExchangeInfo->ApFunction = ApFunction;\r
-  mExchangeInfo->StackStart = mStackStartAddress;\r
+  mExchangeInfo->ProcessorNumber[ApicID] = (UINT32) ProcessorNumber;\r
 \r
-  if (Broadcast) {\r
-    ICRHigh = 0;\r
-    ICRLow  = BROADCAST_MODE_ALL_EXCLUDING_SELF_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-  } else {\r
-    ICRHigh = ApicID << 24;\r
-    ICRLow  = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-  }\r
+  ICRHigh = ApicID << 24;\r
+  ICRLow  = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
 \r
   VectorNumber = 0;\r
   DeliveryMode = DELIVERY_MODE_INIT;\r
@@ -1300,11 +1294,7 @@ SendInitSipiSipi (
 \r
   VectorNumber = (UINT32) RShiftU64 (mStartupVector, 12);\r
   DeliveryMode = DELIVERY_MODE_SIPI;\r
-  if (Broadcast) {\r
-    ICRLow = BROADCAST_MODE_ALL_EXCLUDING_SELF_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-  } else {\r
-    ICRLow = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
-  }\r
+  ICRLow = SPECIFY_CPU_MODE_BIT | TRIGGER_MODE_LEVEL_BIT | ASSERT_BIT;\r
 \r
   ICRLow |= VectorNumber | (DeliveryMode << 8);\r
 \r
@@ -1358,7 +1348,7 @@ WakeUpAp (
   ASSERT_EFI_ERROR (Status);\r
 \r
   SendInitSipiSipi (\r
-    FALSE,\r
+    ProcessorNumber,\r
     (UINT32) ProcessorInfoBuffer.ProcessorId,\r
     (VOID *) (UINTN) ApProcWrapper\r
     );\r
@@ -1390,7 +1380,7 @@ ResetProcessorToIdleState (
   ASSERT_EFI_ERROR (Status);\r
 \r
   SendInitSipiSipi (\r
-    FALSE,\r
+    ProcessorNumber,\r
     (UINT32) ProcessorInfoBuffer.ProcessorId,\r
     NULL\r
     );\r
@@ -1601,7 +1591,7 @@ PrepareAPStartupVector (
 \r
   ZeroMem ((VOID *) mExchangeInfo, sizeof (MP_CPU_EXCHANGE_INFO));\r
 \r
-  mStackStartAddress = AllocatePages (EFI_SIZE_TO_PAGES (MAX_CPU_NUMBER * AP_STACK_SIZE));\r
+  mExchangeInfo->StackStart  = AllocatePages (EFI_SIZE_TO_PAGES (mNumberOfProcessors * AP_STACK_SIZE));\r
   mExchangeInfo->StackSize  = AP_STACK_SIZE;\r
 \r
   AsmReadGdtr (&GdtrForBSP);\r
@@ -1711,8 +1701,6 @@ InitializeMpServicesProtocol (
 {\r
   EFI_STATUS Status;\r
 \r
-  PrepareMemoryForConfiguration ();\r
-\r
   //\r
   // Locates Framework version MP Services Protocol\r
   //\r
@@ -1734,6 +1722,8 @@ InitializeMpServicesProtocol (
   ASSERT_EFI_ERROR (Status);\r
   ASSERT (mNumberOfProcessors < MAX_CPU_NUMBER);\r
 \r
+  PrepareMemoryForConfiguration ();\r
+\r
   //\r
   // Create timer event to check AP state for non-blocking execution.\r
   //\r