]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg: Allocate contiguous memory for stacks and APs loop.
authorXie, Yuanhao <yuanhao.xie@intel.com>
Wed, 1 Mar 2023 06:09:49 +0000 (14:09 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 7 Mar 2023 08:14:59 +0000 (08:14 +0000)
Cc: Guo Dong <guo.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Sean Rhodes <sean@starlabs.systems>
Cc: James Lu <james.lu@intel.com>
Cc: Gua Guo <gua.guo@intel.com>
Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
UefiCpuPkg/Library/MpInitLib/DxeMpLib.c

index e9ac858f4f902388cbf86e9704397e113079159d..224215878c1f7abd9f40ff4cb5334f6c775a43fc 100644 (file)
@@ -480,11 +480,12 @@ InitMpGlobalData (
 {\r
   EFI_STATUS                       Status;\r
   EFI_PHYSICAL_ADDRESS             Address;\r
 {\r
   EFI_STATUS                       Status;\r
   EFI_PHYSICAL_ADDRESS             Address;\r
-  UINTN                            ApSafeBufferSize;\r
   UINTN                            Index;\r
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR  MemDesc;\r
   UINTN                            StackBase;\r
   CPU_INFO_IN_HOB                  *CpuInfoInHob;\r
   UINTN                            Index;\r
   EFI_GCD_MEMORY_SPACE_DESCRIPTOR  MemDesc;\r
   UINTN                            StackBase;\r
   CPU_INFO_IN_HOB                  *CpuInfoInHob;\r
+  UINTN                            StackPages;\r
+  UINTN                            FuncPages;\r
 \r
   SaveCpuMpData (CpuMpData);\r
 \r
 \r
   SaveCpuMpData (CpuMpData);\r
 \r
@@ -547,16 +548,23 @@ InitMpGlobalData (
   // Allocating it in advance since memory services are not available in\r
   // Exit Boot Services callback function.\r
   //\r
   // Allocating it in advance since memory services are not available in\r
   // Exit Boot Services callback function.\r
   //\r
-  ApSafeBufferSize = EFI_PAGES_TO_SIZE (\r
-                       EFI_SIZE_TO_PAGES (\r
-                         CpuMpData->AddressMap.RelocateApLoopFuncSize\r
-                         )\r
-                       );\r
+  // +------------+ (TopOfApStack)\r
+  // |  Stack * N |\r
+  // +------------+ (stack base, 4k aligned)\r
+  // |  Padding   |\r
+  // +------------+\r
+  // |  Ap Loop   |\r
+  // +------------+ ((low address, 4k-aligned)\r
+  //\r
+\r
+  StackPages = EFI_SIZE_TO_PAGES (CpuMpData->CpuCount * AP_SAFE_STACK_SIZE);\r
+  FuncPages  = EFI_SIZE_TO_PAGES (CpuMpData->AddressMap.RelocateApLoopFuncSize);\r
+\r
   Address = BASE_4GB - 1;\r
   Status  = gBS->AllocatePages (\r
                    AllocateMaxAddress,\r
                    EfiReservedMemoryType,\r
   Address = BASE_4GB - 1;\r
   Status  = gBS->AllocatePages (\r
                    AllocateMaxAddress,\r
                    EfiReservedMemoryType,\r
-                   EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
+                   StackPages + FuncPages,\r
                    &Address\r
                    );\r
   ASSERT_EFI_ERROR (Status);\r
                    &Address\r
                    );\r
   ASSERT_EFI_ERROR (Status);\r
@@ -575,26 +583,12 @@ InitMpGlobalData (
   if (!EFI_ERROR (Status)) {\r
     gDS->SetMemorySpaceAttributes (\r
            Address,\r
   if (!EFI_ERROR (Status)) {\r
     gDS->SetMemorySpaceAttributes (\r
            Address,\r
-           ApSafeBufferSize,\r
+           EFI_PAGES_TO_SIZE (FuncPages),\r
            MemDesc.Attributes & (~EFI_MEMORY_XP)\r
            );\r
   }\r
 \r
            MemDesc.Attributes & (~EFI_MEMORY_XP)\r
            );\r
   }\r
 \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
+  mReservedTopOfApStack = (UINTN)Address + EFI_PAGES_TO_SIZE (StackPages+FuncPages);\r
   ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
   CopyMem (\r
     mReservedApLoop.Data,\r
   ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
   CopyMem (\r
     mReservedApLoop.Data,\r