diff options
author | Chen Fan <chen.fan.fnst@cn.fujitsu.com> | 2014-07-31 15:45:27 +0000 |
---|---|---|
committer | jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524> | 2014-07-31 15:45:27 +0000 |
commit | a31a3b4a3e16d10fee4bac2fc56eee24cd1a90a4 (patch) | |
tree | da91c03651b3c7147efd504b5de708a8333d0cea /EmulatorPkg | |
parent | 0dd40e14605814cc661da77ae4102c425cc4476c (diff) | |
download | edk2-platforms-a31a3b4a3e16d10fee4bac2fc56eee24cd1a90a4.tar.xz |
EmulatorPkg/Mpservice: Add StateLock where missing
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15730 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EmulatorPkg')
-rw-r--r-- | EmulatorPkg/CpuRuntimeDxe/MpService.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/EmulatorPkg/CpuRuntimeDxe/MpService.c b/EmulatorPkg/CpuRuntimeDxe/MpService.c index d79abd2989..536a47f7ec 100644 --- a/EmulatorPkg/CpuRuntimeDxe/MpService.c +++ b/EmulatorPkg/CpuRuntimeDxe/MpService.c @@ -437,17 +437,17 @@ CpuMpServicesStartupAllAps ( // state 1 by 1, until the previous 1 finished its task
// if not "SingleThread", all APs are put to ready state from the beginning
//
+ gThread->MutexLock(ProcessorData->StateLock);
if (ProcessorData->State == CPU_STATE_IDLE) {
- gMPSystem.StartCount++;
-
- gThread->MutexLock (ProcessorData->StateLock);
ProcessorData->State = APInitialState;
gThread->MutexUnlock (ProcessorData->StateLock);
+ gMPSystem.StartCount++;
if (SingleThread) {
APInitialState = CPU_STATE_BLOCKED;
}
} else {
+ gThread->MutexUnlock (ProcessorData->StateLock);
return EFI_NOT_READY;
}
}
@@ -671,9 +671,12 @@ CpuMpServicesStartupThisAP ( return EFI_INVALID_PARAMETER;
}
+ gThread->MutexLock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {
+ gThread->MutexUnlock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
return EFI_NOT_READY;
}
+ gThread->MutexUnlock(gMPSystem.ProcessorData[ProcessorNumber].StateLock);
if ((WaitEvent != NULL) && gReadToBoot) {
return EFI_UNSUPPORTED;
@@ -789,9 +792,12 @@ CpuMpServicesSwitchBSP ( }
ASSERT (Index != gMPSystem.NumberOfProcessors);
+ gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {
+ gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
return EFI_NOT_READY;
}
+ gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
// Skip for now as we need switch a bunch of stack stuff around and it's complex
// May not be worth it?
@@ -861,9 +867,12 @@ CpuMpServicesEnableDisableAP ( return EFI_INVALID_PARAMETER;
}
+ gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
if (gMPSystem.ProcessorData[ProcessorNumber].State != CPU_STATE_IDLE) {
+ gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
return EFI_UNSUPPORTED;
}
+ gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
if (EnableAP) {
if ((gMPSystem.ProcessorData[ProcessorNumber].Info.StatusFlag & PROCESSOR_ENABLED_BIT) == 0 ) {
@@ -1019,7 +1028,9 @@ CpuCheckAllAPsStatus ( }
}
+ gThread->MutexLock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
gMPSystem.ProcessorData[ProcessorNumber].State = CPU_STATE_IDLE;
+ gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock);
gMPSystem.FinishCount++;
break;
|