summaryrefslogtreecommitdiffstats
path: root/EmulatorPkg/CpuRuntimeDxe
diff options
context:
space:
mode:
authorChen Fan <chen.fan.fnst@cn.fujitsu.com>2014-11-21 22:46:26 +0000
committerjljusten <jljusten@Edk2>2014-11-21 22:46:26 +0000
commitca186b1d4f186779a11319b1fa45a29de20534dc (patch)
tree46373eeda8fb2fef820bde23b0561446c52f4cb1 /EmulatorPkg/CpuRuntimeDxe
parenta99b5e629b7f37dbe2c521e4f2a2b74e27af33b3 (diff)
downloadedk2-ca186b1d4f186779a11319b1fa45a29de20534dc.tar.gz
edk2-ca186b1d4f186779a11319b1fa45a29de20534dc.tar.bz2
edk2-ca186b1d4f186779a11319b1fa45a29de20534dc.zip
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/CpuRuntimeDxe')
-rw-r--r--EmulatorPkg/CpuRuntimeDxe/MpService.c41
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
//