]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
Revert "UefiCpuPkg: Has APs in 64 bit long-mode before booting to OS."
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / DxeMpLib.c
index beab06a5b1874c983209377ffb3af2482d071bb2..445e0853d2fb4b90339b05fcf8a88240221c62f2 100644 (file)
@@ -28,7 +28,6 @@ volatile BOOLEAN  mStopCheckAllApsStatus       = TRUE;
 VOID              *mReservedApLoopFunc         = NULL;\r
 UINTN             mReservedTopOfApStack;\r
 volatile UINT32   mNumberToFinish = 0;\r
-UINTN             mApPageTable;\r
 \r
 //\r
 // Begin wakeup buffer allocation below 0x88000\r
@@ -408,9 +407,12 @@ RelocateApLoop (
     AsmRelocateApLoopFunc (\r
       MwaitSupport,\r
       CpuMpData->ApTargetCState,\r
+      CpuMpData->PmCodeSegment,\r
       StackStart - ProcessorNumber * AP_SAFE_STACK_SIZE,\r
       (UINTN)&mNumberToFinish,\r
-      mApPageTable\r
+      CpuMpData->Pm16CodeSegment,\r
+      CpuMpData->SevEsAPBuffer,\r
+      CpuMpData->WakeupBuffer\r
       );\r
   }\r
 \r
@@ -475,6 +477,7 @@ InitMpGlobalData (
   )\r
 {\r
   EFI_STATUS                       Status;\r
+  EFI_PHYSICAL_ADDRESS             Address;\r
   UINTN                            ApSafeBufferSize;\r
   UINTN                            Index;\r
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR  MemDesc;\r
@@ -542,45 +545,60 @@ InitMpGlobalData (
   // Allocating it in advance since memory services are not available in\r
   // Exit Boot Services callback function.\r
   //\r
-  // +------------+\r
-  // | Ap Loop    |\r
-  // +------------+\r
-  // | Stack * N  |\r
-  // +------------+ (low address)\r
-  //\r
   ApSafeBufferSize = EFI_PAGES_TO_SIZE (\r
                        EFI_SIZE_TO_PAGES (\r
-                         CpuMpData->CpuCount * AP_SAFE_STACK_SIZE\r
-                         + CpuMpData->AddressMap.RelocateApLoopFuncSize\r
+                         CpuMpData->AddressMap.RelocateApLoopFuncSize\r
                          )\r
                        );\r
+  Address = BASE_4GB - 1;\r
+  Status  = gBS->AllocatePages (\r
+                   AllocateMaxAddress,\r
+                   EfiReservedMemoryType,\r
+                   EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
+                   &Address\r
+                   );\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  mReservedTopOfApStack = (UINTN)AllocateReservedPages (EFI_SIZE_TO_PAGES (ApSafeBufferSize));\r
-  ASSERT (mReservedTopOfApStack != 0);\r
-  ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
-  ASSERT ((AP_SAFE_STACK_SIZE & (CPU_STACK_ALIGNMENT - 1)) == 0);\r
-\r
-  mReservedApLoopFunc = (VOID *)(mReservedTopOfApStack + CpuMpData->CpuCount * AP_SAFE_STACK_SIZE);\r
-  if (StandardSignatureIsAuthenticAMD ()) {\r
-    CopyMem (\r
-      mReservedApLoopFunc,\r
-      CpuMpData->AddressMap.RelocateApLoopFuncAddressAmd,\r
-      CpuMpData->AddressMap.RelocateApLoopFuncSizeAmd\r
-      );\r
-  } else {\r
-    CopyMem (\r
-      mReservedApLoopFunc,\r
-      CpuMpData->AddressMap.RelocateApLoopFuncAddress,\r
-      CpuMpData->AddressMap.RelocateApLoopFuncSize\r
-      );\r
+  mReservedApLoopFunc = (VOID *)(UINTN)Address;\r
+  ASSERT (mReservedApLoopFunc != NULL);\r
 \r
-    mApPageTable = CreatePageTable (\r
-                     mReservedTopOfApStack,\r
-                     ApSafeBufferSize\r
-                     );\r
+  //\r
+  // Make sure that the buffer memory is executable if NX protection is enabled\r
+  // for EfiReservedMemoryType.\r
+  //\r
+  // TODO: Check EFI_MEMORY_XP bit set or not once it's available in DXE GCD\r
+  //       service.\r
+  //\r
+  Status = gDS->GetMemorySpaceDescriptor (Address, &MemDesc);\r
+  if (!EFI_ERROR (Status)) {\r
+    gDS->SetMemorySpaceAttributes (\r
+           Address,\r
+           ApSafeBufferSize,\r
+           MemDesc.Attributes & (~EFI_MEMORY_XP)\r
+           );\r
   }\r
 \r
-  mReservedTopOfApStack += CpuMpData->CpuCount * AP_SAFE_STACK_SIZE;\r
+  ApSafeBufferSize = EFI_PAGES_TO_SIZE (\r
+                       EFI_SIZE_TO_PAGES (\r
+                         CpuMpData->CpuCount * AP_SAFE_STACK_SIZE\r
+                         )\r
+                       );\r
+  Address = BASE_4GB - 1;\r
+  Status  = gBS->AllocatePages (\r
+                   AllocateMaxAddress,\r
+                   EfiReservedMemoryType,\r
+                   EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
+                   &Address\r
+                   );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  mReservedTopOfApStack = (UINTN)Address + ApSafeBufferSize;\r
+  ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
+  CopyMem (\r
+    mReservedApLoopFunc,\r
+    CpuMpData->AddressMap.RelocateApLoopFuncAddress,\r
+    CpuMpData->AddressMap.RelocateApLoopFuncSize\r
+    );\r
 \r
   Status = gBS->CreateEvent (\r
                   EVT_TIMER | EVT_NOTIFY_SIGNAL,\r