From ca186b1d4f186779a11319b1fa45a29de20534dc Mon Sep 17 00:00:00 2001 From: Chen Fan Date: Fri, 21 Nov 2014 22:46:26 +0000 Subject: EmulatorPkg/MpService: fix wrong unsigned to signed variable transition Because TimeoutInMicrosecsond is a unsigned value, converting it to signed value will cause the data region changed. so this patch fix that. 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@16415 6f19259b-4bc3-4df7-8a09-765794883524 --- EmulatorPkg/CpuRuntimeDxe/MpService.c | 41 ++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'EmulatorPkg/CpuRuntimeDxe') diff --git a/EmulatorPkg/CpuRuntimeDxe/MpService.c b/EmulatorPkg/CpuRuntimeDxe/MpService.c index d6dd9842aa..2312fc527e 100644 --- a/EmulatorPkg/CpuRuntimeDxe/MpService.c +++ b/EmulatorPkg/CpuRuntimeDxe/MpService.c @@ -111,8 +111,31 @@ GetNextBlockedNumber ( return EFI_NOT_FOUND; } +/** + * Calculated and stalled the interval time by BSP to check whether + * the APs have finished. + * + * @param[in] Timeout The time limit in microseconds for + * APs to return from Procedure. + * + * @retval StallTime Time of execution stall. +**/ +UINTN +CalculateAndStallInterval ( + IN UINTN Timeout + ) +{ + UINTN StallTime; + if (Timeout < gPollInterval && Timeout != 0) { + StallTime = Timeout; + } else { + StallTime = gPollInterval; + } + gBS->Stall (StallTime); + return StallTime; +} /** This service retrieves the number of logical processor in the platform @@ -378,7 +401,7 @@ CpuMpServicesStartupAllAps ( UINTN NextNumber; PROCESSOR_STATE APInitialState; PROCESSOR_STATE ProcessorState; - INTN Timeout; + UINTN Timeout; if (!IsBSP ()) { @@ -540,13 +563,12 @@ CpuMpServicesStartupAllAps ( goto Done; } - if ((TimeoutInMicroseconds != 0) && (Timeout < 0)) { + if ((TimeoutInMicroseconds != 0) && (Timeout == 0)) { Status = EFI_TIMEOUT; goto Done; } - gBS->Stall (gPollInterval); - Timeout -= gPollInterval; + Timeout -= CalculateAndStallInterval (Timeout); } Done: @@ -659,7 +681,7 @@ CpuMpServicesStartupThisAP ( OUT BOOLEAN *Finished OPTIONAL ) { - INTN Timeout; + UINTN Timeout; if (!IsBSP ()) { return EFI_DEVICE_ERROR; @@ -717,12 +739,11 @@ CpuMpServicesStartupThisAP ( gThread->MutexUnlock (gMPSystem.ProcessorData[ProcessorNumber].StateLock); - if ((TimeoutInMicroseconds != 0) && (Timeout < 0)) { + if ((TimeoutInMicroseconds != 0) && (Timeout == 0)) { return EFI_TIMEOUT; } - gBS->Stall (gPollInterval); - Timeout -= gPollInterval; + Timeout -= CalculateAndStallInterval (Timeout); } return EFI_SUCCESS; @@ -987,7 +1008,7 @@ CpuCheckAllAPsStatus ( BOOLEAN Found; if (gMPSystem.TimeoutActive) { - gMPSystem.Timeout -= gPollInterval; + gMPSystem.Timeout -= CalculateAndStallInterval (gMPSystem.Timeout); } for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; ProcessorNumber++) { @@ -1040,7 +1061,7 @@ CpuCheckAllAPsStatus ( } } - if (gMPSystem.TimeoutActive && gMPSystem.Timeout < 0) { + if (gMPSystem.TimeoutActive && gMPSystem.Timeout == 0) { // // Timeout // -- cgit v1.2.3