UefiCpuPkg/MpService: avoid reset AP still hold a lock

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16368 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Chen Fan 2014-11-13 18:29:40 +00:00 committed by jljusten
parent 232eb4c826
commit 0e724fc198
2 changed files with 10 additions and 0 deletions

View File

@ -52,6 +52,7 @@ GetMpSpinLock (
while (!AcquireSpinLockOrFail (&CpuData->CpuDataLock)) {
CpuPause ();
}
CpuData->LockSelf = GetApicId ();
}
/**
@ -1144,6 +1145,13 @@ ProcessorToIdleState (
WhoAmI (&mMpServicesTemplate, &ProcessorNumber);
CpuData = &mMpSystemData.CpuDatas[ProcessorNumber];
//
// Avoid forcibly reset AP caused the AP got lock not release.
//
if (CpuData->LockSelf == (INTN) GetApicId ()) {
ReleaseSpinLock (&CpuData->CpuDataLock);
}
//
// Avoid forcibly reset AP caused the AP State is not updated.
//
@ -1395,6 +1403,7 @@ FillInProcessorInformation (
CpuData->Procedure = NULL;
CpuData->Parameter = NULL;
InitializeSpinLock (&CpuData->CpuDataLock);
CpuData->LockSelf = -1;
return EFI_SUCCESS;
}

View File

@ -90,6 +90,7 @@ typedef enum {
typedef struct {
EFI_PROCESSOR_INFORMATION Info;
SPIN_LOCK CpuDataLock;
INTN LockSelf;
volatile CPU_STATE State;
EFI_AP_PROCEDURE Procedure;