]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
UefiCpuPkg/DxeMpLib: Allocate new safe stack < 4GB
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / DxeMpLib.c
index a0d5eebc9497620efa48b15ee59ae6580b7f09da..5a3b02c26d3acd4a14fce4331038e4278d3246d6 100644 (file)
@@ -18,6 +18,7 @@
 #include <Library/UefiBootServicesTableLib.h>\r
 \r
 #define  AP_CHECK_INTERVAL     (EFI_TIMER_PERIOD_MILLISECONDS (100))\r
+#define  AP_SAFE_STACK_SIZE    128\r
 \r
 CPU_MP_DATA      *mCpuMpData = NULL;\r
 EFI_EVENT        mCheckAllApsEvent = NULL;\r
@@ -25,6 +26,7 @@ EFI_EVENT        mMpInitExitBootServicesEvent = NULL;
 EFI_EVENT        mLegacyBootEvent = NULL;\r
 volatile BOOLEAN mStopCheckAllApsStatus = TRUE;\r
 VOID             *mReservedApLoopFunc = NULL;\r
+UINTN            mReservedTopOfApStack;\r
 \r
 /**\r
   Get the pointer to CPU MP Data structure.\r
@@ -241,11 +243,18 @@ RelocateApLoop (
   CPU_MP_DATA            *CpuMpData;\r
   BOOLEAN                MwaitSupport;\r
   ASM_RELOCATE_AP_LOOP   AsmRelocateApLoopFunc;\r
+  UINTN                  ProcessorNumber;\r
 \r
+  MpInitLibWhoAmI (&ProcessorNumber); \r
   CpuMpData    = GetCpuMpData ();\r
   MwaitSupport = IsMwaitSupport ();\r
   AsmRelocateApLoopFunc = (ASM_RELOCATE_AP_LOOP) (UINTN) mReservedApLoopFunc;\r
-  AsmRelocateApLoopFunc (MwaitSupport, CpuMpData->ApTargetCState, CpuMpData->PmCodeSegment);\r
+  AsmRelocateApLoopFunc (\r
+    MwaitSupport,\r
+    CpuMpData->ApTargetCState,\r
+    CpuMpData->PmCodeSegment,\r
+    mReservedTopOfApStack - ProcessorNumber * AP_SAFE_STACK_SIZE\r
+    );\r
   //\r
   // It should never reach here\r
   //\r
@@ -289,6 +298,7 @@ InitMpGlobalData (
 {\r
   EFI_STATUS                 Status;\r
   EFI_PHYSICAL_ADDRESS       Address;\r
+  UINTN                      ApSafeBufferSize;\r
 \r
   SaveCpuMpData (CpuMpData);\r
 \r
@@ -307,16 +317,21 @@ InitMpGlobalData (
   // Allocating it in advance since memory services are not available in\r
   // Exit Boot Services callback function.\r
   //\r
+  ApSafeBufferSize  = CpuMpData->AddressMap.RelocateApLoopFuncSize;\r
+  ApSafeBufferSize += CpuMpData->CpuCount * AP_SAFE_STACK_SIZE;\r
+\r
   Address = BASE_4GB - 1;\r
   Status  = gBS->AllocatePages (\r
                    AllocateMaxAddress,\r
                    EfiReservedMemoryType,\r
-                   EFI_SIZE_TO_PAGES (sizeof (CpuMpData->AddressMap.RelocateApLoopFuncSize)),\r
+                   EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
                    &Address\r
                    );\r
   ASSERT_EFI_ERROR (Status);\r
   mReservedApLoopFunc = (VOID *) (UINTN) Address;\r
   ASSERT (mReservedApLoopFunc != NULL);\r
+  mReservedTopOfApStack = (UINTN) Address + EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (ApSafeBufferSize));\r
+  ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
   CopyMem (\r
     mReservedApLoopFunc,\r
     CpuMpData->AddressMap.RelocateApLoopFuncAddress,\r