UefiCpuPkg/CpuDxe: Remove unused codes and files
v5: 1. Remove unused PcdCpuApStackSize and PcdCpuApInitTimeOutInMicroSeconds. v4: 1. Keep GDT table setup to fix IA32 S3 boot issue. Cc: Michael Kinney <michael.d.kinney@intel.com> Cc: Feng Tian <feng.tian@intel.com> Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Michael Kinney <michael.d.kinney@intel.com> Tested-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Michael Kinney <michael.d.kinney@intel.com>
This commit is contained in:
@@ -15,20 +15,8 @@
|
||||
#include "CpuDxe.h"
|
||||
#include "CpuMp.h"
|
||||
|
||||
UINTN gMaxLogicalProcessorNumber;
|
||||
UINTN gApStackSize;
|
||||
UINTN gPollInterval = 100; // 100 microseconds
|
||||
|
||||
MP_SYSTEM_DATA mMpSystemData;
|
||||
EFI_HANDLE mMpServiceHandle = NULL;
|
||||
UINTN mNumberOfProcessors = 1;
|
||||
EFI_EVENT mExitBootServicesEvent = (EFI_EVENT)NULL;
|
||||
|
||||
VOID *mCommonStack = 0;
|
||||
VOID *mTopOfApCommonStack = 0;
|
||||
VOID *mApStackStart = 0;
|
||||
|
||||
volatile BOOLEAN mAPsAlreadyInitFinished = FALSE;
|
||||
|
||||
EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
||||
GetNumberOfProcessors,
|
||||
@@ -40,372 +28,6 @@ EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate = {
|
||||
WhoAmI
|
||||
};
|
||||
|
||||
/**
|
||||
Get Mp Service Lock.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified processor
|
||||
|
||||
**/
|
||||
VOID
|
||||
GetMpSpinLock (
|
||||
IN CPU_DATA_BLOCK *CpuData
|
||||
)
|
||||
{
|
||||
while (!AcquireSpinLockOrFail (&CpuData->CpuDataLock)) {
|
||||
CpuPause ();
|
||||
}
|
||||
CpuData->LockSelf = GetApicId ();
|
||||
}
|
||||
|
||||
/**
|
||||
Release Mp Service Lock.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified processor
|
||||
|
||||
**/
|
||||
VOID
|
||||
ReleaseMpSpinLock (
|
||||
IN CPU_DATA_BLOCK *CpuData
|
||||
)
|
||||
{
|
||||
ReleaseSpinLock (&CpuData->CpuDataLock);
|
||||
}
|
||||
|
||||
/**
|
||||
Check whether caller processor is BSP.
|
||||
|
||||
@retval TRUE the caller is BSP
|
||||
@retval FALSE the caller is AP
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
IsBSP (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINTN CpuIndex;
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
|
||||
CpuData = NULL;
|
||||
|
||||
WhoAmI (&mMpServicesTemplate, &CpuIndex);
|
||||
CpuData = &mMpSystemData.CpuDatas[CpuIndex];
|
||||
|
||||
return CpuData->Info.StatusFlag & PROCESSOR_AS_BSP_BIT ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
Get the Application Processors state.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified AP
|
||||
|
||||
@retval CPU_STATE the AP status
|
||||
|
||||
**/
|
||||
STATIC
|
||||
CPU_STATE
|
||||
GetApState (
|
||||
IN CPU_DATA_BLOCK *CpuData
|
||||
)
|
||||
{
|
||||
CPU_STATE State;
|
||||
|
||||
GetMpSpinLock (CpuData);
|
||||
State = CpuData->State;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
|
||||
return State;
|
||||
}
|
||||
|
||||
/**
|
||||
Set the Application Processors state.
|
||||
|
||||
@param CpuData The pointer to CPU_DATA_BLOCK of specified AP
|
||||
@param State The AP status
|
||||
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
SetApState (
|
||||
IN CPU_DATA_BLOCK *CpuData,
|
||||
IN CPU_STATE State
|
||||
)
|
||||
{
|
||||
GetMpSpinLock (CpuData);
|
||||
CpuData->State = State;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
}
|
||||
|
||||
/**
|
||||
Set the Application Processor prepare to run a function specified
|
||||
by Params.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified AP
|
||||
@param Procedure A pointer to the function to be run on enabled APs of the system
|
||||
@param ProcedureArgument Pointer to the optional parameter of the assigned function
|
||||
|
||||
**/
|
||||
VOID
|
||||
SetApProcedure (
|
||||
IN CPU_DATA_BLOCK *CpuData,
|
||||
IN EFI_AP_PROCEDURE Procedure,
|
||||
IN VOID *ProcedureArgument
|
||||
)
|
||||
{
|
||||
GetMpSpinLock (CpuData);
|
||||
CpuData->Parameter = ProcedureArgument;
|
||||
CpuData->Procedure = Procedure;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
}
|
||||
|
||||
/**
|
||||
Check the Application Processors Status whether contains the Flags.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified AP
|
||||
@param Flags the StatusFlag describing in EFI_PROCESSOR_INFORMATION
|
||||
|
||||
@retval TRUE the AP status includes the StatusFlag
|
||||
@retval FALSE the AP status excludes the StatusFlag
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
TestCpuStatusFlag (
|
||||
IN CPU_DATA_BLOCK *CpuData,
|
||||
IN UINT32 Flags
|
||||
)
|
||||
{
|
||||
UINT32 Ret;
|
||||
|
||||
GetMpSpinLock (CpuData);
|
||||
Ret = CpuData->Info.StatusFlag & Flags;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
|
||||
return (BOOLEAN) (Ret != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Bitwise-Or of the Application Processors Status with the Flags.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified AP
|
||||
@param Flags the StatusFlag describing in EFI_PROCESSOR_INFORMATION
|
||||
|
||||
**/
|
||||
VOID
|
||||
CpuStatusFlagOr (
|
||||
IN CPU_DATA_BLOCK *CpuData,
|
||||
IN UINT32 Flags
|
||||
)
|
||||
{
|
||||
GetMpSpinLock (CpuData);
|
||||
CpuData->Info.StatusFlag |= Flags;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
}
|
||||
|
||||
/**
|
||||
Bitwise-AndNot of the Application Processors Status with the Flags.
|
||||
|
||||
@param CpuData the pointer to CPU_DATA_BLOCK of specified AP
|
||||
@param Flags the StatusFlag describing in EFI_PROCESSOR_INFORMATION
|
||||
|
||||
**/
|
||||
VOID
|
||||
CpuStatusFlagAndNot (
|
||||
IN CPU_DATA_BLOCK *CpuData,
|
||||
IN UINT32 Flags
|
||||
)
|
||||
{
|
||||
GetMpSpinLock (CpuData);
|
||||
CpuData->Info.StatusFlag &= ~Flags;
|
||||
ReleaseMpSpinLock (CpuData);
|
||||
}
|
||||
|
||||
/**
|
||||
Searches for the next blocking AP.
|
||||
|
||||
Search for the next AP that is put in blocking state by single-threaded StartupAllAPs().
|
||||
|
||||
@param NextNumber Pointer to the processor number of the next blocking AP.
|
||||
|
||||
@retval EFI_SUCCESS The next blocking AP has been found.
|
||||
@retval EFI_NOT_FOUND No blocking AP exists.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetNextBlockedNumber (
|
||||
OUT UINTN *NextNumber
|
||||
)
|
||||
{
|
||||
UINTN Number;
|
||||
CPU_STATE CpuState;
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
|
||||
for (Number = 0; Number < mMpSystemData.NumberOfProcessors; Number++) {
|
||||
CpuData = &mMpSystemData.CpuDatas[Number];
|
||||
if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {
|
||||
//
|
||||
// Skip BSP
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
CpuState = GetApState (CpuData);
|
||||
if (CpuState == CpuStateBlocked) {
|
||||
*NextNumber = Number;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
Check if the APs state are finished, and update them to idle state
|
||||
by StartupAllAPs().
|
||||
|
||||
**/
|
||||
VOID
|
||||
CheckAndUpdateAllAPsToIdleState (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINTN ProcessorNumber;
|
||||
UINTN NextNumber;
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
EFI_STATUS Status;
|
||||
CPU_STATE CpuState;
|
||||
|
||||
for (ProcessorNumber = 0; ProcessorNumber < mMpSystemData.NumberOfProcessors; ProcessorNumber++) {
|
||||
CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
|
||||
if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {
|
||||
//
|
||||
// Skip BSP
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!TestCpuStatusFlag (CpuData, PROCESSOR_ENABLED_BIT)) {
|
||||
//
|
||||
// Skip Disabled processors
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
CpuState = GetApState (CpuData);
|
||||
if (CpuState == CpuStateFinished) {
|
||||
mMpSystemData.FinishCount++;
|
||||
if (mMpSystemData.SingleThread) {
|
||||
Status = GetNextBlockedNumber (&NextNumber);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
SetApState (&mMpSystemData.CpuDatas[NextNumber], CpuStateReady);
|
||||
SetApProcedure (&mMpSystemData.CpuDatas[NextNumber],
|
||||
mMpSystemData.Procedure,
|
||||
mMpSystemData.ProcedureArgument);
|
||||
//
|
||||
// If this AP previous state is blocked, we should
|
||||
// wake up this AP by sent a SIPI. and avoid
|
||||
// re-involve the sleeping state. we must call
|
||||
// SetApProcedure() first.
|
||||
//
|
||||
ResetProcessorToIdleState (&mMpSystemData.CpuDatas[NextNumber]);
|
||||
}
|
||||
}
|
||||
SetApState (CpuData, CpuStateIdle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Check if all APs are in state CpuStateSleeping.
|
||||
|
||||
Return TRUE if all APs are in the CpuStateSleeping state. Do not
|
||||
check the state of the BSP or any disabled APs.
|
||||
|
||||
@retval TRUE All APs are in CpuStateSleeping state.
|
||||
@retval FALSE One or more APs are not in CpuStateSleeping state.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckAllAPsSleeping (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINTN ProcessorNumber;
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
|
||||
for (ProcessorNumber = 0; ProcessorNumber < mMpSystemData.NumberOfProcessors; ProcessorNumber++) {
|
||||
CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
|
||||
if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {
|
||||
//
|
||||
// Skip BSP
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!TestCpuStatusFlag (CpuData, PROCESSOR_ENABLED_BIT)) {
|
||||
//
|
||||
// Skip Disabled processors
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
if (GetApState (CpuData) != CpuStateSleeping) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
If the timeout expires before all APs returns from Procedure,
|
||||
we should forcibly terminate the executing AP and fill FailedList back
|
||||
by StartupAllAPs().
|
||||
|
||||
**/
|
||||
VOID
|
||||
ResetAllFailedAPs (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CPU_DATA_BLOCK *CpuData;
|
||||
UINTN Number;
|
||||
CPU_STATE CpuState;
|
||||
|
||||
if (mMpSystemData.FailedList != NULL) {
|
||||
*mMpSystemData.FailedList = AllocatePool ((mMpSystemData.StartCount - mMpSystemData.FinishCount + 1) * sizeof(UINTN));
|
||||
ASSERT (*mMpSystemData.FailedList != NULL);
|
||||
}
|
||||
|
||||
for (Number = 0; Number < mMpSystemData.NumberOfProcessors; Number++) {
|
||||
CpuData = &mMpSystemData.CpuDatas[Number];
|
||||
if (TestCpuStatusFlag (CpuData, PROCESSOR_AS_BSP_BIT)) {
|
||||
//
|
||||
// Skip BSP
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!TestCpuStatusFlag (CpuData, PROCESSOR_ENABLED_BIT)) {
|
||||
//
|
||||
// Skip Disabled processors
|
||||
//
|
||||
continue;
|
||||
}
|
||||
|
||||
CpuState = GetApState (CpuData);
|
||||
if (CpuState != CpuStateIdle &&
|
||||
CpuState != CpuStateSleeping) {
|
||||
if (mMpSystemData.FailedList != NULL) {
|
||||
(*mMpSystemData.FailedList)[mMpSystemData.FailedListIndex++] = Number;
|
||||
}
|
||||
ResetProcessorToIdleState (CpuData);
|
||||
}
|
||||
}
|
||||
|
||||
if (mMpSystemData.FailedList != NULL) {
|
||||
(*mMpSystemData.FailedList)[mMpSystemData.FailedListIndex] = END_OF_CPU_LIST;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This service retrieves the number of logical processor in the platform
|
||||
and the number of those logical processors that are enabled on this boot.
|
||||
@@ -978,28 +600,6 @@ CollectBistDataFromHob (
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Callback function for ExitBootServices.
|
||||
|
||||
@param Event Event whose notification function is being invoked.
|
||||
@param Context The pointer to the notification function's context,
|
||||
which is implementation-dependent.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
ExitBootServicesCallback (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
//
|
||||
// Avoid APs access invalid buff datas which allocated by BootServices,
|
||||
// so we send INIT IPI to APs to let them wait for SIPI state.
|
||||
//
|
||||
SendInitIpiAllExcludingSelf ();
|
||||
}
|
||||
|
||||
/**
|
||||
Initialize Multi-processor support.
|
||||
|
||||
|
Reference in New Issue
Block a user