Revision: 16415
          http://sourceforge.net/p/edk2/code/16415
Author:   jljusten
Date:     2014-11-21 22:46:26 +0000 (Fri, 21 Nov 2014)
Log Message:
-----------
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 <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>

Modified Paths:
--------------
    trunk/edk2/EmulatorPkg/CpuRuntimeDxe/MpService.c

Modified: trunk/edk2/EmulatorPkg/CpuRuntimeDxe/MpService.c
===================================================================
--- trunk/edk2/EmulatorPkg/CpuRuntimeDxe/MpService.c    2014-11-21 09:40:47 UTC 
(rev 16414)
+++ trunk/edk2/EmulatorPkg/CpuRuntimeDxe/MpService.c    2014-11-21 22:46:26 UTC 
(rev 16415)
@@ -111,8 +111,31 @@
   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 @@
   UINTN                 NextNumber;
   PROCESSOR_STATE       APInitialState;
   PROCESSOR_STATE       ProcessorState;
-  INTN                  Timeout;
+  UINTN                 Timeout;
 
 
   if (!IsBSP ()) {
@@ -540,13 +563,12 @@
       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 @@
   OUT BOOLEAN                   *Finished               OPTIONAL
   )
 {
-  INTN            Timeout;
+  UINTN            Timeout;
 
   if (!IsBSP ()) {
     return EFI_DEVICE_ERROR;
@@ -717,12 +739,11 @@
 
     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 @@
   BOOLEAN               Found;
 
   if (gMPSystem.TimeoutActive) {
-    gMPSystem.Timeout -= gPollInterval;
+    gMPSystem.Timeout -= CalculateAndStallInterval (gMPSystem.Timeout);
   }
 
   for (ProcessorNumber = 0; ProcessorNumber < gMPSystem.NumberOfProcessors; 
ProcessorNumber++) {
@@ -1040,7 +1061,7 @@
     }
   }
 
-  if (gMPSystem.TimeoutActive && gMPSystem.Timeout < 0) {
+  if (gMPSystem.TimeoutActive && gMPSystem.Timeout == 0) {
     //
     // Timeout
     //


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to