{\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
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