Size -= sizeof (IA32_SEGMENT_DESCRIPTOR);\r
}\r
\r
- //\r
- // Copy all 32-bit code and 64-bit code into memory with type of\r
- // EfiBootServicesCode to avoid page fault if NX memory protection is enabled.\r
- //\r
- GetApResetVectorSize (&CpuMpData->AddressMap, NULL, &Size);\r
- CopyMem (\r
- (VOID *)CpuMpData->WakeupBufferHigh,\r
- CpuMpData->AddressMap.RendezvousFunnelAddress +\r
- CpuMpData->AddressMap.ModeTransitionOffset,\r
- Size\r
- );\r
-\r
ExchangeInfo->ModeTransitionMemory = (UINT32)CpuMpData->WakeupBufferHigh;\r
\r
ExchangeInfo->ModeHighMemory = ExchangeInfo->ModeTransitionMemory +\r
@param[in, out] CpuMpData The pointer to CPU MP Data structure.\r
**/\r
VOID\r
-AllocateResetVector (\r
+AllocateResetVectorBelow1Mb (\r
IN OUT CPU_MP_DATA *CpuMpData\r
)\r
{\r
- UINTN ApResetVectorSizeBelow1Mb;\r
- UINTN ApResetVectorSizeAbove1Mb;\r
UINTN ApResetStackSize;\r
\r
if (CpuMpData->WakeupBuffer == (UINTN)-1) {\r
- GetApResetVectorSize (&CpuMpData->AddressMap, &ApResetVectorSizeBelow1Mb, &ApResetVectorSizeAbove1Mb);\r
-\r
- CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSizeBelow1Mb);\r
+ CpuMpData->WakeupBuffer = GetWakeupBuffer (CpuMpData->BackupBufferSize);\r
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN)\r
- (CpuMpData->WakeupBuffer + ApResetVectorSizeBelow1Mb - sizeof (MP_CPU_EXCHANGE_INFO));\r
- CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (ApResetVectorSizeAbove1Mb);\r
+ (CpuMpData->WakeupBuffer + CpuMpData->BackupBufferSize - sizeof (MP_CPU_EXCHANGE_INFO));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "AP Vector: 16-bit = %p/%x, ExchangeInfo = %p/%x\n",\r
+ CpuMpData->WakeupBuffer,\r
+ CpuMpData->BackupBufferSize - sizeof (MP_CPU_EXCHANGE_INFO),\r
+ CpuMpData->MpCpuExchangeInfo,\r
+ sizeof (MP_CPU_EXCHANGE_INFO)\r
+ ));\r
//\r
// The AP reset stack is only used by SEV-ES guests. Do not allocate it\r
// if SEV-ES is not enabled. An SEV-SNP guest is also considered\r
(CpuMpData->InitFlag != ApInitDone))\r
{\r
ResetVectorRequired = TRUE;\r
- AllocateResetVector (CpuMpData);\r
+ AllocateResetVectorBelow1Mb (CpuMpData);\r
AllocateSevEsAPMemory (CpuMpData);\r
FillExchangeInfoData (CpuMpData);\r
SaveLocalApicTimerSetting (CpuMpData);\r
UINT8 *MonitorBuffer;\r
UINTN Index;\r
UINTN ApResetVectorSizeBelow1Mb;\r
+ UINTN ApResetVectorSizeAbove1Mb;\r
UINTN BackupBufferAddr;\r
UINTN ApIdtBase;\r
\r
ASSERT (MaxLogicalProcessorNumber != 0);\r
\r
AsmGetAddressMap (&AddressMap);\r
- GetApResetVectorSize (&AddressMap, &ApResetVectorSizeBelow1Mb, NULL);\r
- ApStackSize = PcdGet32 (PcdCpuApStackSize);\r
- ApLoopMode = GetApLoopMode (&MonitorFilterSize);\r
+ GetApResetVectorSize (&AddressMap, &ApResetVectorSizeBelow1Mb, &ApResetVectorSizeAbove1Mb);\r
+ ApStackSize = PcdGet32 (PcdCpuApStackSize);\r
+ ApLoopMode = GetApLoopMode (&MonitorFilterSize);\r
\r
//\r
// Save BSP's Control registers for APs.\r
(UINT32 *)(MonitorBuffer + MonitorFilterSize * Index);\r
}\r
\r
+ //\r
+ // Copy all 32-bit code and 64-bit code into memory with type of\r
+ // EfiBootServicesCode to avoid page fault if NX memory protection is enabled.\r
+ //\r
+ CpuMpData->WakeupBufferHigh = AllocateCodeBuffer (ApResetVectorSizeAbove1Mb);\r
+ CopyMem (\r
+ (VOID *)CpuMpData->WakeupBufferHigh,\r
+ CpuMpData->AddressMap.RendezvousFunnelAddress +\r
+ CpuMpData->AddressMap.ModeTransitionOffset,\r
+ ApResetVectorSizeAbove1Mb\r
+ );\r
+ DEBUG ((DEBUG_INFO, "AP Vector: non-16-bit = %p/%x\n", CpuMpData->WakeupBufferHigh, ApResetVectorSizeAbove1Mb));\r
+\r
//\r
// Enable the local APIC for Virtual Wire Mode.\r
//\r