mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: rdtsc emulation (PV and HVM) must be monotonically increasing
The Intel SDM (section 18.10) clearly states that rdtsc returns a "monotonically increasing unique value". Current emulation code for rdtsc (both PV and HVM) returns only a monotonically-non-decreasing (non-unique) value, so ensure stale value is always incremented. Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>
This commit is contained in:
1 parent
0bdd52018f
commit
b2af489074
2 files changed
+4
-4
No files matched your search
@@ -47,10 +47,10 @@ u64 hvm_get_guest_time(struct vcpu *v)
|
||||
|
||||
spin_lock(&pl->pl_time_lock);
|
||||
now = get_s_time() + pl->stime_offset;
|
||||
if ( (int64_t)(now - pl->last_guest_time) >= 0 )
|
||||
if ( (int64_t)(now - pl->last_guest_time) > 0 )
|
||||
pl->last_guest_time = now;
|
||||
else
|
||||
now = pl->last_guest_time;
|
||||
now = ++pl->last_guest_time;
|
||||
spin_unlock(&pl->pl_time_lock);
|
||||
|
||||
return now + v->arch.hvm_vcpu.stime_offset;
|
||||
|
||||
+2
-2
@@ -1454,10 +1454,10 @@ void pv_soft_rdtsc(struct vcpu *v, struct cpu_user_regs *regs)
|
||||
rdtsc_usercount++;
|
||||
spin_lock(&v->domain->arch.vtsc_lock);
|
||||
now = get_s_time() + v->domain->arch.vtsc_stime_offset;
|
||||
if ( (int64_t)(now - v->domain->arch.vtsc_last) >= 0 )
|
||||
if ( (int64_t)(now - v->domain->arch.vtsc_last) > 0 )
|
||||
v->domain->arch.vtsc_last = now;
|
||||
else
|
||||
now = v->domain->arch.vtsc_last;
|
||||
now = ++v->domain->arch.vtsc_last;
|
||||
spin_unlock(&v->domain->arch.vtsc_lock);
|
||||
regs->eax = (uint32_t)now;
|
||||
regs->edx = (uint32_t)(now >> 32);
|
||||
|
||||