From a31a3b4a3e16d10fee4bac2fc56eee24cd1a90a4 Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Thu, 31 Jul 2014 15:45:27 +0000 Subject: EmulatorPkg/Mpservice: Add StateLock where missing Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15730 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/CpuRuntimeDxe/MpService.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'EmulatorPkg/CpuRuntimeDxe') 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; -- cgit v1.2.3