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:
Jeff Fan
2016-07-30 01:32:25 +08:00
parent 0b9f0dd635
commit 39d49a73a5
9 changed files with 1 additions and 1359 deletions

View File

@@ -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.