UINTN WakeupBuffer;\r
UINTN WakeupBufferSize;\r
MP_ASSEMBLY_ADDRESS_MAP AddressMap;\r
+ UINT8 ApLoopMode;\r
+ UINT16 MonitorFilterSize;\r
+ UINT8 *MonitorBuffer;\r
+ UINTN Index;\r
\r
AsmGetAddressMap (&AddressMap);\r
WakeupBufferSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO);\r
DEBUG ((EFI_D_INFO, "CpuMpPei: WakeupBuffer = 0x%x\n", WakeupBuffer));\r
\r
//\r
- // Allocate Pages for APs stack, CPU MP Data and backup buffer for wakeup buffer\r
+ // Allocate Pages for APs stack, CPU MP Data, backup buffer for wakeup buffer,\r
+ // and monitor buffer if required.\r
//\r
MaxCpuCount = PcdGet32(PcdCpuMaxLogicalProcessorNumber);\r
BufferSize = PcdGet32 (PcdCpuApStackSize) * MaxCpuCount + sizeof (PEI_CPU_MP_DATA)\r
+ WakeupBufferSize + sizeof (PEI_CPU_DATA) * MaxCpuCount;\r
+ ApLoopMode = GetApLoopMode (&MonitorFilterSize);\r
+ BufferSize += MonitorFilterSize * MaxCpuCount;\r
Status = PeiServicesAllocatePages (\r
EfiBootServicesData,\r
EFI_SIZE_TO_PAGES (BufferSize),\r
InitializeSpinLock(&PeiCpuMpData->MpLock);\r
SaveVolatileRegisters (&PeiCpuMpData->CpuData[0].VolatileRegisters);\r
CopyMem (&PeiCpuMpData->AddressMap, &AddressMap, sizeof (MP_ASSEMBLY_ADDRESS_MAP));\r
-\r
+ //\r
+ // Initialize AP loop mode\r
+ //\r
+ PeiCpuMpData->ApLoopMode = ApLoopMode;\r
+ DEBUG ((EFI_D_INFO, "AP Loop Mode is %d\n", PeiCpuMpData->ApLoopMode));\r
+ MonitorBuffer = (UINT8 *)(PeiCpuMpData->CpuData + MaxCpuCount);\r
+ if (PeiCpuMpData->ApLoopMode != ApInHltLoop) {\r
+ //\r
+ // Set up APs wakeup signal buffer\r
+ //\r
+ for (Index = 0; Index < MaxCpuCount; Index++) {\r
+ PeiCpuMpData->CpuData[Index].StartupApSignal = \r
+ (UINT32 *)(MonitorBuffer + MonitorFilterSize * Index);\r
+ }\r
+ }\r
//\r
// Backup original data and copy AP reset code in it\r
//\r
} CPU_VOLATILE_REGISTERS;\r
\r
typedef struct {\r
+ volatile UINT32 *StartupApSignal;\r
UINT32 ApicId;\r
EFI_HEALTH_FLAGS Health;\r
CPU_STATE State;\r
CPU_EXCHANGE_ROLE_INFO BSPInfo;\r
CPU_EXCHANGE_ROLE_INFO APInfo;\r
MTRR_SETTINGS MtrrTable;\r
+ UINT8 ApLoopMode;\r
+ UINT8 ApTargetCState;\r
PEI_CPU_DATA *CpuData;\r
volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;\r
};\r