UefiCpuPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the UefiCpuPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
committed by
mergify[bot]
parent
91415a36ae
commit
053e878bfb
@@ -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
|
||||
)
|
||||
{
|
||||
//
|
||||
|
@@ -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;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user