]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/MpLib.c
UefiCpuPkg/MpInitLib: Make sure AP uses correct StartupApSignal
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / MpLib.c
index 6231968c7483249caf270faf5418a1573b209136..742f0c1f5e7b5b7b89e000e3c2695ae5ccbcf096 100644 (file)
@@ -330,6 +330,7 @@ SortApicId (
   CPU_INFO_IN_HOB   CpuInfo;\r
   UINT32            ApCount;\r
   CPU_INFO_IN_HOB   *CpuInfoInHob;\r
+  volatile UINT32   *StartupApSignal;\r
 \r
   ApCount = CpuMpData->CpuCount - 1;\r
   CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
@@ -354,6 +355,14 @@ SortApicId (
           sizeof (CPU_INFO_IN_HOB)\r
           );\r
         CopyMem (&CpuInfoInHob[Index1], &CpuInfo, sizeof (CPU_INFO_IN_HOB));\r
+\r
+        //\r
+        // Also exchange the StartupApSignal.\r
+        //\r
+        StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal;\r
+        CpuMpData->CpuData[Index3].StartupApSignal =\r
+          CpuMpData->CpuData[Index1].StartupApSignal;\r
+        CpuMpData->CpuData[Index1].StartupApSignal = StartupApSignal;\r
       }\r
     }\r
 \r
@@ -823,19 +832,20 @@ FillExchangeInfoData (
   // Copy all 32-bit code and 64-bit code into memory with type of\r
   // EfiBootServicesCode to avoid page fault if NX memory protection is enabled.\r
   //\r
-  if (ExchangeInfo->ModeTransitionMemory != 0) {\r
+  if (CpuMpData->WakeupBufferHigh != 0) {\r
     Size = CpuMpData->AddressMap.RendezvousFunnelSize -\r
            CpuMpData->AddressMap.ModeTransitionOffset;\r
     CopyMem (\r
-      (VOID *)(UINTN)ExchangeInfo->ModeTransitionMemory,\r
+      (VOID *)CpuMpData->WakeupBufferHigh,\r
       CpuMpData->AddressMap.RendezvousFunnelAddress +\r
       CpuMpData->AddressMap.ModeTransitionOffset,\r
       Size\r
       );\r
 \r
-    ExchangeInfo->ModeHighMemory = ExchangeInfo->ModeTransitionMemory;\r
-    ExchangeInfo->ModeHighMemory += (UINT32)ExchangeInfo->ModeOffset -\r
-               (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;\r
+    ExchangeInfo->ModeTransitionMemory = (UINT32)CpuMpData->WakeupBufferHigh;\r
+    ExchangeInfo->ModeHighMemory = (UINT32)CpuMpData->WakeupBufferHigh +\r
+                                   (UINT32)ExchangeInfo->ModeOffset -\r
+                                   (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;\r
     ExchangeInfo->ModeHighSegment = (UINT16)ExchangeInfo->CodeSegment;\r
   } else {\r
     ExchangeInfo->ModeTransitionMemory = (UINT32)\r
@@ -916,11 +926,10 @@ AllocateResetVector (
     CpuMpData->WakeupBuffer      = GetWakeupBuffer (ApResetVectorSize);\r
     CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)\r
                     (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);\r
-    CpuMpData->MpCpuExchangeInfo->ModeTransitionMemory = (UINT32)\r
-                    GetModeTransitionBuffer (\r
-                      CpuMpData->AddressMap.RendezvousFunnelSize -\r
-                      CpuMpData->AddressMap.ModeTransitionOffset\r
-                      );\r
+    CpuMpData->WakeupBufferHigh  = GetModeTransitionBuffer (\r
+                                    CpuMpData->AddressMap.RendezvousFunnelSize -\r
+                                    CpuMpData->AddressMap.ModeTransitionOffset\r
+                                    );\r
   }\r
   BackupAndPrepareWakeupBuffer (CpuMpData);\r
 }\r