]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/MpServicesOnFrameworkMpServicesThunk.c
Ensure GDT for APs is under 4G, in order to secure that APs can safely use it to...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / MpServicesOnFrameworkMpServicesThunk / MpServicesOnFrameworkMpServicesThunk.c
index 9005670baebd8839ac6948d96c5b697a6ad5f045..4d0918fa78c7af6d90f13c38da5dc836e085bcb7 100644 (file)
@@ -1444,6 +1444,8 @@ PrepareAPStartupVector (
 {\r
   MP_ASSEMBLY_ADDRESS_MAP   AddressMap;\r
   IA32_DESCRIPTOR           GdtrForBSP;\r
+  EFI_PHYSICAL_ADDRESS      GdtForAP;\r
+  EFI_STATUS                Status;\r
 \r
   //\r
   // Get the address map of startup code for AP,\r
@@ -1481,7 +1483,22 @@ PrepareAPStartupVector (
   mExchangeInfo->StackSize  = AP_STACK_SIZE;\r
 \r
   AsmReadGdtr (&GdtrForBSP);\r
-  mExchangeInfo->GdtrProfile.Base  = GdtrForBSP.Base;\r
+\r
+  //\r
+  // Allocate memory under 4G to hold GDT for APs\r
+  //\r
+  GdtForAP = 0xffffffff;\r
+  Status   = gBS->AllocatePages (\r
+                    AllocateMaxAddress,\r
+                    EfiBootServicesData,\r
+                    EFI_SIZE_TO_PAGES (GdtrForBSP.Limit + 1),\r
+                    &GdtForAP\r
+                    );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  CopyMem ((VOID *) (UINTN) GdtForAP, (VOID *) GdtrForBSP.Base, GdtrForBSP.Limit + 1);\r
+\r
+  mExchangeInfo->GdtrProfile.Base  = (UINTN) GdtForAP;\r
   mExchangeInfo->GdtrProfile.Limit = GdtrForBSP.Limit;\r
 \r
   mExchangeInfo->BufferStart = (UINT32) mStartupVector;\r