]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Don't allocate reset vector in Exit Boot Service
authorJeff Fan <jeff.fan@intel.com>
Wed, 24 Aug 2016 14:42:32 +0000 (22:42 +0800)
committerJeff Fan <jeff.fan@intel.com>
Thu, 25 Aug 2016 08:12:55 +0000 (16:12 +0800)
In Exit Boot Services callback function, we cannot use allocate memory services
because it may change the memory map that has been gotten by OS.

This fix is not to allocate reset vector buffer after SaveRestoreFlag is set to
TRUE in MpInitExitBootServicesCallback(). Instead AllocateResetVector() will use
the previous allocated buffer address and save the contents before copying reset
vector code. At the same time, FreeResetVector() will restore original contents
after if SaveRestoreFlag is TRUE.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c

index e459ebc5ebe4d4b5b63a7c44df2df52f7b968f8c..50b5b270fe507cf262928d79751f339055f7bddc 100644 (file)
@@ -66,29 +66,33 @@ AllocateResetVector (
   UINTN                 ApResetVectorSize;\r
   EFI_PHYSICAL_ADDRESS  StartAddress;\r
 \r
-  ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +\r
-                      sizeof (MP_CPU_EXCHANGE_INFO);\r
-\r
-  StartAddress = BASE_1MB;\r
-  Status = gBS->AllocatePages (\r
-                  AllocateMaxAddress,\r
-                  EfiACPIMemoryNVS,\r
-                  EFI_SIZE_TO_PAGES (ApResetVectorSize),\r
-                  &StartAddress\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  CpuMpData->WakeupBuffer      = (UINTN) StartAddress;\r
-  CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)\r
+  if (CpuMpData->SaveRestoreFlag) {\r
+    BackupAndPrepareWakeupBuffer (CpuMpData);\r
+  } else {\r
+    ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +\r
+                        sizeof (MP_CPU_EXCHANGE_INFO);\r
+\r
+    StartAddress = BASE_1MB;\r
+    Status = gBS->AllocatePages (\r
+                    AllocateMaxAddress,\r
+                    EfiACPIMemoryNVS,\r
+                    EFI_SIZE_TO_PAGES (ApResetVectorSize),\r
+                    &StartAddress\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    CpuMpData->WakeupBuffer      = (UINTN) StartAddress;\r
+    CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)\r
                   (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);\r
-  //\r
-  // copy AP reset code in it\r
-  //\r
-  CopyMem (\r
-    (VOID *) CpuMpData->WakeupBuffer,\r
-    (VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,\r
-    CpuMpData->AddressMap.RendezvousFunnelSize\r
-    );\r
+    //\r
+    // copy AP reset code in it\r
+    //\r
+    CopyMem (\r
+      (VOID *) CpuMpData->WakeupBuffer,\r
+      (VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,\r
+      CpuMpData->AddressMap.RendezvousFunnelSize\r
+      );\r
+  }\r
 }\r
 \r
 /**\r
@@ -103,13 +107,18 @@ FreeResetVector (
 {\r
   EFI_STATUS            Status;\r
   UINTN                 ApResetVectorSize;\r
-  ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +\r
-                      sizeof (MP_CPU_EXCHANGE_INFO);\r
-  Status = gBS->FreePages(\r
-             (EFI_PHYSICAL_ADDRESS)CpuMpData->WakeupBuffer,\r
-             EFI_SIZE_TO_PAGES (ApResetVectorSize)\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (CpuMpData->SaveRestoreFlag) {\r
+    RestoreWakeupBuffer (CpuMpData);\r
+  } else {\r
+    ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +\r
+                        sizeof (MP_CPU_EXCHANGE_INFO);\r
+    Status = gBS->FreePages(\r
+               (EFI_PHYSICAL_ADDRESS)CpuMpData->WakeupBuffer,\r
+               EFI_SIZE_TO_PAGES (ApResetVectorSize)\r
+               );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
 }\r
 \r
 /**\r
@@ -260,6 +269,7 @@ MpInitExitBootServicesCallback (
   CPU_MP_DATA               *CpuMpData;\r
 \r
   CpuMpData = GetCpuMpData ();\r
+  CpuMpData->SaveRestoreFlag = TRUE;\r
   CpuMpData->PmCodeSegment = GetProtectedModeCS ();\r
   CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);\r
   WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, mReservedApLoopFunc);\r