diff options
author | Chen Fan <chen.fan.fnst@cn.fujitsu.com> | 2014-11-21 22:46:26 +0000 |
---|---|---|
committer | jljusten <jljusten@Edk2> | 2014-11-21 22:46:26 +0000 |
commit | ca186b1d4f186779a11319b1fa45a29de20534dc (patch) | |
tree | 46373eeda8fb2fef820bde23b0561446c52f4cb1 /EmulatorPkg | |
parent | a99b5e629b7f37dbe2c521e4f2a2b74e27af33b3 (diff) | |
download | edk2-platforms-ca186b1d4f186779a11319b1fa45a29de20534dc.tar.xz |
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 <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@16415 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EmulatorPkg')
-rw-r--r-- | EmulatorPkg/CpuRuntimeDxe/MpService.c | 41 |
1 files changed, 31 insertions, 10 deletions
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
//
|