summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/Library/MpInitLib
diff options
context:
space:
mode:
Diffstat (limited to 'UefiCpuPkg/Library/MpInitLib')
-rw-r--r--UefiCpuPkg/Library/MpInitLib/DxeMpLib.c246
-rw-r--r--UefiCpuPkg/Library/MpInitLib/Microcode.c134
-rw-r--r--UefiCpuPkg/Library/MpInitLib/MpLib.c761
-rw-r--r--UefiCpuPkg/Library/MpInitLib/MpLib.h353
-rw-r--r--UefiCpuPkg/Library/MpInitLib/PeiMpLib.c166
5 files changed, 878 insertions, 782 deletions
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 93fc63bf93..9d9206d209 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -18,21 +18,21 @@
#include <Protocol/Timer.h>
-#define AP_SAFE_STACK_SIZE 128
+#define AP_SAFE_STACK_SIZE 128
-CPU_MP_DATA *mCpuMpData = NULL;
-EFI_EVENT mCheckAllApsEvent = NULL;
-EFI_EVENT mMpInitExitBootServicesEvent = NULL;
-EFI_EVENT mLegacyBootEvent = NULL;
-volatile BOOLEAN mStopCheckAllApsStatus = TRUE;
-VOID *mReservedApLoopFunc = NULL;
-UINTN mReservedTopOfApStack;
-volatile UINT32 mNumberToFinish = 0;
+CPU_MP_DATA *mCpuMpData = NULL;
+EFI_EVENT mCheckAllApsEvent = NULL;
+EFI_EVENT mMpInitExitBootServicesEvent = NULL;
+EFI_EVENT mLegacyBootEvent = NULL;
+volatile BOOLEAN mStopCheckAllApsStatus = TRUE;
+VOID *mReservedApLoopFunc = NULL;
+UINTN mReservedTopOfApStack;
+volatile UINT32 mNumberToFinish = 0;
//
// Begin wakeup buffer allocation below 0x88000
//
-STATIC EFI_PHYSICAL_ADDRESS mSevEsDxeWakeupBuffer = 0x88000;
+STATIC EFI_PHYSICAL_ADDRESS mSevEsDxeWakeupBuffer = 0x88000;
/**
Enable Debug Agent to support source debugging on AP function.
@@ -70,7 +70,7 @@ GetCpuMpData (
**/
VOID
SaveCpuMpData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
mCpuMpData = CpuMpData;
@@ -86,12 +86,12 @@ SaveCpuMpData (
**/
UINTN
GetWakeupBuffer (
- IN UINTN WakeupBufferSize
+ IN UINTN WakeupBufferSize
)
{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS StartAddress;
- EFI_MEMORY_TYPE MemoryType;
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS StartAddress;
+ EFI_MEMORY_TYPE MemoryType;
if (PcdGetBool (PcdSevEsIsEnabled)) {
MemoryType = EfiReservedMemoryType;
@@ -115,6 +115,7 @@ GetWakeupBuffer (
} else {
StartAddress = 0x88000;
}
+
Status = gBS->AllocatePages (
AllocateMaxAddress,
MemoryType,
@@ -123,7 +124,7 @@ GetWakeupBuffer (
);
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) {
- StartAddress = (EFI_PHYSICAL_ADDRESS) -1;
+ StartAddress = (EFI_PHYSICAL_ADDRESS)-1;
} else if (PcdGetBool (PcdSevEsIsEnabled)) {
//
// Next SEV-ES wakeup buffer allocation must be below this allocation
@@ -131,10 +132,14 @@ GetWakeupBuffer (
mSevEsDxeWakeupBuffer = StartAddress;
}
- DEBUG ((DEBUG_INFO, "WakeupBufferStart = %x, WakeupBufferSize = %x\n",
- (UINTN) StartAddress, WakeupBufferSize));
+ DEBUG ((
+ DEBUG_INFO,
+ "WakeupBufferStart = %x, WakeupBufferSize = %x\n",
+ (UINTN)StartAddress,
+ WakeupBufferSize
+ ));
- return (UINTN) StartAddress;
+ return (UINTN)StartAddress;
}
/**
@@ -151,19 +156,19 @@ GetWakeupBuffer (
**/
UINTN
GetModeTransitionBuffer (
- IN UINTN BufferSize
+ IN UINTN BufferSize
)
{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS StartAddress;
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS StartAddress;
StartAddress = BASE_4GB - 1;
- Status = gBS->AllocatePages (
- AllocateMaxAddress,
- EfiBootServicesCode,
- EFI_SIZE_TO_PAGES (BufferSize),
- &StartAddress
- );
+ Status = gBS->AllocatePages (
+ AllocateMaxAddress,
+ EfiBootServicesCode,
+ EFI_SIZE_TO_PAGES (BufferSize),
+ &StartAddress
+ );
if (EFI_ERROR (Status)) {
StartAddress = 0;
}
@@ -194,27 +199,27 @@ GetSevEsAPMemory (
// Allocate 1 page for AP jump table page
//
StartAddress = BASE_4GB - 1;
- Status = gBS->AllocatePages (
- AllocateMaxAddress,
- EfiReservedMemoryType,
- 1,
- &StartAddress
- );
+ Status = gBS->AllocatePages (
+ AllocateMaxAddress,
+ EfiReservedMemoryType,
+ 1,
+ &StartAddress
+ );
ASSERT_EFI_ERROR (Status);
- DEBUG ((DEBUG_INFO, "Dxe: SevEsAPMemory = %lx\n", (UINTN) StartAddress));
+ DEBUG ((DEBUG_INFO, "Dxe: SevEsAPMemory = %lx\n", (UINTN)StartAddress));
//
// Save the SevEsAPMemory as the AP jump table.
//
Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);
- Ghcb = Msr.Ghcb;
+ Ghcb = Msr.Ghcb;
VmgInit (Ghcb, &InterruptState);
- VmgExit (Ghcb, SVM_EXIT_AP_JUMP_TABLE, 0, (UINT64) (UINTN) StartAddress);
+ VmgExit (Ghcb, SVM_EXIT_AP_JUMP_TABLE, 0, (UINT64)(UINTN)StartAddress);
VmgDone (Ghcb, InterruptState);
- return (UINTN) StartAddress;
+ return (UINTN)StartAddress;
}
/**
@@ -226,9 +231,9 @@ CheckAndUpdateApsStatus (
VOID
)
{
- UINTN ProcessorNumber;
- EFI_STATUS Status;
- CPU_MP_DATA *CpuMpData;
+ UINTN ProcessorNumber;
+ EFI_STATUS Status;
+ CPU_MP_DATA *CpuMpData;
CpuMpData = GetCpuMpData ();
@@ -236,13 +241,12 @@ CheckAndUpdateApsStatus (
// First, check whether pending StartupAllAPs() exists.
//
if (CpuMpData->WaitEvent != NULL) {
-
Status = CheckAllAPs ();
//
// If all APs finish for StartupAllAPs(), signal the WaitEvent for it.
//
if (Status != EFI_NOT_READY) {
- Status = gBS->SignalEvent (CpuMpData->WaitEvent);
+ Status = gBS->SignalEvent (CpuMpData->WaitEvent);
CpuMpData->WaitEvent = NULL;
}
}
@@ -251,7 +255,6 @@ CheckAndUpdateApsStatus (
// Second, check whether pending StartupThisAPs() callings exist.
//
for (ProcessorNumber = 0; ProcessorNumber < CpuMpData->CpuCount; ProcessorNumber++) {
-
if (CpuMpData->CpuData[ProcessorNumber].WaitEvent == NULL) {
continue;
}
@@ -260,7 +263,7 @@ CheckAndUpdateApsStatus (
if (Status != EFI_NOT_READY) {
gBS->SignalEvent (CpuMpData->CpuData[ProcessorNumber].WaitEvent);
- CpuMpData->CpuData[ProcessorNumber].WaitEvent = NULL;
+ CpuMpData->CpuData[ProcessorNumber].WaitEvent = NULL;
}
}
}
@@ -279,8 +282,8 @@ CheckAndUpdateApsStatus (
VOID
EFIAPI
CheckApsStatus (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
//
@@ -307,18 +310,20 @@ GetProtectedMode16CS (
UINTN GdtEntryCount;
UINT16 Index;
- Index = (UINT16) -1;
+ Index = (UINT16)-1;
AsmReadGdtr (&GdtrDesc);
GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
- GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
if (GdtEntry->Bits.L == 0) {
- if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.DB == 0) {
+ if ((GdtEntry->Bits.Type > 8) && (GdtEntry->Bits.DB == 0)) {
break;
}
}
+
GdtEntry++;
}
+
ASSERT (Index != GdtEntryCount);
return Index * 8;
}
@@ -340,15 +345,17 @@ GetProtectedModeCS (
AsmReadGdtr (&GdtrDesc);
GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
- GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
if (GdtEntry->Bits.L == 0) {
- if (GdtEntry->Bits.Type > 8 && GdtEntry->Bits.DB == 1) {
+ if ((GdtEntry->Bits.Type > 8) && (GdtEntry->Bits.DB == 1)) {
break;
}
}
+
GdtEntry++;
}
+
ASSERT (Index != GdtEntryCount);
return Index * 8;
}
@@ -364,11 +371,11 @@ RelocateApLoop (
IN OUT VOID *Buffer
)
{
- CPU_MP_DATA *CpuMpData;
- BOOLEAN MwaitSupport;
- ASM_RELOCATE_AP_LOOP AsmRelocateApLoopFunc;
- UINTN ProcessorNumber;
- UINTN StackStart;
+ CPU_MP_DATA *CpuMpData;
+ BOOLEAN MwaitSupport;
+ ASM_RELOCATE_AP_LOOP AsmRelocateApLoopFunc;
+ UINTN ProcessorNumber;
+ UINTN StackStart;
MpInitLibWhoAmI (&ProcessorNumber);
CpuMpData = GetCpuMpData ();
@@ -378,13 +385,14 @@ RelocateApLoop (
} else {
StackStart = mReservedTopOfApStack;
}
- AsmRelocateApLoopFunc = (ASM_RELOCATE_AP_LOOP) (UINTN) mReservedApLoopFunc;
+
+ AsmRelocateApLoopFunc = (ASM_RELOCATE_AP_LOOP)(UINTN)mReservedApLoopFunc;
AsmRelocateApLoopFunc (
MwaitSupport,
CpuMpData->ApTargetCState,
CpuMpData->PmCodeSegment,
StackStart - ProcessorNumber * AP_SAFE_STACK_SIZE,
- (UINTN) &mNumberToFinish,
+ (UINTN)&mNumberToFinish,
CpuMpData->Pm16CodeSegment,
CpuMpData->SevEsAPBuffer,
CpuMpData->WakeupBuffer
@@ -406,32 +414,32 @@ RelocateApLoop (
VOID
EFIAPI
MpInitChangeApLoopCallback (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
- CPU_MP_DATA *CpuMpData;
+ CPU_MP_DATA *CpuMpData;
- CpuMpData = GetCpuMpData ();
- CpuMpData->PmCodeSegment = GetProtectedModeCS ();
+ CpuMpData = GetCpuMpData ();
+ CpuMpData->PmCodeSegment = GetProtectedModeCS ();
CpuMpData->Pm16CodeSegment = GetProtectedMode16CS ();
- CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);
- mNumberToFinish = CpuMpData->CpuCount - 1;
+ CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);
+ mNumberToFinish = CpuMpData->CpuCount - 1;
WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, NULL, TRUE);
while (mNumberToFinish > 0) {
CpuPause ();
}
- if (CpuMpData->SevEsIsEnabled && (CpuMpData->WakeupBuffer != (UINTN) -1)) {
+ if (CpuMpData->SevEsIsEnabled && (CpuMpData->WakeupBuffer != (UINTN)-1)) {
//
// There are APs present. Re-use reserved memory area below 1MB from
// WakeupBuffer as the area to be used for transitioning to 16-bit mode
// in support of booting of the AP by an OS.
//
CopyMem (
- (VOID *) CpuMpData->WakeupBuffer,
- (VOID *) (CpuMpData->AddressMap.RendezvousFunnelAddress +
- CpuMpData->AddressMap.SwitchToRealPM16ModeOffset),
+ (VOID *)CpuMpData->WakeupBuffer,
+ (VOID *)(CpuMpData->AddressMap.RendezvousFunnelAddress +
+ CpuMpData->AddressMap.SwitchToRealPM16ModeOffset),
CpuMpData->AddressMap.SwitchToRealPM16ModeSize
);
}
@@ -446,16 +454,16 @@ MpInitChangeApLoopCallback (
**/
VOID
InitMpGlobalData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- EFI_STATUS Status;
- EFI_PHYSICAL_ADDRESS Address;
- UINTN ApSafeBufferSize;
- UINTN Index;
- EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc;
- UINTN StackBase;
- CPU_INFO_IN_HOB *CpuInfoInHob;
+ EFI_STATUS Status;
+ EFI_PHYSICAL_ADDRESS Address;
+ UINTN ApSafeBufferSize;
+ UINTN Index;
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc;
+ UINTN StackBase;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
SaveCpuMpData (CpuMpData);
@@ -485,7 +493,7 @@ InitMpGlobalData (
//
CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
for (Index = 0; Index < CpuMpData->CpuCount; ++Index) {
- if (CpuInfoInHob != NULL && CpuInfoInHob[Index].ApTopOfStack != 0) {
+ if ((CpuInfoInHob != NULL) && (CpuInfoInHob[Index].ApTopOfStack != 0)) {
StackBase = (UINTN)CpuInfoInHob[Index].ApTopOfStack - CpuMpData->CpuApStackSize;
} else {
StackBase = CpuMpData->Buffer + Index * CpuMpData->CpuApStackSize;
@@ -501,8 +509,12 @@ InitMpGlobalData (
);
ASSERT_EFI_ERROR (Status);
- DEBUG ((DEBUG_INFO, "Stack Guard set at %lx [cpu%lu]!\n",
- (UINT64)StackBase, (UINT64)Index));
+ DEBUG ((
+ DEBUG_INFO,
+ "Stack Guard set at %lx [cpu%lu]!\n",
+ (UINT64)StackBase,
+ (UINT64)Index
+ ));
}
}
@@ -514,9 +526,11 @@ InitMpGlobalData (
// Allocating it in advance since memory services are not available in
// Exit Boot Services callback function.
//
- ApSafeBufferSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (
- CpuMpData->AddressMap.RelocateApLoopFuncSize
- ));
+ ApSafeBufferSize = EFI_PAGES_TO_SIZE (
+ EFI_SIZE_TO_PAGES (
+ CpuMpData->AddressMap.RelocateApLoopFuncSize
+ )
+ );
Address = BASE_4GB - 1;
Status = gBS->AllocatePages (
AllocateMaxAddress,
@@ -526,7 +540,7 @@ InitMpGlobalData (
);
ASSERT_EFI_ERROR (Status);
- mReservedApLoopFunc = (VOID *) (UINTN) Address;
+ mReservedApLoopFunc = (VOID *)(UINTN)Address;
ASSERT (mReservedApLoopFunc != NULL);
//
@@ -545,9 +559,11 @@ InitMpGlobalData (
);
}
- ApSafeBufferSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (
- CpuMpData->CpuCount * AP_SAFE_STACK_SIZE
- ));
+ ApSafeBufferSize = EFI_PAGES_TO_SIZE (
+ EFI_SIZE_TO_PAGES (
+ CpuMpData->CpuCount * AP_SAFE_STACK_SIZE
+ )
+ );
Address = BASE_4GB - 1;
Status = gBS->AllocatePages (
AllocateMaxAddress,
@@ -557,7 +573,7 @@ InitMpGlobalData (
);
ASSERT_EFI_ERROR (Status);
- mReservedTopOfApStack = (UINTN) Address + ApSafeBufferSize;
+ mReservedTopOfApStack = (UINTN)Address + ApSafeBufferSize;
ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);
CopyMem (
mReservedApLoopFunc,
@@ -684,15 +700,15 @@ InitMpGlobalData (
EFI_STATUS
EFIAPI
MpInitLibStartupAllAPs (
- IN EFI_AP_PROCEDURE Procedure,
- IN BOOLEAN SingleThread,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT UINTN **FailedCpuList OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN BOOLEAN SingleThread,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT UINTN **FailedCpuList OPTIONAL
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
//
// Temporarily stop checkAllApsStatus for avoid resource dead-lock.
@@ -791,15 +807,15 @@ MpInitLibStartupAllAPs (
EFI_STATUS
EFIAPI
MpInitLibStartupThisAP (
- IN EFI_AP_PROCEDURE Procedure,
- IN UINTN ProcessorNumber,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT BOOLEAN *Finished OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN ProcessorNumber,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT BOOLEAN *Finished OPTIONAL
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
//
// temporarily stop checkAllApsStatus for avoid resource dead-lock.
@@ -849,19 +865,19 @@ MpInitLibStartupThisAP (
EFI_STATUS
EFIAPI
MpInitLibSwitchBSP (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableOldBSP
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableOldBSP
)
{
- EFI_STATUS Status;
- EFI_TIMER_ARCH_PROTOCOL *Timer;
- UINT64 TimerPeriod;
+ EFI_STATUS Status;
+ EFI_TIMER_ARCH_PROTOCOL *Timer;
+ UINT64 TimerPeriod;
TimerPeriod = 0;
//
// Locate Timer Arch Protocol
//
- Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **) &Timer);
+ Status = gBS->LocateProtocol (&gEfiTimerArchProtocolGuid, NULL, (VOID **)&Timer);
if (EFI_ERROR (Status)) {
Timer = NULL;
}
@@ -922,13 +938,13 @@ MpInitLibSwitchBSP (
EFI_STATUS
EFIAPI
MpInitLibEnableDisableAP (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableAP,
- IN UINT32 *HealthFlag OPTIONAL
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableAP,
+ IN UINT32 *HealthFlag OPTIONAL
)
{
- EFI_STATUS Status;
- BOOLEAN TempStopCheckState;
+ EFI_STATUS Status;
+ BOOLEAN TempStopCheckState;
TempStopCheckState = FALSE;
//
@@ -961,7 +977,7 @@ MpInitLibEnableDisableAP (
**/
EFI_STATUS
PlatformShadowMicrocode (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
//
diff --git a/UefiCpuPkg/Library/MpInitLib/Microcode.c b/UefiCpuPkg/Library/MpInitLib/Microcode.c
index 105a9f84bf..f9f070fa8b 100644
--- a/UefiCpuPkg/Library/MpInitLib/Microcode.c
+++ b/UefiCpuPkg/Library/MpInitLib/Microcode.c
@@ -18,17 +18,17 @@
**/
VOID
MicrocodeDetect (
- IN CPU_MP_DATA *CpuMpData,
- IN UINTN ProcessorNumber
+ IN CPU_MP_DATA *CpuMpData,
+ IN UINTN ProcessorNumber
)
{
- CPU_MICROCODE_HEADER *Microcode;
- UINTN MicrocodeEnd;
- CPU_AP_DATA *BspData;
- UINT32 LatestRevision;
- CPU_MICROCODE_HEADER *LatestMicrocode;
- UINT32 ThreadId;
- EDKII_PEI_MICROCODE_CPU_ID MicrocodeCpuId;
+ CPU_MICROCODE_HEADER *Microcode;
+ UINTN MicrocodeEnd;
+ CPU_AP_DATA *BspData;
+ UINT32 LatestRevision;
+ CPU_MICROCODE_HEADER *LatestMicrocode;
+ UINT32 ThreadId;
+ EDKII_PEI_MICROCODE_CPU_ID MicrocodeCpuId;
if (CpuMpData->MicrocodePatchRegionSize == 0) {
//
@@ -47,7 +47,7 @@ MicrocodeDetect (
GetProcessorMicrocodeCpuId (&MicrocodeCpuId);
- if (ProcessorNumber != (UINTN) CpuMpData->BspNumber) {
+ if (ProcessorNumber != (UINTN)CpuMpData->BspNumber) {
//
// Direct use microcode of BSP if AP is the same as BSP.
// Assume BSP calls this routine() before AP.
@@ -55,8 +55,9 @@ MicrocodeDetect (
BspData = &(CpuMpData->CpuData[CpuMpData->BspNumber]);
if ((BspData->ProcessorSignature == MicrocodeCpuId.ProcessorSignature) &&
(BspData->PlatformId == MicrocodeCpuId.PlatformId) &&
- (BspData->MicrocodeEntryAddr != 0)) {
- LatestMicrocode = (CPU_MICROCODE_HEADER *)(UINTN) BspData->MicrocodeEntryAddr;
+ (BspData->MicrocodeEntryAddr != 0))
+ {
+ LatestMicrocode = (CPU_MICROCODE_HEADER *)(UINTN)BspData->MicrocodeEntryAddr;
LatestRevision = LatestMicrocode->UpdateRevision;
goto LoadMicrocode;
}
@@ -69,11 +70,11 @@ MicrocodeDetect (
//
LatestRevision = 0;
LatestMicrocode = NULL;
- Microcode = (CPU_MICROCODE_HEADER *) (UINTN) CpuMpData->MicrocodePatchAddress;
- MicrocodeEnd = (UINTN) Microcode + (UINTN) CpuMpData->MicrocodePatchRegionSize;
+ Microcode = (CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->MicrocodePatchAddress;
+ MicrocodeEnd = (UINTN)Microcode + (UINTN)CpuMpData->MicrocodePatchRegionSize;
do {
- if (!IsValidMicrocode (Microcode, MicrocodeEnd - (UINTN) Microcode, LatestRevision, &MicrocodeCpuId, 1, TRUE)) {
+ if (!IsValidMicrocode (Microcode, MicrocodeEnd - (UINTN)Microcode, LatestRevision, &MicrocodeCpuId, 1, TRUE)) {
//
// It is the padding data between the microcode patches for microcode patches alignment.
// Because the microcode patch is the multiple of 1-KByte, the padding data should not
@@ -81,14 +82,15 @@ MicrocodeDetect (
// alignment value should be larger than 1-KByte. We could skip SIZE_1KB padding data to
// find the next possible microcode patch header.
//
- Microcode = (CPU_MICROCODE_HEADER *) ((UINTN) Microcode + SIZE_1KB);
+ Microcode = (CPU_MICROCODE_HEADER *)((UINTN)Microcode + SIZE_1KB);
continue;
}
+
LatestMicrocode = Microcode;
LatestRevision = LatestMicrocode->UpdateRevision;
- Microcode = (CPU_MICROCODE_HEADER *) (((UINTN) Microcode) + GetMicrocodeLength (Microcode));
- } while ((UINTN) Microcode < MicrocodeEnd);
+ Microcode = (CPU_MICROCODE_HEADER *)(((UINTN)Microcode) + GetMicrocodeLength (Microcode));
+ } while ((UINTN)Microcode < MicrocodeEnd);
LoadMicrocode:
if (LatestRevision != 0) {
@@ -97,7 +99,7 @@ LoadMicrocode:
// patch header) for each processor even it's the same as the loaded one.
// It will be used when building the microcode patch cache HOB.
//
- CpuMpData->CpuData[ProcessorNumber].MicrocodeEntryAddr = (UINTN) LatestMicrocode;
+ CpuMpData->CpuData[ProcessorNumber].MicrocodeEntryAddr = (UINTN)LatestMicrocode;
}
if (LatestRevision > GetProcessorMicrocodeSignature ()) {
@@ -109,6 +111,7 @@ LoadMicrocode:
//
LoadMicrocode (LatestMicrocode);
}
+
//
// It's possible that the microcode fails to load. Just capture the CPU microcode revision after loading.
//
@@ -129,15 +132,15 @@ LoadMicrocode:
**/
VOID
ShadowMicrocodePatchWorker (
- IN OUT CPU_MP_DATA *CpuMpData,
- IN MICROCODE_PATCH_INFO *Patches,
- IN UINTN PatchCount,
- IN UINTN TotalLoadSize
+ IN OUT CPU_MP_DATA *CpuMpData,
+ IN MICROCODE_PATCH_INFO *Patches,
+ IN UINTN PatchCount,
+ IN UINTN TotalLoadSize
)
{
- UINTN Index;
- VOID *MicrocodePatchInRam;
- UINT8 *Walker;
+ UINTN Index;
+ VOID *MicrocodePatchInRam;
+ UINT8 *Walker;
ASSERT ((Patches != NULL) && (PatchCount != 0));
@@ -152,7 +155,7 @@ ShadowMicrocodePatchWorker (
for (Walker = MicrocodePatchInRam, Index = 0; Index < PatchCount; Index++) {
CopyMem (
Walker,
- (VOID *) Patches[Index].Address,
+ (VOID *)Patches[Index].Address,
Patches[Index].Size
);
Walker += Patches[Index].Size;
@@ -161,13 +164,15 @@ ShadowMicrocodePatchWorker (
//
// Update the microcode patch related fields in CpuMpData
//
- CpuMpData->MicrocodePatchAddress = (UINTN) MicrocodePatchInRam;
+ CpuMpData->MicrocodePatchAddress = (UINTN)MicrocodePatchInRam;
CpuMpData->MicrocodePatchRegionSize = TotalLoadSize;
DEBUG ((
DEBUG_INFO,
"%a: Required microcode patches have been loaded at 0x%lx, with size 0x%lx.\n",
- __FUNCTION__, CpuMpData->MicrocodePatchAddress, CpuMpData->MicrocodePatchRegionSize
+ __FUNCTION__,
+ CpuMpData->MicrocodePatchAddress,
+ CpuMpData->MicrocodePatchRegionSize
));
return;
@@ -181,19 +186,19 @@ ShadowMicrocodePatchWorker (
**/
VOID
ShadowMicrocodePatchByPcd (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
- UINTN Index;
- CPU_MICROCODE_HEADER *MicrocodeEntryPoint;
- UINTN MicrocodeEnd;
- UINTN TotalSize;
- MICROCODE_PATCH_INFO *PatchInfoBuffer;
- UINTN MaxPatchNumber;
- UINTN PatchCount;
- UINTN TotalLoadSize;
- EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds;
- BOOLEAN Valid;
+ UINTN Index;
+ CPU_MICROCODE_HEADER *MicrocodeEntryPoint;
+ UINTN MicrocodeEnd;
+ UINTN TotalSize;
+ MICROCODE_PATCH_INFO *PatchInfoBuffer;
+ UINTN MaxPatchNumber;
+ UINTN PatchCount;
+ UINTN TotalLoadSize;
+ EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuIds;
+ BOOLEAN Valid;
//
// Initialize the microcode patch related fields in CpuMpData as the values
@@ -203,10 +208,10 @@ ShadowMicrocodePatchByPcd (
CpuMpData->MicrocodePatchAddress = PcdGet64 (PcdCpuMicrocodePatchAddress);
CpuMpData->MicrocodePatchRegionSize = PcdGet64 (PcdCpuMicrocodePatchRegionSize);
- MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (UINTN) CpuMpData->MicrocodePatchAddress;
- MicrocodeEnd = (UINTN) MicrocodeEntryPoint +
- (UINTN) CpuMpData->MicrocodePatchRegionSize;
- if ((MicrocodeEntryPoint == NULL) || ((UINTN) MicrocodeEntryPoint == MicrocodeEnd)) {
+ MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->MicrocodePatchAddress;
+ MicrocodeEnd = (UINTN)MicrocodeEntryPoint +
+ (UINTN)CpuMpData->MicrocodePatchRegionSize;
+ if ((MicrocodeEntryPoint == NULL) || ((UINTN)MicrocodeEntryPoint == MicrocodeEnd)) {
//
// There is no microcode patches
//
@@ -242,7 +247,7 @@ ShadowMicrocodePatchByPcd (
do {
Valid = IsValidMicrocode (
MicrocodeEntryPoint,
- MicrocodeEnd - (UINTN) MicrocodeEntryPoint,
+ MicrocodeEnd - (UINTN)MicrocodeEntryPoint,
0,
MicrocodeCpuIds,
CpuMpData->CpuCount,
@@ -252,7 +257,7 @@ ShadowMicrocodePatchByPcd (
//
// Padding data between the microcode patches, skip 1KB to check next entry.
//
- MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) (((UINTN) MicrocodeEntryPoint) + SIZE_1KB);
+ MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)(((UINTN)MicrocodeEntryPoint) + SIZE_1KB);
continue;
}
@@ -277,6 +282,7 @@ ShadowMicrocodePatchByPcd (
if (PatchInfoBuffer == NULL) {
goto OnExit;
}
+
MaxPatchNumber = MaxPatchNumber * 2;
}
@@ -285,21 +291,23 @@ ShadowMicrocodePatchByPcd (
//
// Store the information of this microcode patch
//
- PatchInfoBuffer[PatchCount - 1].Address = (UINTN) MicrocodeEntryPoint;
+ PatchInfoBuffer[PatchCount - 1].Address = (UINTN)MicrocodeEntryPoint;
PatchInfoBuffer[PatchCount - 1].Size = TotalSize;
- TotalLoadSize += TotalSize;
+ TotalLoadSize += TotalSize;
//
// Process the next microcode patch
//
- MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *) ((UINTN) MicrocodeEntryPoint + TotalSize);
- } while ((UINTN) MicrocodeEntryPoint < MicrocodeEnd);
+ MicrocodeEntryPoint = (CPU_MICROCODE_HEADER *)((UINTN)MicrocodeEntryPoint + TotalSize);
+ } while ((UINTN)MicrocodeEntryPoint < MicrocodeEnd);
if (PatchCount != 0) {
DEBUG ((
DEBUG_INFO,
"%a: 0x%x microcode patches will be loaded into memory, with size 0x%x.\n",
- __FUNCTION__, PatchCount, TotalLoadSize
+ __FUNCTION__,
+ PatchCount,
+ TotalLoadSize
));
ShadowMicrocodePatchWorker (CpuMpData, PatchInfoBuffer, PatchCount, TotalLoadSize);
@@ -309,6 +317,7 @@ OnExit:
if (PatchInfoBuffer != NULL) {
FreePool (PatchInfoBuffer);
}
+
FreePages (MicrocodeCpuIds, EFI_SIZE_TO_PAGES (CpuMpData->CpuCount * sizeof (EDKII_PEI_MICROCODE_CPU_ID)));
}
@@ -319,10 +328,10 @@ OnExit:
**/
VOID
ShadowMicrocodeUpdatePatch (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
Status = PlatformShadowMicrocode (CpuMpData);
if (EFI_ERROR (Status)) {
@@ -347,16 +356,16 @@ ShadowMicrocodeUpdatePatch (
**/
BOOLEAN
GetMicrocodePatchInfoFromHob (
- UINT64 *Address,
- UINT64 *RegionSize
+ UINT64 *Address,
+ UINT64 *RegionSize
)
{
- EFI_HOB_GUID_TYPE *GuidHob;
- EDKII_MICROCODE_PATCH_HOB *MicrocodePathHob;
+ EFI_HOB_GUID_TYPE *GuidHob;
+ EDKII_MICROCODE_PATCH_HOB *MicrocodePathHob;
GuidHob = GetFirstGuidHob (&gEdkiiMicrocodePatchHobGuid);
if (GuidHob == NULL) {
- DEBUG((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n", __FUNCTION__));
+ DEBUG ((DEBUG_INFO, "%a: Microcode patch cache HOB is not found.\n", __FUNCTION__));
return FALSE;
}
@@ -365,9 +374,12 @@ GetMicrocodePatchInfoFromHob (
*Address = MicrocodePathHob->MicrocodePatchAddress;
*RegionSize = MicrocodePathHob->MicrocodePatchRegionSize;
- DEBUG((
- DEBUG_INFO, "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n",
- __FUNCTION__, *Address, *RegionSize
+ DEBUG ((
+ DEBUG_INFO,
+ "%a: MicrocodeBase = 0x%lx, MicrocodeSize = 0x%lx\n",
+ __FUNCTION__,
+ *Address,
+ *RegionSize
));
return TRUE;
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index b390c558d4..2d8e9512ab 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -13,8 +13,7 @@
#include <Register/Amd/Fam17Msr.h>
#include <Register/Amd/Ghcb.h>
-EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
-
+EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
/**
The function will check if BSP Execute Disable is enabled.
@@ -38,7 +37,7 @@ IsBspExecuteDisableEnabled (
BOOLEAN Enabled;
IA32_CR0 Cr0;
- Enabled = FALSE;
+ Enabled = FALSE;
Cr0.UintN = AsmReadCr0 ();
if (Cr0.Bits.PG != 0) {
//
@@ -78,12 +77,12 @@ IsBspExecuteDisableEnabled (
VOID
EFIAPI
FutureBSPProc (
- IN VOID *Buffer
+ IN VOID *Buffer
)
{
- CPU_MP_DATA *DataInHob;
+ CPU_MP_DATA *DataInHob;
- DataInHob = (CPU_MP_DATA *) Buffer;
+ DataInHob = (CPU_MP_DATA *)Buffer;
AsmExchangeRole (&DataInHob->APInfo, &DataInHob->BSPInfo);
}
@@ -96,7 +95,7 @@ FutureBSPProc (
**/
CPU_STATE
GetApState (
- IN CPU_AP_DATA *CpuData
+ IN CPU_AP_DATA *CpuData
)
{
return CpuData->State;
@@ -110,8 +109,8 @@ GetApState (
**/
VOID
SetApState (
- IN CPU_AP_DATA *CpuData,
- IN CPU_STATE State
+ IN CPU_AP_DATA *CpuData,
+ IN CPU_STATE State
)
{
AcquireSpinLock (&CpuData->ApLock);
@@ -126,7 +125,7 @@ SetApState (
**/
VOID
SaveLocalApicTimerSetting (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
//
@@ -148,7 +147,7 @@ SaveLocalApicTimerSetting (
**/
VOID
SyncLocalApicTimerSetting (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
//
@@ -173,10 +172,10 @@ SyncLocalApicTimerSetting (
**/
VOID
SaveVolatileRegisters (
- OUT CPU_VOLATILE_REGISTERS *VolatileRegisters
+ OUT CPU_VOLATILE_REGISTERS *VolatileRegisters
)
{
- CPUID_VERSION_INFO_EDX VersionInfoEdx;
+ CPUID_VERSION_INFO_EDX VersionInfoEdx;
VolatileRegisters->Cr0 = AsmReadCr0 ();
VolatileRegisters->Cr3 = AsmReadCr3 ();
@@ -210,12 +209,12 @@ SaveVolatileRegisters (
**/
VOID
RestoreVolatileRegisters (
- IN CPU_VOLATILE_REGISTERS *VolatileRegisters,
- IN BOOLEAN IsRestoreDr
+ IN CPU_VOLATILE_REGISTERS *VolatileRegisters,
+ IN BOOLEAN IsRestoreDr
)
{
- CPUID_VERSION_INFO_EDX VersionInfoEdx;
- IA32_TSS_DESCRIPTOR *Tss;
+ CPUID_VERSION_INFO_EDX VersionInfoEdx;
+ IA32_TSS_DESCRIPTOR *Tss;
AsmWriteCr3 (VolatileRegisters->Cr3);
AsmWriteCr4 (VolatileRegisters->Cr4);
@@ -239,8 +238,9 @@ RestoreVolatileRegisters (
AsmWriteGdtr (&VolatileRegisters->Gdtr);
AsmWriteIdtr (&VolatileRegisters->Idtr);
- if (VolatileRegisters->Tr != 0 &&
- VolatileRegisters->Tr < VolatileRegisters->Gdtr.Limit) {
+ if ((VolatileRegisters->Tr != 0) &&
+ (VolatileRegisters->Tr < VolatileRegisters->Gdtr.Limit))
+ {
Tss = (IA32_TSS_DESCRIPTOR *)(VolatileRegisters->Gdtr.Base +
VolatileRegisters->Tr);
if (Tss->Bits.P == 1) {
@@ -261,7 +261,7 @@ IsMwaitSupport (
VOID
)
{
- CPUID_VERSION_INFO_ECX VersionInfoEcx;
+ CPUID_VERSION_INFO_ECX VersionInfoEcx;
AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, &VersionInfoEcx.Uint32, NULL);
return (VersionInfoEcx.Bits.MONITOR == 1) ? TRUE : FALSE;
@@ -276,11 +276,11 @@ IsMwaitSupport (
**/
UINT8
GetApLoopMode (
- OUT UINT32 *MonitorFilterSize
+ OUT UINT32 *MonitorFilterSize
)
{
- UINT8 ApLoopMode;
- CPUID_MONITOR_MWAIT_EBX MonitorMwaitEbx;
+ UINT8 ApLoopMode;
+ CPUID_MONITOR_MWAIT_EBX MonitorMwaitEbx;
ASSERT (MonitorFilterSize != NULL);
@@ -328,20 +328,20 @@ GetApLoopMode (
**/
VOID
SortApicId (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- UINTN Index1;
- UINTN Index2;
- UINTN Index3;
- UINT32 ApicId;
- CPU_INFO_IN_HOB CpuInfo;
- UINT32 ApCount;
- CPU_INFO_IN_HOB *CpuInfoInHob;
- volatile UINT32 *StartupApSignal;
-
- ApCount = CpuMpData->CpuCount - 1;
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ UINTN Index1;
+ UINTN Index2;
+ UINTN Index3;
+ UINT32 ApicId;
+ CPU_INFO_IN_HOB CpuInfo;
+ UINT32 ApCount;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ volatile UINT32 *StartupApSignal;
+
+ ApCount = CpuMpData->CpuCount - 1;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
if (ApCount != 0) {
for (Index1 = 0; Index1 < ApCount; Index1++) {
Index3 = Index1;
@@ -355,6 +355,7 @@ SortApicId (
ApicId = CpuInfoInHob[Index2].ApicId;
}
}
+
if (Index3 != Index1) {
CopyMem (&CpuInfo, &CpuInfoInHob[Index3], sizeof (CPU_INFO_IN_HOB));
CopyMem (
@@ -367,7 +368,7 @@ SortApicId (
//
// Also exchange the StartupApSignal.
//
- StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal;
+ StartupApSignal = CpuMpData->CpuData[Index3].StartupApSignal;
CpuMpData->CpuData[Index3].StartupApSignal =
CpuMpData->CpuData[Index1].StartupApSignal;
CpuMpData->CpuData[Index1].StartupApSignal = StartupApSignal;
@@ -380,7 +381,7 @@ SortApicId (
ApicId = GetInitialApicId ();
for (Index1 = 0; Index1 < CpuMpData->CpuCount; Index1++) {
if (CpuInfoInHob[Index1].ApicId == ApicId) {
- CpuMpData->BspNumber = (UINT32) Index1;
+ CpuMpData->BspNumber = (UINT32)Index1;
break;
}
}
@@ -416,8 +417,8 @@ ApInitializeSync (
UINTN ProcessorNumber;
EFI_STATUS Status;
- CpuMpData = (CPU_MP_DATA *) Buffer;
- Status = GetProcessorNumber (CpuMpData, &ProcessorNumber);
+ CpuMpData = (CPU_MP_DATA *)Buffer;
+ Status = GetProcessorNumber (CpuMpData, &ProcessorNumber);
ASSERT_EFI_ERROR (Status);
//
// Load microcode on AP
@@ -440,20 +441,20 @@ ApInitializeSync (
**/
EFI_STATUS
GetProcessorNumber (
- IN CPU_MP_DATA *CpuMpData,
- OUT UINTN *ProcessorNumber
+ IN CPU_MP_DATA *CpuMpData,
+ OUT UINTN *ProcessorNumber
)
{
- UINTN TotalProcessorNumber;
- UINTN Index;
- CPU_INFO_IN_HOB *CpuInfoInHob;
- UINT32 CurrentApicId;
+ UINTN TotalProcessorNumber;
+ UINTN Index;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ UINT32 CurrentApicId;
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
TotalProcessorNumber = CpuMpData->CpuCount;
- CurrentApicId = GetApicId ();
- for (Index = 0; Index < TotalProcessorNumber; Index ++) {
+ CurrentApicId = GetApicId ();
+ for (Index = 0; Index < TotalProcessorNumber; Index++) {
if (CpuInfoInHob[Index].ApicId == CurrentApicId) {
*ProcessorNumber = Index;
return EFI_SUCCESS;
@@ -472,12 +473,12 @@ GetProcessorNumber (
**/
UINTN
CollectProcessorCount (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- UINTN Index;
- CPU_INFO_IN_HOB *CpuInfoInHob;
- BOOLEAN X2Apic;
+ UINTN Index;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ BOOLEAN X2Apic;
//
// Send 1st broadcast IPI to APs to wakeup APs
@@ -504,7 +505,7 @@ CollectProcessorCount (
//
X2Apic = TRUE;
} else {
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
if (CpuInfoInHob[Index].InitialApicId >= 0xFF) {
X2Apic = TRUE;
@@ -525,6 +526,7 @@ CollectProcessorCount (
while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) {
CpuPause ();
}
+
//
// Enable x2APIC on BSP
//
@@ -536,6 +538,7 @@ CollectProcessorCount (
SetApState (&CpuMpData->CpuData[Index], CpuStateIdle);
}
}
+
DEBUG ((DEBUG_INFO, "APIC MODE is %d\n", GetApicMode ()));
//
// Sort BSP/Aps by CPU APIC ID in ascending order
@@ -558,16 +561,16 @@ CollectProcessorCount (
**/
VOID
InitializeApData (
- IN OUT CPU_MP_DATA *CpuMpData,
- IN UINTN ProcessorNumber,
- IN UINT32 BistData,
- IN UINT64 ApTopOfStack
+ IN OUT CPU_MP_DATA *CpuMpData,
+ IN UINTN ProcessorNumber,
+ IN UINT32 BistData,
+ IN UINT64 ApTopOfStack
)
{
- CPU_INFO_IN_HOB *CpuInfoInHob;
- MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr;
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
CpuInfoInHob[ProcessorNumber].InitialApicId = GetInitialApicId ();
CpuInfoInHob[ProcessorNumber].ApicId = GetApicId ();
CpuInfoInHob[ProcessorNumber].Health = BistData;
@@ -580,7 +583,7 @@ InitializeApData (
// NOTE: PlatformId is not relevant on AMD platforms.
//
if (!StandardSignatureIsAuthenticAMD ()) {
- PlatformIdMsr.Uint64 = AsmReadMsr64 (MSR_IA32_PLATFORM_ID);
+ PlatformIdMsr.Uint64 = AsmReadMsr64 (MSR_IA32_PLATFORM_ID);
CpuMpData->CpuData[ProcessorNumber].PlatformId = (UINT8)PlatformIdMsr.Bits.PlatformId;
}
@@ -592,7 +595,7 @@ InitializeApData (
NULL
);
- InitializeSpinLock(&CpuMpData->CpuData[ProcessorNumber].ApLock);
+ InitializeSpinLock (&CpuMpData->CpuData[ProcessorNumber].ApLock);
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);
}
@@ -613,18 +616,21 @@ GetProtectedMode16CS (
UINTN GdtEntryCount;
UINT16 Index;
- Index = (UINT16) -1;
+ Index = (UINT16)-1;
AsmReadGdtr (&GdtrDesc);
GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
- GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
- if (GdtEntry->Bits.L == 0 &&
- GdtEntry->Bits.DB == 0 &&
- GdtEntry->Bits.Type > 8) {
+ if ((GdtEntry->Bits.L == 0) &&
+ (GdtEntry->Bits.DB == 0) &&
+ (GdtEntry->Bits.Type > 8))
+ {
break;
}
+
GdtEntry++;
}
+
ASSERT (Index != GdtEntryCount);
return Index * 8;
}
@@ -646,18 +652,21 @@ GetProtectedMode32CS (
UINTN GdtEntryCount;
UINT16 Index;
- Index = (UINT16) -1;
+ Index = (UINT16)-1;
AsmReadGdtr (&GdtrDesc);
GdtEntryCount = (GdtrDesc.Limit + 1) / sizeof (IA32_SEGMENT_DESCRIPTOR);
- GdtEntry = (IA32_SEGMENT_DESCRIPTOR *) GdtrDesc.Base;
+ GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
for (Index = 0; Index < GdtEntryCount; Index++) {
- if (GdtEntry->Bits.L == 0 &&
- GdtEntry->Bits.DB == 1 &&
- GdtEntry->Bits.Type > 8) {
+ if ((GdtEntry->Bits.L == 0) &&
+ (GdtEntry->Bits.DB == 1) &&
+ (GdtEntry->Bits.Type > 8))
+ {
break;
}
+
GdtEntry++;
}
+
ASSERT (Index != GdtEntryCount);
return Index * 8;
}
@@ -674,16 +683,16 @@ GetProtectedMode32CS (
STATIC
VOID
MpInitLibSevEsAPReset (
- IN GHCB *Ghcb,
- IN CPU_MP_DATA *CpuMpData
+ IN GHCB *Ghcb,
+ IN CPU_MP_DATA *CpuMpData
)
{
- EFI_STATUS Status;
- UINTN ProcessorNumber;
- UINT16 Code16, Code32;
- AP_RESET *APResetFn;
- UINTN BufferStart;
- UINTN StackStart;
+ EFI_STATUS Status;
+ UINTN ProcessorNumber;
+ UINT16 Code16, Code32;
+ AP_RESET *APResetFn;
+ UINTN BufferStart;
+ UINTN StackStart;
Status = GetProcessorNumber (CpuMpData, &ProcessorNumber);
ASSERT_EFI_ERROR (Status);
@@ -692,14 +701,14 @@ MpInitLibSevEsAPReset (
Code32 = GetProtectedMode32CS ();
if (CpuMpData->WakeupBufferHigh != 0) {
- APResetFn = (AP_RESET *) (CpuMpData->WakeupBufferHigh + CpuMpData->AddressMap.SwitchToRealNoNxOffset);
+ APResetFn = (AP_RESET *)(CpuMpData->WakeupBufferHigh + CpuMpData->AddressMap.SwitchToRealNoNxOffset);
} else {
- APResetFn = (AP_RESET *) (CpuMpData->MpCpuExchangeInfo->BufferStart + CpuMpData->AddressMap.SwitchToRealOffset);
+ APResetFn = (AP_RESET *)(CpuMpData->MpCpuExchangeInfo->BufferStart + CpuMpData->AddressMap.SwitchToRealOffset);
}
BufferStart = CpuMpData->MpCpuExchangeInfo->BufferStart;
- StackStart = CpuMpData->SevEsAPResetStackStart -
- (AP_RESET_STACK_SIZE * ProcessorNumber);
+ StackStart = CpuMpData->SevEsAPResetStackStart -
+ (AP_RESET_STACK_SIZE * ProcessorNumber);
//
// This call never returns.
@@ -716,19 +725,19 @@ MpInitLibSevEsAPReset (
VOID
EFIAPI
ApWakeupFunction (
- IN MP_CPU_EXCHANGE_INFO *ExchangeInfo,
- IN UINTN ApIndex
+ IN MP_CPU_EXCHANGE_INFO *ExchangeInfo,
+ IN UINTN ApIndex
)
{
- CPU_MP_DATA *CpuMpData;
- UINTN ProcessorNumber;
- EFI_AP_PROCEDURE Procedure;
- VOID *Parameter;
- UINT32 BistData;
- volatile UINT32 *ApStartupSignalBuffer;
- CPU_INFO_IN_HOB *CpuInfoInHob;
- UINT64 ApTopOfStack;
- UINTN CurrentApicMode;
+ CPU_MP_DATA *CpuMpData;
+ UINTN ProcessorNumber;
+ EFI_AP_PROCEDURE Procedure;
+ VOID *Parameter;
+ UINT32 BistData;
+ volatile UINT32 *ApStartupSignalBuffer;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ UINT64 ApTopOfStack;
+ UINTN CurrentApicMode;
//
// AP finished assembly code and begin to execute C code
@@ -753,8 +762,8 @@ ApWakeupFunction (
//
// This is first time AP wakeup, get BIST information from AP stack
//
- ApTopOfStack = CpuMpData->Buffer + (ProcessorNumber + 1) * CpuMpData->CpuApStackSize;
- BistData = *(UINT32 *) ((UINTN) ApTopOfStack - sizeof (UINTN));
+ ApTopOfStack = CpuMpData->Buffer + (ProcessorNumber + 1) * CpuMpData->CpuApStackSize;
+ BistData = *(UINT32 *)((UINTN)ApTopOfStack - sizeof (UINTN));
//
// CpuMpData->CpuData[0].VolatileRegisters is initialized based on BSP environment,
// to initialize AP in InitConfig path.
@@ -773,7 +782,7 @@ ApWakeupFunction (
//
ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal;
InterlockedCompareExchange32 (
- (UINT32 *) ApStartupSignalBuffer,
+ (UINT32 *)ApStartupSignalBuffer,
WAKEUP_AP_SIGNAL,
0
);
@@ -788,7 +797,7 @@ ApWakeupFunction (
// different IDT shared by all APs.
//
RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters, FALSE);
- } else {
+ } else {
if (CpuMpData->ApLoopMode == ApInHltLoop) {
//
// Restore AP's volatile registers saved before AP is halted
@@ -806,7 +815,7 @@ ApWakeupFunction (
if (GetApState (&CpuMpData->CpuData[ProcessorNumber]) == CpuStateReady) {
Procedure = (EFI_AP_PROCEDURE)CpuMpData->CpuData[ProcessorNumber].ApFunction;
- Parameter = (VOID *) CpuMpData->CpuData[ProcessorNumber].ApFunctionArgument;
+ Parameter = (VOID *)CpuMpData->CpuData[ProcessorNumber].ApFunctionArgument;
if (Procedure != NULL) {
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateBusy);
//
@@ -817,19 +826,20 @@ ApWakeupFunction (
// Invoke AP function here
//
Procedure (Parameter);
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
if (CpuMpData->SwitchBspFlag) {
//
// Re-get the processor number due to BSP/AP maybe exchange in AP function
//
GetProcessorNumber (CpuMpData, &ProcessorNumber);
- CpuMpData->CpuData[ProcessorNumber].ApFunction = 0;
+ CpuMpData->CpuData[ProcessorNumber].ApFunction = 0;
CpuMpData->CpuData[ProcessorNumber].ApFunctionArgument = 0;
- ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal;
- CpuInfoInHob[ProcessorNumber].ApTopOfStack = CpuInfoInHob[CpuMpData->NewBspNumber].ApTopOfStack;
+ ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal;
+ CpuInfoInHob[ProcessorNumber].ApTopOfStack = CpuInfoInHob[CpuMpData->NewBspNumber].ApTopOfStack;
} else {
- if (CpuInfoInHob[ProcessorNumber].ApicId != GetApicId () ||
- CpuInfoInHob[ProcessorNumber].InitialApicId != GetInitialApicId ()) {
+ if ((CpuInfoInHob[ProcessorNumber].ApicId != GetApicId ()) ||
+ (CpuInfoInHob[ProcessorNumber].InitialApicId != GetInitialApicId ()))
+ {
if (CurrentApicMode != GetApicMode ()) {
//
// If APIC mode change happened during AP function execution,
@@ -847,6 +857,7 @@ ApWakeupFunction (
}
}
}
+
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateFinished);
}
}
@@ -861,7 +872,7 @@ ApWakeupFunction (
//
// AP finished executing C code
//
- InterlockedIncrement ((UINT32 *) &CpuMpData->FinishedCount);
+ InterlockedIncrement ((UINT32 *)&CpuMpData->FinishedCount);
if (CpuMpData->InitFlag == ApInitConfig) {
//
@@ -870,7 +881,7 @@ ApWakeupFunction (
// performs another INIT-SIPI-SIPI sequence.
//
if (!CpuMpData->SevEsIsEnabled) {
- InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
+ InterlockedDecrement ((UINT32 *)&CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
}
}
@@ -890,11 +901,11 @@ ApWakeupFunction (
BOOLEAN DoDecrement;
BOOLEAN InterruptState;
- DoDecrement = (BOOLEAN) (CpuMpData->InitFlag == ApInitConfig);
+ DoDecrement = (BOOLEAN)(CpuMpData->InitFlag == ApInitConfig);
while (TRUE) {
Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);
- Ghcb = Msr.Ghcb;
+ Ghcb = Msr.Ghcb;
VmgInit (Ghcb, &InterruptState);
@@ -905,7 +916,7 @@ ApWakeupFunction (
// Perform the delayed decrement just before issuing the first
// VMGEXIT with AP_RESET_HOLD.
//
- InterlockedDecrement ((UINT32 *) &CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
+ InterlockedDecrement ((UINT32 *)&CpuMpData->MpCpuExchangeInfo->NumApsExecuting);
}
Status = VmgExit (Ghcb, SVM_EXIT_AP_RESET_HOLD, 0, 0);
@@ -928,16 +939,18 @@ ApWakeupFunction (
} else {
CpuSleep ();
}
+
CpuPause ();
}
}
+
while (TRUE) {
DisableInterrupts ();
if (CpuMpData->ApLoopMode == ApInMwaitLoop) {
//
// Place AP in MWAIT-loop
//
- AsmMonitor ((UINTN) ApStartupSignalBuffer, 0, 0);
+ AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0);
if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) {
//
// Check AP start-up signal again.
@@ -973,7 +986,7 @@ ApWakeupFunction (
**/
VOID
WaitApWakeup (
- IN volatile UINT32 *ApStartupSignalBuffer
+ IN volatile UINT32 *ApStartupSignalBuffer
)
{
//
@@ -981,10 +994,11 @@ WaitApWakeup (
// Otherwise, write StartupApSignal again till AP waken up.
//
while (InterlockedCompareExchange32 (
- (UINT32 *) ApStartupSignalBuffer,
- WAKEUP_AP_SIGNAL,
- WAKEUP_AP_SIGNAL
- ) != 0) {
+ (UINT32 *)ApStartupSignalBuffer,
+ WAKEUP_AP_SIGNAL,
+ WAKEUP_AP_SIGNAL
+ ) != 0)
+ {
CpuPause ();
}
}
@@ -997,30 +1011,30 @@ WaitApWakeup (
**/
VOID
FillExchangeInfoData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
- UINTN Size;
- IA32_SEGMENT_DESCRIPTOR *Selector;
- IA32_CR4 Cr4;
+ volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
+ UINTN Size;
+ IA32_SEGMENT_DESCRIPTOR *Selector;
+ IA32_CR4 Cr4;
- ExchangeInfo = CpuMpData->MpCpuExchangeInfo;
- ExchangeInfo->StackStart = CpuMpData->Buffer;
- ExchangeInfo->StackSize = CpuMpData->CpuApStackSize;
- ExchangeInfo->BufferStart = CpuMpData->WakeupBuffer;
- ExchangeInfo->ModeOffset = CpuMpData->AddressMap.ModeEntryOffset;
+ ExchangeInfo = CpuMpData->MpCpuExchangeInfo;
+ ExchangeInfo->StackStart = CpuMpData->Buffer;
+ ExchangeInfo->StackSize = CpuMpData->CpuApStackSize;
+ ExchangeInfo->BufferStart = CpuMpData->WakeupBuffer;
+ ExchangeInfo->ModeOffset = CpuMpData->AddressMap.ModeEntryOffset;
- ExchangeInfo->CodeSegment = AsmReadCs ();
- ExchangeInfo->DataSegment = AsmReadDs ();
+ ExchangeInfo->CodeSegment = AsmReadCs ();
+ ExchangeInfo->DataSegment = AsmReadDs ();
- ExchangeInfo->Cr3 = AsmReadCr3 ();
+ ExchangeInfo->Cr3 = AsmReadCr3 ();
- ExchangeInfo->CFunction = (UINTN) ApWakeupFunction;
+ ExchangeInfo->CFunction = (UINTN)ApWakeupFunction;
ExchangeInfo->ApIndex = 0;
ExchangeInfo->NumApsExecuting = 0;
- ExchangeInfo->InitFlag = (UINTN) CpuMpData->InitFlag;
- ExchangeInfo->CpuInfo = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ ExchangeInfo->InitFlag = (UINTN)CpuMpData->InitFlag;
+ ExchangeInfo->CpuInfo = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
ExchangeInfo->CpuMpData = CpuMpData;
ExchangeInfo->EnableExecuteDisable = IsBspExecuteDisableEnabled ();
@@ -1035,32 +1049,33 @@ FillExchangeInfoData (
// Using latter way is simpler because it also eliminates the needs to
// check whether platform wants to enable it.
//
- Cr4.UintN = AsmReadCr4 ();
- ExchangeInfo->Enable5LevelPaging = (BOOLEAN) (Cr4.Bits.LA57 == 1);
+ Cr4.UintN = AsmReadCr4 ();
+ ExchangeInfo->Enable5LevelPaging = (BOOLEAN)(Cr4.Bits.LA57 == 1);
DEBUG ((DEBUG_INFO, "%a: 5-Level Paging = %d\n", gEfiCallerBaseName, ExchangeInfo->Enable5LevelPaging));
- ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled;
- ExchangeInfo->GhcbBase = (UINTN) CpuMpData->GhcbBase;
+ ExchangeInfo->SevEsIsEnabled = CpuMpData->SevEsIsEnabled;
+ ExchangeInfo->GhcbBase = (UINTN)CpuMpData->GhcbBase;
//
// Get the BSP's data of GDT and IDT
//
- AsmReadGdtr ((IA32_DESCRIPTOR *) &ExchangeInfo->GdtrProfile);
- AsmReadIdtr ((IA32_DESCRIPTOR *) &ExchangeInfo->IdtrProfile);
+ AsmReadGdtr ((IA32_DESCRIPTOR *)&ExchangeInfo->GdtrProfile);
+ AsmReadIdtr ((IA32_DESCRIPTOR *)&ExchangeInfo->IdtrProfile);
//
// Find a 32-bit code segment
//
Selector = (IA32_SEGMENT_DESCRIPTOR *)ExchangeInfo->GdtrProfile.Base;
- Size = ExchangeInfo->GdtrProfile.Limit + 1;
+ Size = ExchangeInfo->GdtrProfile.Limit + 1;
while (Size > 0) {
- if (Selector->Bits.L == 0 && Selector->Bits.Type >= 8) {
+ if ((Selector->Bits.L == 0) && (Selector->Bits.Type >= 8)) {
ExchangeInfo->ModeTransitionSegment =
(UINT16)((UINTN)Selector - ExchangeInfo->GdtrProfile.Base);
break;
}
+
Selector += 1;
- Size -= sizeof (IA32_SEGMENT_DESCRIPTOR);
+ Size -= sizeof (IA32_SEGMENT_DESCRIPTOR);
}
//
@@ -1069,8 +1084,8 @@ FillExchangeInfoData (
//
if (CpuMpData->WakeupBufferHigh != 0) {
Size = CpuMpData->AddressMap.RendezvousFunnelSize +
- CpuMpData->AddressMap.SwitchToRealSize -
- CpuMpData->AddressMap.ModeTransitionOffset;
+ CpuMpData->AddressMap.SwitchToRealSize -
+ CpuMpData->AddressMap.ModeTransitionOffset;
CopyMem (
(VOID *)CpuMpData->WakeupBufferHigh,
CpuMpData->AddressMap.RendezvousFunnelAddress +
@@ -1081,12 +1096,12 @@ FillExchangeInfoData (
ExchangeInfo->ModeTransitionMemory = (UINT32)CpuMpData->WakeupBufferHigh;
} else {
ExchangeInfo->ModeTransitionMemory = (UINT32)
- (ExchangeInfo->BufferStart + CpuMpData->AddressMap.ModeTransitionOffset);
+ (ExchangeInfo->BufferStart + CpuMpData->AddressMap.ModeTransitionOffset);
}
ExchangeInfo->ModeHighMemory = ExchangeInfo->ModeTransitionMemory +
- (UINT32)ExchangeInfo->ModeOffset -
- (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;
+ (UINT32)ExchangeInfo->ModeOffset -
+ (UINT32)CpuMpData->AddressMap.ModeTransitionOffset;
ExchangeInfo->ModeHighSegment = (UINT16)ExchangeInfo->CodeSegment;
}
@@ -1100,9 +1115,9 @@ FillExchangeInfoData (
**/
VOID
TimedWaitForApFinish (
- IN CPU_MP_DATA *CpuMpData,
- IN UINT32 FinishedApLimit,
- IN UINT32 TimeLimit
+ IN CPU_MP_DATA *CpuMpData,
+ IN UINT32 FinishedApLimit,
+ IN UINT32 TimeLimit
);
/**
@@ -1111,20 +1126,20 @@ TimedWaitForApFinish (
@param[in] CpuMpData The pointer to CPU MP Data structure.
**/
VOID
-BackupAndPrepareWakeupBuffer(
- IN CPU_MP_DATA *CpuMpData
+BackupAndPrepareWakeupBuffer (
+ IN CPU_MP_DATA *CpuMpData
)
{
CopyMem (
- (VOID *) CpuMpData->BackupBuffer,
- (VOID *) CpuMpData->WakeupBuffer,
+ (VOID *)CpuMpData->BackupBuffer,
+ (VOID *)CpuMpData->WakeupBuffer,
CpuMpData->BackupBufferSize
);
CopyMem (
- (VOID *) CpuMpData->WakeupBuffer,
- (VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,
+ (VOID *)CpuMpData->WakeupBuffer,
+ (VOID *)CpuMpData->AddressMap.RendezvousFunnelAddress,
CpuMpData->AddressMap.RendezvousFunnelSize +
- CpuMpData->AddressMap.SwitchToRealSize
+ CpuMpData->AddressMap.SwitchToRealSize
);
}
@@ -1134,13 +1149,13 @@ BackupAndPrepareWakeupBuffer(
@param[in] CpuMpData The pointer to CPU MP Data structure.
**/
VOID
-RestoreWakeupBuffer(
- IN CPU_MP_DATA *CpuMpData
+RestoreWakeupBuffer (
+ IN CPU_MP_DATA *CpuMpData
)
{
CopyMem (
- (VOID *) CpuMpData->WakeupBuffer,
- (VOID *) CpuMpData->BackupBuffer,
+ (VOID *)CpuMpData->WakeupBuffer,
+ (VOID *)CpuMpData->BackupBuffer,
CpuMpData->BackupBufferSize
);
}
@@ -1161,8 +1176,8 @@ GetApResetVectorSize (
UINTN Size;
Size = AddressMap->RendezvousFunnelSize +
- AddressMap->SwitchToRealSize +
- sizeof (MP_CPU_EXCHANGE_INFO);
+ AddressMap->SwitchToRealSize +
+ sizeof (MP_CPU_EXCHANGE_INFO);
return Size;
}
@@ -1174,21 +1189,21 @@ GetApResetVectorSize (
**/
VOID
AllocateResetVector (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
- UINTN ApResetVectorSize;
- UINTN ApResetStackSize;
+ UINTN ApResetVectorSize;
+ UINTN ApResetStackSize;
- if (CpuMpData->WakeupBuffer == (UINTN) -1) {
+ if (CpuMpData->WakeupBuffer == (UINTN)-1) {
ApResetVectorSize = GetApResetVectorSize (&CpuMpData->AddressMap);
CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
- CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
- (CpuMpData->WakeupBuffer +
- CpuMpData->AddressMap.RendezvousFunnelSize +
- CpuMpData->AddressMap.SwitchToRealSize);
- CpuMpData->WakeupBufferHigh = GetModeTransitionBuffer (
+ CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *)(UINTN)
+ (CpuMpData->WakeupBuffer +
+ CpuMpData->AddressMap.RendezvousFunnelSize +
+ CpuMpData->AddressMap.SwitchToRealSize);
+ CpuMpData->WakeupBufferHigh = GetModeTransitionBuffer (
CpuMpData->AddressMap.RendezvousFunnelSize +
CpuMpData->AddressMap.SwitchToRealSize -
CpuMpData->AddressMap.ModeTransitionOffset
@@ -1228,6 +1243,7 @@ AllocateResetVector (
}
}
}
+
BackupAndPrepareWakeupBuffer (CpuMpData);
}
@@ -1238,7 +1254,7 @@ AllocateResetVector (
**/
VOID
FreeResetVector (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
//
@@ -1259,10 +1275,10 @@ FreeResetVector (
**/
VOID
AllocateSevEsAPMemory (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
- if (CpuMpData->SevEsAPBuffer == (UINTN) -1) {
+ if (CpuMpData->SevEsAPBuffer == (UINTN)-1) {
CpuMpData->SevEsAPBuffer =
CpuMpData->SevEsIsEnabled ? GetSevEsAPMemory () : 0;
}
@@ -1278,11 +1294,11 @@ SetSevEsJumpTable (
IN UINTN SipiVector
)
{
- SEV_ES_AP_JMP_FAR *JmpFar;
- UINT32 Offset, InsnByte;
- UINT8 LoNib, HiNib;
+ SEV_ES_AP_JMP_FAR *JmpFar;
+ UINT32 Offset, InsnByte;
+ UINT8 LoNib, HiNib;
- JmpFar = (SEV_ES_AP_JMP_FAR *) (UINTN) FixedPcdGet32 (PcdSevEsWorkAreaBase);
+ JmpFar = (SEV_ES_AP_JMP_FAR *)(UINTN)FixedPcdGet32 (PcdSevEsWorkAreaBase);
ASSERT (JmpFar != NULL);
//
@@ -1290,10 +1306,10 @@ SetSevEsJumpTable (
// This will be set to a value derived from the SIPI vector and will
// be the memory address used for the far jump below.
//
- Offset = FixedPcdGet32 (PcdSevEsWorkAreaBase);
+ Offset = FixedPcdGet32 (PcdSevEsWorkAreaBase);
Offset += sizeof (JmpFar->InsnBuffer);
- LoNib = (UINT8) Offset;
- HiNib = (UINT8) (Offset >> 8);
+ LoNib = (UINT8)Offset;
+ HiNib = (UINT8)(Offset >> 8);
//
// Program the workarea (which is the initial AP boot address) with
@@ -1302,7 +1318,7 @@ SetSevEsJumpTable (
//
// JMP FAR [CS:XXYY] => 2E FF 2E YY XX
//
- InsnByte = 0;
+ InsnByte = 0;
JmpFar->InsnBuffer[InsnByte++] = 0x2E; // CS override prefix
JmpFar->InsnBuffer[InsnByte++] = 0xFF; // JMP (FAR)
JmpFar->InsnBuffer[InsnByte++] = 0x2E; // ModRM (JMP memory location)
@@ -1313,8 +1329,8 @@ SetSevEsJumpTable (
// Program the Segment/Rip based on the SIPI vector (always at least
// 16-byte aligned, so Rip is set to 0).
//
- JmpFar->Rip = 0;
- JmpFar->Segment = (UINT16) (SipiVector >> 4);
+ JmpFar->Rip = 0;
+ JmpFar->Segment = (UINT16)(SipiVector >> 4);
}
/**
@@ -1330,25 +1346,26 @@ SetSevEsJumpTable (
**/
VOID
WakeUpAP (
- IN CPU_MP_DATA *CpuMpData,
- IN BOOLEAN Broadcast,
- IN UINTN ProcessorNumber,
- IN EFI_AP_PROCEDURE Procedure OPTIONAL,
- IN VOID *ProcedureArgument OPTIONAL,
- IN BOOLEAN WakeUpDisabledAps
+ IN CPU_MP_DATA *CpuMpData,
+ IN BOOLEAN Broadcast,
+ IN UINTN ProcessorNumber,
+ IN EFI_AP_PROCEDURE Procedure OPTIONAL,
+ IN VOID *ProcedureArgument OPTIONAL,
+ IN BOOLEAN WakeUpDisabledAps
)
{
- volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
- UINTN Index;
- CPU_AP_DATA *CpuData;
- BOOLEAN ResetVectorRequired;
- CPU_INFO_IN_HOB *CpuInfoInHob;
+ volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
+ UINTN Index;
+ CPU_AP_DATA *CpuData;
+ BOOLEAN ResetVectorRequired;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
CpuMpData->FinishedCount = 0;
- ResetVectorRequired = FALSE;
+ ResetVectorRequired = FALSE;
if (CpuMpData->WakeUpByInitSipiSipi ||
- CpuMpData->InitFlag != ApInitDone) {
+ (CpuMpData->InitFlag != ApInitDone))
+ {
ResetVectorRequired = TRUE;
AllocateResetVector (CpuMpData);
AllocateSevEsAPMemory (CpuMpData);
@@ -1375,18 +1392,19 @@ WakeUpAP (
// the AP procedure will be skipped for disabled AP because AP state
// is not CpuStateReady.
//
- if (GetApState (CpuData) == CpuStateDisabled && !WakeUpDisabledAps) {
+ if ((GetApState (CpuData) == CpuStateDisabled) && !WakeUpDisabledAps) {
continue;
}
- CpuData->ApFunction = (UINTN) Procedure;
- CpuData->ApFunctionArgument = (UINTN) ProcedureArgument;
+ CpuData->ApFunction = (UINTN)Procedure;
+ CpuData->ApFunctionArgument = (UINTN)ProcedureArgument;
SetApState (CpuData, CpuStateReady);
if (CpuMpData->InitFlag != ApInitConfig) {
- *(UINT32 *) CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;
+ *(UINT32 *)CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;
}
}
}
+
if (ResetVectorRequired) {
//
// For SEV-ES, the initial AP boot address will be defined by
@@ -1400,8 +1418,9 @@ WakeUpAP (
//
// Wakeup all APs
//
- SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);
+ SendInitSipiSipiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart);
}
+
if (CpuMpData->InitFlag == ApInitConfig) {
if (PcdGet32 (PcdCpuBootLogicalProcessorNumber) > 0) {
//
@@ -1462,7 +1481,7 @@ WakeUpAP (
);
while (CpuMpData->MpCpuExchangeInfo->NumApsExecuting != 0) {
- CpuPause();
+ CpuPause ();
}
}
} else {
@@ -1477,17 +1496,17 @@ WakeUpAP (
}
}
} else {
- CpuData = &CpuMpData->CpuData[ProcessorNumber];
- CpuData->ApFunction = (UINTN) Procedure;
- CpuData->ApFunctionArgument = (UINTN) ProcedureArgument;
+ CpuData = &CpuMpData->CpuData[ProcessorNumber];
+ CpuData->ApFunction = (UINTN)Procedure;
+ CpuData->ApFunctionArgument = (UINTN)ProcedureArgument;
SetApState (CpuData, CpuStateReady);
//
// Wakeup specified AP
//
ASSERT (CpuMpData->InitFlag != ApInitConfig);
- *(UINT32 *) CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;
+ *(UINT32 *)CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;
if (ResetVectorRequired) {
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
//
// For SEV-ES, the initial AP boot address will be defined by
@@ -1500,9 +1519,10 @@ WakeUpAP (
SendInitSipiSipi (
CpuInfoInHob[ProcessorNumber].ApicId,
- (UINT32) ExchangeInfo->BufferStart
+ (UINT32)ExchangeInfo->BufferStart
);
}
+
//
// Wait specified AP waken up
//
@@ -1542,8 +1562,8 @@ CalculateTimeout (
OUT UINT64 *CurrentTime
)
{
- UINT64 TimeoutInSeconds;
- UINT64 TimestampCounterFreq;
+ UINT64 TimeoutInSeconds;
+ UINT64 TimestampCounterFreq;
//
// Read the current value of the performance counter
@@ -1628,25 +1648,30 @@ CheckTimeout (
if (Timeout == 0) {
return FALSE;
}
+
GetPerformanceCounterProperties (&Start, &End);
Cycle = End - Start;
if (Cycle < 0) {
Cycle = -Cycle;
}
+
Cycle++;
- CurrentTime = GetPerformanceCounter();
- Delta = (INT64) (CurrentTime - *PreviousTime);
+ CurrentTime = GetPerformanceCounter ();
+ Delta = (INT64)(CurrentTime - *PreviousTime);
if (Start > End) {
Delta = -Delta;
}
+
if (Delta < 0) {
Delta += Cycle;
}
- *TotalTime += Delta;
+
+ *TotalTime += Delta;
*PreviousTime = CurrentTime;
if (*TotalTime > Timeout) {
return TRUE;
}
+
return FALSE;
}
@@ -1660,9 +1685,9 @@ CheckTimeout (
**/
VOID
TimedWaitForApFinish (
- IN CPU_MP_DATA *CpuMpData,
- IN UINT32 FinishedApLimit,
- IN UINT32 TimeLimit
+ IN CPU_MP_DATA *CpuMpData,
+ IN UINT32 FinishedApLimit,
+ IN UINT32 TimeLimit
)
{
//
@@ -1673,7 +1698,7 @@ TimedWaitForApFinish (
return;
}
- CpuMpData->TotalTime = 0;
+ CpuMpData->TotalTime = 0;
CpuMpData->ExpectedTime = CalculateTimeout (
TimeLimit,
&CpuMpData->CurrentTime
@@ -1683,7 +1708,8 @@ TimedWaitForApFinish (
&CpuMpData->CurrentTime,
&CpuMpData->TotalTime,
CpuMpData->ExpectedTime
- )) {
+ ))
+ {
CpuPause ();
}
@@ -1712,10 +1738,10 @@ TimedWaitForApFinish (
**/
VOID
ResetProcessorToIdleState (
- IN UINTN ProcessorNumber
+ IN UINTN ProcessorNumber
)
{
- CPU_MP_DATA *CpuMpData;
+ CPU_MP_DATA *CpuMpData;
CpuMpData = GetCpuMpData ();
@@ -1724,6 +1750,7 @@ ResetProcessorToIdleState (
while (CpuMpData->FinishedCount < 1) {
CpuPause ();
}
+
CpuMpData->InitFlag = ApInitDone;
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);
@@ -1742,11 +1769,11 @@ ResetProcessorToIdleState (
**/
EFI_STATUS
GetNextWaitingProcessorNumber (
- OUT UINTN *NextProcessorNumber
+ OUT UINTN *NextProcessorNumber
)
{
- UINTN ProcessorNumber;
- CPU_MP_DATA *CpuMpData;
+ UINTN ProcessorNumber;
+ CPU_MP_DATA *CpuMpData;
CpuMpData = GetCpuMpData ();
@@ -1773,11 +1800,11 @@ GetNextWaitingProcessorNumber (
**/
EFI_STATUS
CheckThisAP (
- IN UINTN ProcessorNumber
+ IN UINTN ProcessorNumber
)
{
- CPU_MP_DATA *CpuMpData;
- CPU_AP_DATA *CpuData;
+ CPU_MP_DATA *CpuMpData;
+ CPU_AP_DATA *CpuData;
CpuMpData = GetCpuMpData ();
CpuData = &CpuMpData->CpuData[ProcessorNumber];
@@ -1790,10 +1817,11 @@ CheckThisAP (
//
// If the AP finishes for StartupThisAP(), return EFI_SUCCESS.
//
- if (GetApState(CpuData) == CpuStateFinished) {
+ if (GetApState (CpuData) == CpuStateFinished) {
if (CpuData->Finished != NULL) {
*(CpuData->Finished) = TRUE;
}
+
SetApState (CpuData, CpuStateIdle);
return EFI_SUCCESS;
} else {
@@ -1804,6 +1832,7 @@ CheckThisAP (
if (CpuData->Finished != NULL) {
*(CpuData->Finished) = FALSE;
}
+
//
// Reset failed AP to idle state
//
@@ -1812,6 +1841,7 @@ CheckThisAP (
return EFI_TIMEOUT;
}
}
+
return EFI_NOT_READY;
}
@@ -1830,12 +1860,12 @@ CheckAllAPs (
VOID
)
{
- UINTN ProcessorNumber;
- UINTN NextProcessorNumber;
- UINTN ListIndex;
- EFI_STATUS Status;
- CPU_MP_DATA *CpuMpData;
- CPU_AP_DATA *CpuData;
+ UINTN ProcessorNumber;
+ UINTN NextProcessorNumber;
+ UINTN ListIndex;
+ EFI_STATUS Status;
+ CPU_MP_DATA *CpuMpData;
+ CPU_AP_DATA *CpuData;
CpuMpData = GetCpuMpData ();
@@ -1855,10 +1885,10 @@ CheckAllAPs (
// Only BSP and corresponding AP access this unit of CPU Data. This means the AP will not modify the
// value of state after setting the it to CpuStateIdle, so BSP can safely make use of its value.
//
- if (GetApState(CpuData) == CpuStateFinished) {
- CpuMpData->RunningCount --;
+ if (GetApState (CpuData) == CpuStateFinished) {
+ CpuMpData->RunningCount--;
CpuMpData->CpuData[ProcessorNumber].Waiting = FALSE;
- SetApState(CpuData, CpuStateIdle);
+ SetApState (CpuData, CpuStateIdle);
//
// If in Single Thread mode, then search for the next waiting AP for execution.
@@ -1870,12 +1900,12 @@ CheckAllAPs (
WakeUpAP (
CpuMpData,
FALSE,
- (UINT32) NextProcessorNumber,
+ (UINT32)NextProcessorNumber,
CpuMpData->Procedure,
CpuMpData->ProcArguments,
TRUE
);
- }
+ }
}
}
}
@@ -1891,18 +1921,21 @@ CheckAllAPs (
// If timeout expires, report timeout.
//
if (CheckTimeout (
- &CpuMpData->CurrentTime,
- &CpuMpData->TotalTime,
- CpuMpData->ExpectedTime)
- ) {
+ &CpuMpData->CurrentTime,
+ &CpuMpData->TotalTime,
+ CpuMpData->ExpectedTime
+ )
+ )
+ {
//
// If FailedCpuList is not NULL, record all failed APs in it.
//
if (CpuMpData->FailedCpuList != NULL) {
*CpuMpData->FailedCpuList =
- AllocatePool ((CpuMpData->RunningCount + 1) * sizeof (UINTN));
+ AllocatePool ((CpuMpData->RunningCount + 1) * sizeof (UINTN));
ASSERT (*CpuMpData->FailedCpuList != NULL);
}
+
ListIndex = 0;
for (ProcessorNumber = 0; ProcessorNumber < CpuMpData->CpuCount; ProcessorNumber++) {
@@ -1920,11 +1953,14 @@ CheckAllAPs (
}
}
}
+
if (CpuMpData->FailedCpuList != NULL) {
(*CpuMpData->FailedCpuList)[ListIndex] = END_OF_CPU_LIST;
}
+
return EFI_TIMEOUT;
}
+
return EFI_NOT_READY;
}
@@ -1967,16 +2003,17 @@ MpInitLibInitialize (
OldCpuMpData = GetCpuMpDataFromGuidedHob ();
if (OldCpuMpData == NULL) {
- MaxLogicalProcessorNumber = PcdGet32(PcdCpuMaxLogicalProcessorNumber);
+ MaxLogicalProcessorNumber = PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
} else {
MaxLogicalProcessorNumber = OldCpuMpData->CpuCount;
}
+
ASSERT (MaxLogicalProcessorNumber != 0);
AsmGetAddressMap (&AddressMap);
ApResetVectorSize = GetApResetVectorSize (&AddressMap);
- ApStackSize = PcdGet32(PcdCpuApStackSize);
- ApLoopMode = GetApLoopMode (&MonitorFilterSize);
+ ApStackSize = PcdGet32 (PcdCpuApStackSize);
+ ApLoopMode = GetApLoopMode (&MonitorFilterSize);
//
// Save BSP's Control registers for APs.
@@ -1993,7 +2030,7 @@ MpInitLibInitialize (
MpBuffer = AllocatePages (EFI_SIZE_TO_PAGES (BufferSize));
ASSERT (MpBuffer != NULL);
ZeroMem (MpBuffer, BufferSize);
- Buffer = (UINTN) MpBuffer;
+ Buffer = (UINTN)MpBuffer;
//
// The layout of the Buffer is as below:
@@ -2016,31 +2053,33 @@ MpInitLibInitialize (
// CPU_INFO_IN_HOB (N)
// +--------------------+
//
- MonitorBuffer = (UINT8 *) (Buffer + ApStackSize * MaxLogicalProcessorNumber);
- BackupBufferAddr = (UINTN) MonitorBuffer + MonitorFilterSize * MaxLogicalProcessorNumber;
- ApIdtBase = ALIGN_VALUE (BackupBufferAddr + ApResetVectorSize, 8);
- CpuMpData = (CPU_MP_DATA *) (ApIdtBase + VolatileRegisters.Idtr.Limit + 1);
+ MonitorBuffer = (UINT8 *)(Buffer + ApStackSize * MaxLogicalProcessorNumber);
+ BackupBufferAddr = (UINTN)MonitorBuffer + MonitorFilterSize * MaxLogicalProcessorNumber;
+ ApIdtBase = ALIGN_VALUE (BackupBufferAddr + ApResetVectorSize, 8);
+ CpuMpData = (CPU_MP_DATA *)(ApIdtBase + VolatileRegisters.Idtr.Limit + 1);
CpuMpData->Buffer = Buffer;
CpuMpData->CpuApStackSize = ApStackSize;
CpuMpData->BackupBuffer = BackupBufferAddr;
CpuMpData->BackupBufferSize = ApResetVectorSize;
- CpuMpData->WakeupBuffer = (UINTN) -1;
+ CpuMpData->WakeupBuffer = (UINTN)-1;
CpuMpData->CpuCount = 1;
CpuMpData->BspNumber = 0;
CpuMpData->WaitEvent = NULL;
CpuMpData->SwitchBspFlag = FALSE;
- CpuMpData->CpuData = (CPU_AP_DATA *) (CpuMpData + 1);
- CpuMpData->CpuInfoInHob = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);
- InitializeSpinLock(&CpuMpData->MpLock);
+ CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1);
+ CpuMpData->CpuInfoInHob = (UINT64)(UINTN)(CpuMpData->CpuData + MaxLogicalProcessorNumber);
+ InitializeSpinLock (&CpuMpData->MpLock);
CpuMpData->SevEsIsEnabled = PcdGetBool (PcdSevEsIsEnabled);
- CpuMpData->SevEsAPBuffer = (UINTN) -1;
+ CpuMpData->SevEsAPBuffer = (UINTN)-1;
CpuMpData->GhcbBase = PcdGet64 (PcdGhcbBase);
//
// Make sure no memory usage outside of the allocated buffer.
//
- ASSERT ((CpuMpData->CpuInfoInHob + sizeof (CPU_INFO_IN_HOB) * MaxLogicalProcessorNumber) ==
- Buffer + BufferSize);
+ ASSERT (
+ (CpuMpData->CpuInfoInHob + sizeof (CPU_INFO_IN_HOB) * MaxLogicalProcessorNumber) ==
+ Buffer + BufferSize
+ );
//
// Duplicate BSP's IDT to APs.
@@ -2076,6 +2115,7 @@ MpInitLibInitialize (
CpuMpData->CpuData[Index].StartupApSignal =
(UINT32 *)(MonitorBuffer + MonitorFilterSize * Index);
}
+
//
// Enable the local APIC for Virtual Wire Mode.
//
@@ -2094,13 +2134,13 @@ MpInitLibInitialize (
// from HOB
//
OldCpuMpData->NewCpuMpData = CpuMpData;
- CpuMpData->CpuCount = OldCpuMpData->CpuCount;
- CpuMpData->BspNumber = OldCpuMpData->BspNumber;
- CpuMpData->CpuInfoInHob = OldCpuMpData->CpuInfoInHob;
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuMpData->CpuCount = OldCpuMpData->CpuCount;
+ CpuMpData->BspNumber = OldCpuMpData->BspNumber;
+ CpuMpData->CpuInfoInHob = OldCpuMpData->CpuInfoInHob;
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
- InitializeSpinLock(&CpuMpData->CpuData[Index].ApLock);
- CpuMpData->CpuData[Index].CpuHealthy = (CpuInfoInHob[Index].Health == 0)? TRUE:FALSE;
+ InitializeSpinLock (&CpuMpData->CpuData[Index].ApLock);
+ CpuMpData->CpuData[Index].CpuHealthy = (CpuInfoInHob[Index].Health == 0) ? TRUE : FALSE;
CpuMpData->CpuData[Index].ApFunction = 0;
}
}
@@ -2108,7 +2148,8 @@ MpInitLibInitialize (
if (!GetMicrocodePatchInfoFromHob (
&CpuMpData->MicrocodePatchAddress,
&CpuMpData->MicrocodePatchRegionSize
- )) {
+ ))
+ {
//
// The microcode patch information cache HOB does not exist, which means
// the microcode patches data has not been loaded into memory yet
@@ -2137,6 +2178,7 @@ MpInitLibInitialize (
//
CpuMpData->InitFlag = ApInitReconfig;
}
+
WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData, TRUE);
//
// Wait for all APs finished initialization
@@ -2144,9 +2186,11 @@ MpInitLibInitialize (
while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) {
CpuPause ();
}
+
if (OldCpuMpData != NULL) {
CpuMpData->InitFlag = ApInitDone;
}
+
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
SetApState (&CpuMpData->CpuData[Index], CpuStateIdle);
}
@@ -2156,26 +2200,32 @@ MpInitLibInitialize (
// Dump the microcode revision for each core.
//
DEBUG_CODE_BEGIN ();
- UINT32 ThreadId;
- UINT32 ExpectedMicrocodeRevision;
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
- for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
- GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId);
- if (ThreadId == 0) {
- //
- // MicrocodeDetect() loads microcode in first thread of each core, so,
- // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core.
- //
- ExpectedMicrocodeRevision = 0;
- if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) {
- ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision;
- }
- DEBUG ((
- DEBUG_INFO, "CPU[%04d]: Microcode revision = %08x, expected = %08x\n",
- Index, CpuMpData->CpuData[Index].MicrocodeRevision, ExpectedMicrocodeRevision
- ));
+ UINT32 ThreadId;
+ UINT32 ExpectedMicrocodeRevision;
+
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
+ for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
+ GetProcessorLocationByApicId (CpuInfoInHob[Index].InitialApicId, NULL, NULL, &ThreadId);
+ if (ThreadId == 0) {
+ //
+ // MicrocodeDetect() loads microcode in first thread of each core, so,
+ // CpuMpData->CpuData[Index].MicrocodeEntryAddr is initialized only for first thread of each core.
+ //
+ ExpectedMicrocodeRevision = 0;
+ if (CpuMpData->CpuData[Index].MicrocodeEntryAddr != 0) {
+ ExpectedMicrocodeRevision = ((CPU_MICROCODE_HEADER *)(UINTN)CpuMpData->CpuData[Index].MicrocodeEntryAddr)->UpdateRevision;
}
+
+ DEBUG ((
+ DEBUG_INFO,
+ "CPU[%04d]: Microcode revision = %08x, expected = %08x\n",
+ Index,
+ CpuMpData->CpuData[Index].MicrocodeRevision,
+ ExpectedMicrocodeRevision
+ ));
}
+ }
+
DEBUG_CODE_END ();
//
// Initialize global data for MP support
@@ -2210,19 +2260,19 @@ MpInitLibGetProcessorInfo (
OUT EFI_HEALTH_FLAGS *HealthData OPTIONAL
)
{
- CPU_MP_DATA *CpuMpData;
- UINTN CallerNumber;
- CPU_INFO_IN_HOB *CpuInfoInHob;
- UINTN OriginalProcessorNumber;
+ CPU_MP_DATA *CpuMpData;
+ UINTN CallerNumber;
+ CPU_INFO_IN_HOB *CpuInfoInHob;
+ UINTN OriginalProcessorNumber;
- CpuMpData = GetCpuMpData ();
- CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ CpuMpData = GetCpuMpData ();
+ CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob;
//
// Lower 24 bits contains the actual processor number.
//
OriginalProcessorNumber = ProcessorNumber;
- ProcessorNumber &= BIT24 - 1;
+ ProcessorNumber &= BIT24 - 1;
//
// Check whether caller processor is BSP
@@ -2240,14 +2290,16 @@ MpInitLibGetProcessorInfo (
return EFI_NOT_FOUND;
}
- ProcessorInfoBuffer->ProcessorId = (UINT64) CpuInfoInHob[ProcessorNumber].ApicId;
+ ProcessorInfoBuffer->ProcessorId = (UINT64)CpuInfoInHob[ProcessorNumber].ApicId;
ProcessorInfoBuffer->StatusFlag = 0;
if (ProcessorNumber == CpuMpData->BspNumber) {
ProcessorInfoBuffer->StatusFlag |= PROCESSOR_AS_BSP_BIT;
}
+
if (CpuMpData->CpuData[ProcessorNumber].CpuHealthy) {
ProcessorInfoBuffer->StatusFlag |= PROCESSOR_HEALTH_STATUS_BIT;
}
+
if (GetApState (&CpuMpData->CpuData[ProcessorNumber]) == CpuStateDisabled) {
ProcessorInfoBuffer->StatusFlag &= ~PROCESSOR_ENABLED_BIT;
} else {
@@ -2296,8 +2348,8 @@ MpInitLibGetProcessorInfo (
**/
EFI_STATUS
SwitchBSPWorker (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableOldBSP
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableOldBSP
)
{
CPU_MP_DATA *CpuMpData;
@@ -2370,7 +2422,7 @@ SwitchBSPWorker (
//
// Clear the BSP bit of MSR_IA32_APIC_BASE
//
- ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
+ ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
ApicBaseMsr.Bits.BSP = 0;
AsmWriteMsr64 (MSR_IA32_APIC_BASE, ApicBaseMsr.Uint64);
@@ -2384,7 +2436,7 @@ SwitchBSPWorker (
//
// Set the BSP bit of MSR_IA32_APIC_BASE on new BSP
//
- ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
+ ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
ApicBaseMsr.Bits.BSP = 1;
AsmWriteMsr64 (MSR_IA32_APIC_BASE, ApicBaseMsr.Uint64);
ProgramVirtualWireMode ();
@@ -2405,10 +2457,11 @@ SwitchBSPWorker (
} else {
SetApState (&CpuMpData->CpuData[CallerNumber], CpuStateIdle);
}
+
//
// Save new BSP number
//
- CpuMpData->BspNumber = (UINT32) ProcessorNumber;
+ CpuMpData->BspNumber = (UINT32)ProcessorNumber;
//
// Restore interrupt state.
@@ -2438,13 +2491,13 @@ SwitchBSPWorker (
**/
EFI_STATUS
EnableDisableApWorker (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableAP,
- IN UINT32 *HealthFlag OPTIONAL
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableAP,
+ IN UINT32 *HealthFlag OPTIONAL
)
{
- CPU_MP_DATA *CpuMpData;
- UINTN CallerNumber;
+ CPU_MP_DATA *CpuMpData;
+ UINTN CallerNumber;
CpuMpData = GetCpuMpData ();
@@ -2472,7 +2525,7 @@ EnableDisableApWorker (
if (HealthFlag != NULL) {
CpuMpData->CpuData[ProcessorNumber].CpuHealthy =
- (BOOLEAN) ((*HealthFlag & PROCESSOR_HEALTH_STATUS_BIT) != 0);
+ (BOOLEAN)((*HealthFlag & PROCESSOR_HEALTH_STATUS_BIT) != 0);
}
return EFI_SUCCESS;
@@ -2497,10 +2550,10 @@ EnableDisableApWorker (
EFI_STATUS
EFIAPI
MpInitLibWhoAmI (
- OUT UINTN *ProcessorNumber
+ OUT UINTN *ProcessorNumber
)
{
- CPU_MP_DATA *CpuMpData;
+ CPU_MP_DATA *CpuMpData;
if (ProcessorNumber == NULL) {
return EFI_INVALID_PARAMETER;
@@ -2534,15 +2587,15 @@ MpInitLibWhoAmI (
EFI_STATUS
EFIAPI
MpInitLibGetNumberOfProcessors (
- OUT UINTN *NumberOfProcessors OPTIONAL,
- OUT UINTN *NumberOfEnabledProcessors OPTIONAL
+ OUT UINTN *NumberOfProcessors OPTIONAL,
+ OUT UINTN *NumberOfEnabledProcessors OPTIONAL
)
{
- CPU_MP_DATA *CpuMpData;
- UINTN CallerNumber;
- UINTN ProcessorNumber;
- UINTN EnabledProcessorNumber;
- UINTN Index;
+ CPU_MP_DATA *CpuMpData;
+ UINTN CallerNumber;
+ UINTN ProcessorNumber;
+ UINTN EnabledProcessorNumber;
+ UINTN Index;
CpuMpData = GetCpuMpData ();
@@ -2562,13 +2615,14 @@ MpInitLibGetNumberOfProcessors (
EnabledProcessorNumber = 0;
for (Index = 0; Index < ProcessorNumber; Index++) {
if (GetApState (&CpuMpData->CpuData[Index]) != CpuStateDisabled) {
- EnabledProcessorNumber ++;
+ EnabledProcessorNumber++;
}
}
if (NumberOfProcessors != NULL) {
*NumberOfProcessors = ProcessorNumber;
}
+
if (NumberOfEnabledProcessors != NULL) {
*NumberOfEnabledProcessors = EnabledProcessorNumber;
}
@@ -2576,7 +2630,6 @@ MpInitLibGetNumberOfProcessors (
return EFI_SUCCESS;
}
-
/**
Worker function to execute a caller provided function on all enabled APs.
@@ -2611,23 +2664,23 @@ MpInitLibGetNumberOfProcessors (
**/
EFI_STATUS
StartupAllCPUsWorker (
- IN EFI_AP_PROCEDURE Procedure,
- IN BOOLEAN SingleThread,
- IN BOOLEAN ExcludeBsp,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT UINTN **FailedCpuList OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN BOOLEAN SingleThread,
+ IN BOOLEAN ExcludeBsp,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT UINTN **FailedCpuList OPTIONAL
)
{
- EFI_STATUS Status;
- CPU_MP_DATA *CpuMpData;
- UINTN ProcessorCount;
- UINTN ProcessorNumber;
- UINTN CallerNumber;
- CPU_AP_DATA *CpuData;
- BOOLEAN HasEnabledAp;
- CPU_STATE ApState;
+ EFI_STATUS Status;
+ CPU_MP_DATA *CpuMpData;
+ UINTN ProcessorCount;
+ UINTN ProcessorNumber;
+ UINTN CallerNumber;
+ CPU_AP_DATA *CpuData;
+ BOOLEAN HasEnabledAp;
+ CPU_STATE ApState;
CpuMpData = GetCpuMpData ();
@@ -2635,7 +2688,7 @@ StartupAllCPUsWorker (
*FailedCpuList = NULL;
}
- if (CpuMpData->CpuCount == 1 && ExcludeBsp) {
+ if ((CpuMpData->CpuCount == 1) && ExcludeBsp) {
return EFI_NOT_STARTED;
}
@@ -2687,7 +2740,7 @@ StartupAllCPUsWorker (
CpuMpData->RunningCount = 0;
for (ProcessorNumber = 0; ProcessorNumber < ProcessorCount; ProcessorNumber++) {
- CpuData = &CpuMpData->CpuData[ProcessorNumber];
+ CpuData = &CpuMpData->CpuData[ProcessorNumber];
CpuData->Waiting = FALSE;
if (ProcessorNumber != CpuMpData->BspNumber) {
if (CpuData->State == CpuStateIdle) {
@@ -2709,8 +2762,8 @@ StartupAllCPUsWorker (
TimeoutInMicroseconds,
&CpuMpData->CurrentTime
);
- CpuMpData->TotalTime = 0;
- CpuMpData->WaitEvent = WaitEvent;
+ CpuMpData->TotalTime = 0;
+ CpuMpData->WaitEvent = WaitEvent;
if (!SingleThread) {
WakeUpAP (CpuMpData, TRUE, 0, Procedure, ProcedureArgument, FALSE);
@@ -2719,6 +2772,7 @@ StartupAllCPUsWorker (
if (ProcessorNumber == CallerNumber) {
continue;
}
+
if (CpuMpData->CpuData[ProcessorNumber].Waiting) {
WakeUpAP (CpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument, TRUE);
break;
@@ -2768,18 +2822,18 @@ StartupAllCPUsWorker (
**/
EFI_STATUS
StartupThisAPWorker (
- IN EFI_AP_PROCEDURE Procedure,
- IN UINTN ProcessorNumber,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT BOOLEAN *Finished OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN ProcessorNumber,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT BOOLEAN *Finished OPTIONAL
)
{
- EFI_STATUS Status;
- CPU_MP_DATA *CpuMpData;
- CPU_AP_DATA *CpuData;
- UINTN CallerNumber;
+ EFI_STATUS Status;
+ CPU_MP_DATA *CpuMpData;
+ CPU_AP_DATA *CpuData;
+ UINTN CallerNumber;
CpuMpData = GetCpuMpData ();
@@ -2833,7 +2887,7 @@ StartupThisAPWorker (
// BSP saves data for CheckAPsStatus(), and returns EFI_SUCCESS.
// CheckAPsStatus() will check completion and timeout periodically.
//
- CpuData = &CpuMpData->CpuData[ProcessorNumber];
+ CpuData = &CpuMpData->CpuData[ProcessorNumber];
CpuData->WaitEvent = WaitEvent;
CpuData->Finished = Finished;
CpuData->ExpectedTime = CalculateTimeout (TimeoutInMicroseconds, &CpuData->CurrentTime);
@@ -2865,16 +2919,17 @@ GetCpuMpDataFromGuidedHob (
VOID
)
{
- EFI_HOB_GUID_TYPE *GuidHob;
- VOID *DataInHob;
- CPU_MP_DATA *CpuMpData;
+ EFI_HOB_GUID_TYPE *GuidHob;
+ VOID *DataInHob;
+ CPU_MP_DATA *CpuMpData;
CpuMpData = NULL;
- GuidHob = GetFirstGuidHob (&mCpuInitMpLibHobGuid);
+ GuidHob = GetFirstGuidHob (&mCpuInitMpLibHobGuid);
if (GuidHob != NULL) {
DataInHob = GET_GUID_HOB_DATA (GuidHob);
- CpuMpData = (CPU_MP_DATA *) (*(UINTN *) DataInHob);
+ CpuMpData = (CPU_MP_DATA *)(*(UINTN *)DataInHob);
}
+
return CpuMpData;
}
@@ -2907,9 +2962,9 @@ GetCpuMpDataFromGuidedHob (
EFI_STATUS
EFIAPI
MpInitLibStartupAllCPUs (
- IN EFI_AP_PROCEDURE Procedure,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL
)
{
return StartupAllCPUsWorker (
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 98a207c628..a647772088 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -36,7 +36,7 @@
#include <Guid/MicrocodePatchHob.h>
-#define WAKEUP_AP_SIGNAL SIGNATURE_32 ('S', 'T', 'A', 'P')
+#define WAKEUP_AP_SIGNAL SIGNATURE_32 ('S', 'T', 'A', 'P')
#define CPU_INIT_MP_LIB_HOB_GUID \
{ \
@@ -46,14 +46,14 @@
//
// The MP data for switch BSP
//
-#define CPU_SWITCH_STATE_IDLE 0
-#define CPU_SWITCH_STATE_STORED 1
-#define CPU_SWITCH_STATE_LOADED 2
+#define CPU_SWITCH_STATE_IDLE 0
+#define CPU_SWITCH_STATE_STORED 1
+#define CPU_SWITCH_STATE_LOADED 2
//
// Default maximum number of entries to store the microcode patches information
//
-#define DEFAULT_MAX_MICROCODE_PATCH_NUM 8
+#define DEFAULT_MAX_MICROCODE_PATCH_NUM 8
//
// Data structure for microcode patch information
@@ -67,10 +67,10 @@ typedef struct {
// CPU exchange information for switch BSP
//
typedef struct {
- UINT8 State; // offset 0
- UINTN StackPointer; // offset 4 / 8
- IA32_DESCRIPTOR Gdtr; // offset 8 / 16
- IA32_DESCRIPTOR Idtr; // offset 14 / 26
+ UINT8 State; // offset 0
+ UINTN StackPointer; // offset 4 / 8
+ IA32_DESCRIPTOR Gdtr; // offset 8 / 16
+ IA32_DESCRIPTOR Idtr; // offset 14 / 26
} CPU_EXCHANGE_ROLE_INFO;
//
@@ -111,41 +111,41 @@ typedef enum {
// CPU volatile registers around INIT-SIPI-SIPI
//
typedef struct {
- UINTN Cr0;
- UINTN Cr3;
- UINTN Cr4;
- UINTN Dr0;
- UINTN Dr1;
- UINTN Dr2;
- UINTN Dr3;
- UINTN Dr6;
- UINTN Dr7;
- IA32_DESCRIPTOR Gdtr;
- IA32_DESCRIPTOR Idtr;
- UINT16 Tr;
+ UINTN Cr0;
+ UINTN Cr3;
+ UINTN Cr4;
+ UINTN Dr0;
+ UINTN Dr1;
+ UINTN Dr2;
+ UINTN Dr3;
+ UINTN Dr6;
+ UINTN Dr7;
+ IA32_DESCRIPTOR Gdtr;
+ IA32_DESCRIPTOR Idtr;
+ UINT16 Tr;
} CPU_VOLATILE_REGISTERS;
//
// AP related data
//
typedef struct {
- SPIN_LOCK ApLock;
- volatile UINT32 *StartupApSignal;
- volatile UINTN ApFunction;
- volatile UINTN ApFunctionArgument;
- BOOLEAN CpuHealthy;
- volatile CPU_STATE State;
- CPU_VOLATILE_REGISTERS VolatileRegisters;
- BOOLEAN Waiting;
- BOOLEAN *Finished;
- UINT64 ExpectedTime;
- UINT64 CurrentTime;
- UINT64 TotalTime;
- EFI_EVENT WaitEvent;
- UINT32 ProcessorSignature;
- UINT8 PlatformId;
- UINT64 MicrocodeEntryAddr;
- UINT32 MicrocodeRevision;
+ SPIN_LOCK ApLock;
+ volatile UINT32 *StartupApSignal;
+ volatile UINTN ApFunction;
+ volatile UINTN ApFunctionArgument;
+ BOOLEAN CpuHealthy;
+ volatile CPU_STATE State;
+ CPU_VOLATILE_REGISTERS VolatileRegisters;
+ BOOLEAN Waiting;
+ BOOLEAN *Finished;
+ UINT64 ExpectedTime;
+ UINT64 CurrentTime;
+ UINT64 TotalTime;
+ EFI_EVENT WaitEvent;
+ UINT32 ProcessorSignature;
+ UINT8 PlatformId;
+ UINT64 MicrocodeEntryAddr;
+ UINT32 MicrocodeRevision;
} CPU_AP_DATA;
//
@@ -156,10 +156,10 @@ typedef struct {
//
#pragma pack (1)
typedef struct {
- UINT32 InitialApicId;
- UINT32 ApicId;
- UINT32 Health;
- UINT64 ApTopOfStack;
+ UINT32 InitialApicId;
+ UINT32 ApicId;
+ UINT32 Health;
+ UINT64 ApTopOfStack;
} CPU_INFO_IN_HOB;
#pragma pack ()
@@ -169,20 +169,20 @@ typedef struct {
// It is natural aligned by design.
//
typedef struct {
- UINT8 *RendezvousFunnelAddress;
- UINTN ModeEntryOffset;
- UINTN RendezvousFunnelSize;
- UINT8 *RelocateApLoopFuncAddress;
- UINTN RelocateApLoopFuncSize;
- UINTN ModeTransitionOffset;
- UINTN SwitchToRealSize;
- UINTN SwitchToRealOffset;
- UINTN SwitchToRealNoNxOffset;
- UINTN SwitchToRealPM16ModeOffset;
- UINTN SwitchToRealPM16ModeSize;
+ UINT8 *RendezvousFunnelAddress;
+ UINTN ModeEntryOffset;
+ UINTN RendezvousFunnelSize;
+ UINT8 *RelocateApLoopFuncAddress;
+ UINTN RelocateApLoopFuncSize;
+ UINTN ModeTransitionOffset;
+ UINTN SwitchToRealSize;
+ UINTN SwitchToRealOffset;
+ UINTN SwitchToRealNoNxOffset;
+ UINTN SwitchToRealPM16ModeOffset;
+ UINTN SwitchToRealPM16ModeSize;
} MP_ASSEMBLY_ADDRESS_MAP;
-typedef struct _CPU_MP_DATA CPU_MP_DATA;
+typedef struct _CPU_MP_DATA CPU_MP_DATA;
#pragma pack(1)
@@ -192,33 +192,33 @@ typedef struct _CPU_MP_DATA CPU_MP_DATA;
// into this structure are used in assembly code in this module
//
typedef struct {
- UINTN StackStart;
- UINTN StackSize;
- UINTN CFunction;
- IA32_DESCRIPTOR GdtrProfile;
- IA32_DESCRIPTOR IdtrProfile;
- UINTN BufferStart;
- UINTN ModeOffset;
- UINTN ApIndex;
- UINTN CodeSegment;
- UINTN DataSegment;
- UINTN EnableExecuteDisable;
- UINTN Cr3;
- UINTN InitFlag;
- CPU_INFO_IN_HOB *CpuInfo;
- UINTN NumApsExecuting;
- CPU_MP_DATA *CpuMpData;
- UINTN InitializeFloatingPointUnitsAddress;
- UINT32 ModeTransitionMemory;
- UINT16 ModeTransitionSegment;
- UINT32 ModeHighMemory;
- UINT16 ModeHighSegment;
+ UINTN StackStart;
+ UINTN StackSize;
+ UINTN CFunction;
+ IA32_DESCRIPTOR GdtrProfile;
+ IA32_DESCRIPTOR IdtrProfile;
+ UINTN BufferStart;
+ UINTN ModeOffset;
+ UINTN ApIndex;
+ UINTN CodeSegment;
+ UINTN DataSegment;
+ UINTN EnableExecuteDisable;
+ UINTN Cr3;
+ UINTN InitFlag;
+ CPU_INFO_IN_HOB *CpuInfo;
+ UINTN NumApsExecuting;
+ CPU_MP_DATA *CpuMpData;
+ UINTN InitializeFloatingPointUnitsAddress;
+ UINT32 ModeTransitionMemory;
+ UINT16 ModeTransitionSegment;
+ UINT32 ModeHighMemory;
+ UINT16 ModeHighSegment;
//
// Enable5LevelPaging indicates whether 5-level paging is enabled in long mode.
//
- BOOLEAN Enable5LevelPaging;
- BOOLEAN SevEsIsEnabled;
- UINTN GhcbBase;
+ BOOLEAN Enable5LevelPaging;
+ BOOLEAN SevEsIsEnabled;
+ UINTN GhcbBase;
} MP_CPU_EXCHANGE_INFO;
#pragma pack()
@@ -227,55 +227,55 @@ typedef struct {
// CPU MP Data save in memory
//
struct _CPU_MP_DATA {
- UINT64 CpuInfoInHob;
- UINT32 CpuCount;
- UINT32 BspNumber;
+ UINT64 CpuInfoInHob;
+ UINT32 CpuCount;
+ UINT32 BspNumber;
//
// The above fields data will be passed from PEI to DXE
// Please make sure the fields offset same in the different
// architecture.
//
- SPIN_LOCK MpLock;
- UINTN Buffer;
- UINTN CpuApStackSize;
- MP_ASSEMBLY_ADDRESS_MAP AddressMap;
- UINTN WakeupBuffer;
- UINTN WakeupBufferHigh;
- UINTN BackupBuffer;
- UINTN BackupBufferSize;
-
- volatile UINT32 FinishedCount;
- UINT32 RunningCount;
- BOOLEAN SingleThread;
- EFI_AP_PROCEDURE Procedure;
- VOID *ProcArguments;
- BOOLEAN *Finished;
- UINT64 ExpectedTime;
- UINT64 CurrentTime;
- UINT64 TotalTime;
- EFI_EVENT WaitEvent;
- UINTN **FailedCpuList;
-
- AP_INIT_STATE InitFlag;
- BOOLEAN SwitchBspFlag;
- UINTN NewBspNumber;
- CPU_EXCHANGE_ROLE_INFO BSPInfo;
- CPU_EXCHANGE_ROLE_INFO APInfo;
- MTRR_SETTINGS MtrrTable;
- UINT8 ApLoopMode;
- UINT8 ApTargetCState;
- UINT16 PmCodeSegment;
- UINT16 Pm16CodeSegment;
- CPU_AP_DATA *CpuData;
- volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;
-
- UINT32 CurrentTimerCount;
- UINTN DivideValue;
- UINT8 Vector;
- BOOLEAN PeriodicMode;
- BOOLEAN TimerInterruptState;
- UINT64 MicrocodePatchAddress;
- UINT64 MicrocodePatchRegionSize;
+ SPIN_LOCK MpLock;
+ UINTN Buffer;
+ UINTN CpuApStackSize;
+ MP_ASSEMBLY_ADDRESS_MAP AddressMap;
+ UINTN WakeupBuffer;
+ UINTN WakeupBufferHigh;
+ UINTN BackupBuffer;
+ UINTN BackupBufferSize;
+
+ volatile UINT32 FinishedCount;
+ UINT32 RunningCount;
+ BOOLEAN SingleThread;
+ EFI_AP_PROCEDURE Procedure;
+ VOID *ProcArguments;
+ BOOLEAN *Finished;
+ UINT64 ExpectedTime;
+ UINT64 CurrentTime;
+ UINT64 TotalTime;
+ EFI_EVENT WaitEvent;
+ UINTN **FailedCpuList;
+
+ AP_INIT_STATE InitFlag;
+ BOOLEAN SwitchBspFlag;
+ UINTN NewBspNumber;
+ CPU_EXCHANGE_ROLE_INFO BSPInfo;
+ CPU_EXCHANGE_ROLE_INFO APInfo;
+ MTRR_SETTINGS MtrrTable;
+ UINT8 ApLoopMode;
+ UINT8 ApTargetCState;
+ UINT16 PmCodeSegment;
+ UINT16 Pm16CodeSegment;
+ CPU_AP_DATA *CpuData;
+ volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo;
+
+ UINT32 CurrentTimerCount;
+ UINTN DivideValue;
+ UINT8 Vector;
+ BOOLEAN PeriodicMode;
+ BOOLEAN TimerInterruptState;
+ UINT64 MicrocodePatchAddress;
+ UINT64 MicrocodePatchRegionSize;
//
// Whether need to use Init-Sipi-Sipi to wake up the APs.
@@ -284,25 +284,25 @@ struct _CPU_MP_DATA {
// will be hardcode change to HLT mode by PiSmmCpuDxeSmm
// driver.
//
- BOOLEAN WakeUpByInitSipiSipi;
+ BOOLEAN WakeUpByInitSipiSipi;
- BOOLEAN SevEsIsEnabled;
- UINTN SevEsAPBuffer;
- UINTN SevEsAPResetStackStart;
- CPU_MP_DATA *NewCpuMpData;
+ BOOLEAN SevEsIsEnabled;
+ UINTN SevEsAPBuffer;
+ UINTN SevEsAPResetStackStart;
+ CPU_MP_DATA *NewCpuMpData;
- UINT64 GhcbBase;
+ UINT64 GhcbBase;
};
-#define AP_SAFE_STACK_SIZE 128
-#define AP_RESET_STACK_SIZE AP_SAFE_STACK_SIZE
+#define AP_SAFE_STACK_SIZE 128
+#define AP_RESET_STACK_SIZE AP_SAFE_STACK_SIZE
#pragma pack(1)
typedef struct {
- UINT8 InsnBuffer[8];
- UINT16 Rip;
- UINT16 Segment;
+ UINT8 InsnBuffer[8];
+ UINT16 Rip;
+ UINT16 Segment;
} SEV_ES_AP_JMP_FAR;
#pragma pack()
@@ -322,14 +322,14 @@ typedef struct {
**/
typedef
VOID
-(EFIAPI AP_RESET) (
+(EFIAPI AP_RESET)(
IN UINTN BufferStart,
IN UINT16 Code16,
IN UINT16 Code32,
IN UINTN StackStart
);
-extern EFI_GUID mCpuInitMpLibHobGuid;
+extern EFI_GUID mCpuInitMpLibHobGuid;
/**
Assembly code to place AP into safe loop mode.
@@ -347,7 +347,7 @@ extern EFI_GUID mCpuInitMpLibHobGuid;
**/
typedef
VOID
-(EFIAPI * ASM_RELOCATE_AP_LOOP) (
+(EFIAPI *ASM_RELOCATE_AP_LOOP)(
IN BOOLEAN MwaitSupport,
IN UINTN ApTargetCState,
IN UINTN PmCodeSegment,
@@ -367,7 +367,7 @@ VOID
VOID
EFIAPI
AsmGetAddressMap (
- OUT MP_ASSEMBLY_ADDRESS_MAP *AddressMap
+ OUT MP_ASSEMBLY_ADDRESS_MAP *AddressMap
);
/**
@@ -382,8 +382,8 @@ AsmGetAddressMap (
VOID
EFIAPI
AsmExchangeRole (
- IN CPU_EXCHANGE_ROLE_INFO *MyInfo,
- IN CPU_EXCHANGE_ROLE_INFO *OthersInfo
+ IN CPU_EXCHANGE_ROLE_INFO *MyInfo,
+ IN CPU_EXCHANGE_ROLE_INFO *OthersInfo
);
/**
@@ -403,10 +403,9 @@ GetCpuMpData (
**/
VOID
SaveCpuMpData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
);
-
/**
Get available system memory below 1MB by specified size.
@@ -417,7 +416,7 @@ SaveCpuMpData (
**/
UINTN
GetWakeupBuffer (
- IN UINTN WakeupBufferSize
+ IN UINTN WakeupBufferSize
);
/**
@@ -434,7 +433,7 @@ GetWakeupBuffer (
**/
UINTN
GetModeTransitionBuffer (
- IN UINTN BufferSize
+ IN UINTN BufferSize
);
/**
@@ -463,12 +462,12 @@ GetSevEsAPMemory (
**/
VOID
WakeUpAP (
- IN CPU_MP_DATA *CpuMpData,
- IN BOOLEAN Broadcast,
- IN UINTN ProcessorNumber,
- IN EFI_AP_PROCEDURE Procedure OPTIONAL,
- IN VOID *ProcedureArgument OPTIONAL,
- IN BOOLEAN WakeUpDisabledAps OPTIONAL
+ IN CPU_MP_DATA *CpuMpData,
+ IN BOOLEAN Broadcast,
+ IN UINTN ProcessorNumber,
+ IN EFI_AP_PROCEDURE Procedure OPTIONAL,
+ IN VOID *ProcedureArgument OPTIONAL,
+ IN BOOLEAN WakeUpDisabledAps OPTIONAL
);
/**
@@ -478,7 +477,7 @@ WakeUpAP (
**/
VOID
InitMpGlobalData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
);
/**
@@ -515,13 +514,13 @@ InitMpGlobalData (
**/
EFI_STATUS
StartupAllCPUsWorker (
- IN EFI_AP_PROCEDURE Procedure,
- IN BOOLEAN SingleThread,
- IN BOOLEAN ExcludeBsp,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT UINTN **FailedCpuList OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN BOOLEAN SingleThread,
+ IN BOOLEAN ExcludeBsp,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT UINTN **FailedCpuList OPTIONAL
);
/**
@@ -549,12 +548,12 @@ StartupAllCPUsWorker (
**/
EFI_STATUS
StartupThisAPWorker (
- IN EFI_AP_PROCEDURE Procedure,
- IN UINTN ProcessorNumber,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT BOOLEAN *Finished OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN ProcessorNumber,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT BOOLEAN *Finished OPTIONAL
);
/**
@@ -570,8 +569,8 @@ StartupThisAPWorker (
**/
EFI_STATUS
SwitchBSPWorker (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableOldBSP
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableOldBSP
);
/**
@@ -590,9 +589,9 @@ SwitchBSPWorker (
**/
EFI_STATUS
EnableDisableApWorker (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableAP,
- IN UINT32 *HealthFlag OPTIONAL
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableAP,
+ IN UINT32 *HealthFlag OPTIONAL
);
/**
@@ -618,7 +617,7 @@ GetCpuMpDataFromGuidedHob (
**/
EFI_STATUS
CheckThisAP (
- IN UINTN ProcessorNumber
+ IN UINTN ProcessorNumber
);
/**
@@ -655,8 +654,8 @@ CheckAndUpdateApsStatus (
**/
VOID
MicrocodeDetect (
- IN CPU_MP_DATA *CpuMpData,
- IN UINTN ProcessorNumber
+ IN CPU_MP_DATA *CpuMpData,
+ IN UINTN ProcessorNumber
);
/**
@@ -666,7 +665,7 @@ MicrocodeDetect (
**/
VOID
ShadowMicrocodeUpdatePatch (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
);
/**
@@ -686,8 +685,8 @@ ShadowMicrocodeUpdatePatch (
**/
BOOLEAN
GetMicrocodePatchInfoFromHob (
- UINT64 *Address,
- UINT64 *RegionSize
+ UINT64 *Address,
+ UINT64 *RegionSize
);
/**
@@ -721,8 +720,8 @@ EnableDebugAgent (
**/
EFI_STATUS
GetProcessorNumber (
- IN CPU_MP_DATA *CpuMpData,
- OUT UINTN *ProcessorNumber
+ IN CPU_MP_DATA *CpuMpData,
+ OUT UINTN *ProcessorNumber
);
/**
@@ -738,7 +737,7 @@ GetProcessorNumber (
**/
EFI_STATUS
PlatformShadowMicrocode (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
);
#endif
diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
index 90015c650c..ab79360bb9 100644
--- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c
@@ -11,7 +11,7 @@
#include <Guid/S3SmmInitDone.h>
#include <Ppi/ShadowMicrocode.h>
-STATIC UINT64 mSevEsPeiWakeupBuffer = BASE_1MB;
+STATIC UINT64 mSevEsPeiWakeupBuffer = BASE_1MB;
/**
S3 SMM Init Done notification function.
@@ -26,16 +26,15 @@ STATIC UINT64 mSevEsPeiWakeupBuffer = BASE_1MB;
EFI_STATUS
EFIAPI
NotifyOnS3SmmInitDonePpi (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
- IN VOID *InvokePpi
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
+ IN VOID *InvokePpi
);
-
//
// Global function
//
-EFI_PEI_NOTIFY_DESCRIPTOR mS3SmmInitDoneNotifyDesc = {
+EFI_PEI_NOTIFY_DESCRIPTOR mS3SmmInitDoneNotifyDesc = {
EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
&gEdkiiS3SmmInitDoneGuid,
NotifyOnS3SmmInitDonePpi
@@ -54,12 +53,12 @@ EFI_PEI_NOTIFY_DESCRIPTOR mS3SmmInitDoneNotifyDesc = {
EFI_STATUS
EFIAPI
NotifyOnS3SmmInitDonePpi (
- IN EFI_PEI_SERVICES **PeiServices,
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
- IN VOID *InvokePpi
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
+ IN VOID *InvokePpi
)
{
- CPU_MP_DATA *CpuMpData;
+ CPU_MP_DATA *CpuMpData;
CpuMpData = GetCpuMpData ();
@@ -76,7 +75,6 @@ NotifyOnS3SmmInitDonePpi (
return EFI_SUCCESS;
}
-
/**
Enable Debug Agent to support source debugging on AP function.
@@ -110,8 +108,9 @@ GetCpuMpData (
ASSERT (CpuMpData != NULL);
} else {
AsmReadIdtr (&Idtr);
- CpuMpData = (CPU_MP_DATA *) (Idtr.Base + Idtr.Limit + 1);
+ CpuMpData = (CPU_MP_DATA *)(Idtr.Base + Idtr.Limit + 1);
}
+
return CpuMpData;
}
@@ -122,17 +121,18 @@ GetCpuMpData (
**/
VOID
SaveCpuMpData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- UINT64 Data64;
+ UINT64 Data64;
+
//
// Build location of CPU MP DATA buffer in HOB
//
- Data64 = (UINT64) (UINTN) CpuMpData;
+ Data64 = (UINT64)(UINTN)CpuMpData;
BuildGuidDataHob (
&mCpuInitMpLibHobGuid,
- (VOID *) &Data64,
+ (VOID *)&Data64,
sizeof (UINT64)
);
}
@@ -148,15 +148,15 @@ SaveCpuMpData (
**/
BOOLEAN
CheckOverlapWithAllocatedBuffer (
- IN UINT64 WakeupBufferStart,
- IN UINT64 WakeupBufferEnd
+ IN UINT64 WakeupBufferStart,
+ IN UINT64 WakeupBufferEnd
)
{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
- BOOLEAN Overlapped;
- UINT64 MemoryStart;
- UINT64 MemoryEnd;
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
+ BOOLEAN Overlapped;
+ UINT64 MemoryStart;
+ UINT64 MemoryEnd;
Overlapped = FALSE;
//
@@ -176,8 +176,10 @@ CheckOverlapWithAllocatedBuffer (
break;
}
}
+
Hob.Raw = GET_NEXT_HOB (Hob);
}
+
return Overlapped;
}
@@ -191,12 +193,12 @@ CheckOverlapWithAllocatedBuffer (
**/
UINTN
GetWakeupBuffer (
- IN UINTN WakeupBufferSize
+ IN UINTN WakeupBufferSize
)
{
- EFI_PEI_HOB_POINTERS Hob;
- UINT64 WakeupBufferStart;
- UINT64 WakeupBufferEnd;
+ EFI_PEI_HOB_POINTERS Hob;
+ UINT64 WakeupBufferStart;
+ UINT64 WakeupBufferEnd;
WakeupBufferSize = (WakeupBufferSize + SIZE_4KB - 1) & ~(SIZE_4KB - 1);
@@ -216,14 +218,16 @@ GetWakeupBuffer (
(EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED |
EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED |
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED
- )) == 0)
- ) {
+ )) == 0)
+ )
+ {
//
// Need memory under 1MB to be collected here
//
WakeupBufferEnd = Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength;
if (PcdGetBool (PcdSevEsIsEnabled) &&
- WakeupBufferEnd > mSevEsPeiWakeupBuffer) {
+ (WakeupBufferEnd > mSevEsPeiWakeupBuffer))
+ {
//
// SEV-ES Wakeup buffer should be under 1MB and under any previous one
//
@@ -234,6 +238,7 @@ GetWakeupBuffer (
//
WakeupBufferEnd = BASE_1MB;
}
+
while (WakeupBufferEnd > WakeupBufferSize) {
//
// Wakeup buffer should be aligned on 4KB
@@ -242,6 +247,7 @@ GetWakeupBuffer (
if (WakeupBufferStart < Hob.ResourceDescriptor->PhysicalStart) {
break;
}
+
if (CheckOverlapWithAllocatedBuffer (WakeupBufferStart, WakeupBufferEnd)) {
//
// If this range is overlapped with existing allocated buffer, skip it
@@ -250,8 +256,13 @@ GetWakeupBuffer (
WakeupBufferEnd -= WakeupBufferSize;
continue;
}
- DEBUG ((DEBUG_INFO, "WakeupBufferStart = %x, WakeupBufferSize = %x\n",
- WakeupBufferStart, WakeupBufferSize));
+
+ DEBUG ((
+ DEBUG_INFO,
+ "WakeupBufferStart = %x, WakeupBufferSize = %x\n",
+ WakeupBufferStart,
+ WakeupBufferSize
+ ));
if (PcdGetBool (PcdSevEsIsEnabled)) {
//
@@ -265,13 +276,14 @@ GetWakeupBuffer (
}
}
}
+
//
// Find the next HOB
//
Hob.Raw = GET_NEXT_HOB (Hob);
}
- return (UINTN) -1;
+ return (UINTN)-1;
}
/**
@@ -288,7 +300,7 @@ GetWakeupBuffer (
**/
UINTN
GetModeTransitionBuffer (
- IN UINTN BufferSize
+ IN UINTN BufferSize
)
{
//
@@ -336,17 +348,17 @@ CheckAndUpdateApsStatus (
**/
VOID
BuildMicrocodeCacheHob (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
- EDKII_MICROCODE_PATCH_HOB *MicrocodeHob;
- UINTN HobDataLength;
- UINT32 Index;
+ EDKII_MICROCODE_PATCH_HOB *MicrocodeHob;
+ UINTN HobDataLength;
+ UINT32 Index;
HobDataLength = sizeof (EDKII_MICROCODE_PATCH_HOB) +
sizeof (UINT64) * CpuMpData->CpuCount;
- MicrocodeHob = AllocatePool (HobDataLength);
+ MicrocodeHob = AllocatePool (HobDataLength);
if (MicrocodeHob == NULL) {
ASSERT (FALSE);
return;
@@ -387,7 +399,7 @@ BuildMicrocodeCacheHob (
**/
VOID
InitMpGlobalData (
- IN CPU_MP_DATA *CpuMpData
+ IN CPU_MP_DATA *CpuMpData
)
{
EFI_STATUS Status;
@@ -480,12 +492,12 @@ InitMpGlobalData (
EFI_STATUS
EFIAPI
MpInitLibStartupAllAPs (
- IN EFI_AP_PROCEDURE Procedure,
- IN BOOLEAN SingleThread,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT UINTN **FailedCpuList OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN BOOLEAN SingleThread,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT UINTN **FailedCpuList OPTIONAL
)
{
if (WaitEvent != NULL) {
@@ -577,12 +589,12 @@ MpInitLibStartupAllAPs (
EFI_STATUS
EFIAPI
MpInitLibStartupThisAP (
- IN EFI_AP_PROCEDURE Procedure,
- IN UINTN ProcessorNumber,
- IN EFI_EVENT WaitEvent OPTIONAL,
- IN UINTN TimeoutInMicroseconds,
- IN VOID *ProcedureArgument OPTIONAL,
- OUT BOOLEAN *Finished OPTIONAL
+ IN EFI_AP_PROCEDURE Procedure,
+ IN UINTN ProcessorNumber,
+ IN EFI_EVENT WaitEvent OPTIONAL,
+ IN UINTN TimeoutInMicroseconds,
+ IN VOID *ProcedureArgument OPTIONAL,
+ OUT BOOLEAN *Finished OPTIONAL
)
{
if (WaitEvent != NULL) {
@@ -628,8 +640,8 @@ MpInitLibStartupThisAP (
EFI_STATUS
EFIAPI
MpInitLibSwitchBSP (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableOldBSP
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableOldBSP
)
{
return SwitchBSPWorker (ProcessorNumber, EnableOldBSP);
@@ -668,9 +680,9 @@ MpInitLibSwitchBSP (
EFI_STATUS
EFIAPI
MpInitLibEnableDisableAP (
- IN UINTN ProcessorNumber,
- IN BOOLEAN EnableAP,
- IN UINT32 *HealthFlag OPTIONAL
+ IN UINTN ProcessorNumber,
+ IN BOOLEAN EnableAP,
+ IN UINT32 *HealthFlag OPTIONAL
)
{
return EnableDisableApWorker (ProcessorNumber, EnableAP, HealthFlag);
@@ -689,29 +701,29 @@ MpInitLibEnableDisableAP (
**/
EFI_STATUS
PlatformShadowMicrocode (
- IN OUT CPU_MP_DATA *CpuMpData
+ IN OUT CPU_MP_DATA *CpuMpData
)
{
- EFI_STATUS Status;
- EDKII_PEI_SHADOW_MICROCODE_PPI *ShadowMicrocodePpi;
- UINTN CpuCount;
- EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId;
- UINTN Index;
- UINTN BufferSize;
- VOID *Buffer;
+ EFI_STATUS Status;
+ EDKII_PEI_SHADOW_MICROCODE_PPI *ShadowMicrocodePpi;
+ UINTN CpuCount;
+ EDKII_PEI_MICROCODE_CPU_ID *MicrocodeCpuId;
+ UINTN Index;
+ UINTN BufferSize;
+ VOID *Buffer;
Status = PeiServicesLocatePpi (
&gEdkiiPeiShadowMicrocodePpiGuid,
0,
NULL,
- (VOID **) &ShadowMicrocodePpi
+ (VOID **)&ShadowMicrocodePpi
);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
- CpuCount = CpuMpData->CpuCount;
- MicrocodeCpuId = (EDKII_PEI_MICROCODE_CPU_ID *) AllocateZeroPool (sizeof (EDKII_PEI_MICROCODE_CPU_ID) * CpuCount);
+ CpuCount = CpuMpData->CpuCount;
+ MicrocodeCpuId = (EDKII_PEI_MICROCODE_CPU_ID *)AllocateZeroPool (sizeof (EDKII_PEI_MICROCODE_CPU_ID) * CpuCount);
if (MicrocodeCpuId == NULL) {
return EFI_OUT_OF_RESOURCES;
}
@@ -722,24 +734,26 @@ PlatformShadowMicrocode (
}
Status = ShadowMicrocodePpi->ShadowMicrocode (
- ShadowMicrocodePpi,
- CpuCount,
- MicrocodeCpuId,
- &BufferSize,
- &Buffer
- );
+ ShadowMicrocodePpi,
+ CpuCount,
+ MicrocodeCpuId,
+ &BufferSize,
+ &Buffer
+ );
FreePool (MicrocodeCpuId);
if (EFI_ERROR (Status)) {
return EFI_NOT_FOUND;
}
- CpuMpData->MicrocodePatchAddress = (UINTN) Buffer;
+ CpuMpData->MicrocodePatchAddress = (UINTN)Buffer;
CpuMpData->MicrocodePatchRegionSize = BufferSize;
DEBUG ((
DEBUG_INFO,
"%a: Required microcode patches have been loaded at 0x%lx, with size 0x%lx.\n",
- __FUNCTION__, CpuMpData->MicrocodePatchAddress, CpuMpData->MicrocodePatchRegionSize
+ __FUNCTION__,
+ CpuMpData->MicrocodePatchAddress,
+ CpuMpData->MicrocodePatchRegionSize
));
return EFI_SUCCESS;