summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/PC/DevACPI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Devices/PC/DevACPI.cpp')
-rw-r--r--src/VBox/Devices/PC/DevACPI.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/VBox/Devices/PC/DevACPI.cpp b/src/VBox/Devices/PC/DevACPI.cpp
index 30d6775d3..f83d1f8f1 100644
--- a/src/VBox/Devices/PC/DevACPI.cpp
+++ b/src/VBox/Devices/PC/DevACPI.cpp
@@ -198,7 +198,8 @@ typedef struct ACPIState
uint16_t pm1a_ctl;
/** Number of logical CPUs in guest */
uint16_t cCpus;
- int64_t pm_timer_initial;
+ uint64_t u64PmTimerInitial;
+ uint64_t u64PmTimerLastSeen;
PTMTIMERR3 tsR3;
PTMTIMERR0 tsR0;
PTMTIMERRC tsRC;
@@ -1888,10 +1889,17 @@ PDMBOTHCBDECL(int) acpiPMTmrRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port
if (cb == 4)
{
ACPIState *s = PDMINS_2_DATA(pDevIns, ACPIState *);
- int64_t now = TMTimerGet(s->CTX_SUFF(ts));
- int64_t elapsed = now - s->pm_timer_initial;
+ uint64_t u64Now = TMTimerGet(s->CTX_SUFF(ts));
+ uint64_t u64Seen;
+ do
+ {
+ u64Seen = ASMAtomicReadU64(&s->u64PmTimerLastSeen);
+ if (u64Now < u64Seen)
+ u64Now = u64Seen + 1;
+ } while (!ASMAtomicCmpXchgU64(&s->u64PmTimerLastSeen, u64Now, u64Seen));
- *pu32 = ASMMultU64ByU32DivByU32(elapsed, PM_TMR_FREQ, TMTimerGetFreq(s->CTX_SUFF(ts)));
+ uint64_t u64Elapsed = u64Now - s->u64PmTimerInitial;
+ *pu32 = ASMMultU64ByU32DivByU32(u64Elapsed, PM_TMR_FREQ, TMTimerGetFreq(s->CTX_SUFF(ts)));
Log(("acpi: acpiPMTmrRead -> %#x\n", *pu32));
return VINF_SUCCESS;
}
@@ -2090,7 +2098,7 @@ static const SSMFIELD g_AcpiSavedStateFields4[] =
SSMFIELD_ENTRY(ACPIState, pm1a_en),
SSMFIELD_ENTRY(ACPIState, pm1a_sts),
SSMFIELD_ENTRY(ACPIState, pm1a_ctl),
- SSMFIELD_ENTRY(ACPIState, pm_timer_initial),
+ SSMFIELD_ENTRY(ACPIState, u64PmTimerInitial),
SSMFIELD_ENTRY(ACPIState, gpe0_en),
SSMFIELD_ENTRY(ACPIState, gpe0_sts),
SSMFIELD_ENTRY(ACPIState, uBatteryIndex),
@@ -2110,7 +2118,7 @@ static const SSMFIELD g_AcpiSavedStateFields5[] =
SSMFIELD_ENTRY(ACPIState, pm1a_en),
SSMFIELD_ENTRY(ACPIState, pm1a_sts),
SSMFIELD_ENTRY(ACPIState, pm1a_ctl),
- SSMFIELD_ENTRY(ACPIState, pm_timer_initial),
+ SSMFIELD_ENTRY(ACPIState, u64PmTimerInitial),
SSMFIELD_ENTRY(ACPIState, gpe0_en),
SSMFIELD_ENTRY(ACPIState, gpe0_sts),
SSMFIELD_ENTRY(ACPIState, uBatteryIndex),
@@ -2129,7 +2137,7 @@ static const SSMFIELD g_AcpiSavedStateFields6[] =
SSMFIELD_ENTRY(ACPIState, pm1a_en),
SSMFIELD_ENTRY(ACPIState, pm1a_sts),
SSMFIELD_ENTRY(ACPIState, pm1a_ctl),
- SSMFIELD_ENTRY(ACPIState, pm_timer_initial),
+ SSMFIELD_ENTRY(ACPIState, u64PmTimerInitial),
SSMFIELD_ENTRY(ACPIState, gpe0_en),
SSMFIELD_ENTRY(ACPIState, gpe0_sts),
SSMFIELD_ENTRY(ACPIState, uBatteryIndex),
@@ -2548,7 +2556,7 @@ static DECLCALLBACK(void) acpiReset(PPDMDEVINS pDevIns)
s->pm1a_en = 0;
s->pm1a_sts = 0;
s->pm1a_ctl = 0;
- s->pm_timer_initial = TMTimerGet(s->CTX_SUFF(ts));
+ s->u64PmTimerInitial = TMTimerGet(s->CTX_SUFF(ts));
acpiPMTimerReset(s);
s->uBatteryIndex = 0;
s->uSystemInfoIndex = 0;
@@ -2832,7 +2840,7 @@ static DECLCALLBACK(int) acpiConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMN
s->tsR0 = TMTimerR0Ptr(s->tsR3);
s->tsRC = TMTimerRCPtr(s->tsR3);
- s->pm_timer_initial = TMTimerGet(s->tsR3);
+ s->u64PmTimerInitial = TMTimerGet(s->tsR3);
acpiPMTimerReset(s);
PCIDevSetVendorId(dev, 0x8086); /* Intel */