diff options
author | Chen Fan <chen.fan.fnst@cn.fujitsu.com> | 2014-11-13 18:29:40 +0000 |
---|---|---|
committer | jljusten <jljusten@Edk2> | 2014-11-13 18:29:40 +0000 |
commit | 0e724fc1981b3c47bb16432c4c414a50c9e3a519 (patch) | |
tree | e7b9c2fd17e043bb3a7fde5cb886da94e1aeef89 /UefiCpuPkg | |
parent | 232eb4c82637e92b65ebbfc89a45e9daa8535171 (diff) | |
download | edk2-platforms-0e724fc1981b3c47bb16432c4c414a50c9e3a519.tar.xz |
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
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r-- | UefiCpuPkg/CpuDxe/CpuMp.c | 9 | ||||
-rw-r--r-- | UefiCpuPkg/CpuDxe/CpuMp.h | 1 |
2 files changed, 10 insertions, 0 deletions
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 10065762a2..e03c7f1e49 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -52,6 +52,7 @@ GetMpSpinLock ( while (!AcquireSpinLockOrFail (&CpuData->CpuDataLock)) {
CpuPause ();
}
+ CpuData->LockSelf = GetApicId ();
}
/**
@@ -1145,6 +1146,13 @@ ProcessorToIdleState ( 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.
//
GetMpSpinLock (CpuData);
@@ -1395,6 +1403,7 @@ FillInProcessorInformation ( CpuData->Procedure = NULL;
CpuData->Parameter = NULL;
InitializeSpinLock (&CpuData->CpuDataLock);
+ CpuData->LockSelf = -1;
return EFI_SUCCESS;
}
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h index 4254419a93..5c892381ef 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.h +++ b/UefiCpuPkg/CpuDxe/CpuMp.h @@ -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;
|