KVM: clarify kvmclock documentation
- mention that system time needs to be added to wallclock time - positive tsc_shift means left shift, not right - mention additional 32bit right shift Signed-off-by: Stefan Fritsch <sf@sfritsch.de> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
committed by
Marcelo Tosatti
parent
9fc77441e5
commit
879238fecc
@@ -34,9 +34,12 @@ MSR_KVM_WALL_CLOCK_NEW: 0x4b564d00
|
|||||||
time information and check that they are both equal and even.
|
time information and check that they are both equal and even.
|
||||||
An odd version indicates an in-progress update.
|
An odd version indicates an in-progress update.
|
||||||
|
|
||||||
sec: number of seconds for wallclock.
|
sec: number of seconds for wallclock at time of boot.
|
||||||
|
|
||||||
nsec: number of nanoseconds for wallclock.
|
nsec: number of nanoseconds for wallclock at time of boot.
|
||||||
|
|
||||||
|
In order to get the current wallclock time, the system_time from
|
||||||
|
MSR_KVM_SYSTEM_TIME_NEW needs to be added.
|
||||||
|
|
||||||
Note that although MSRs are per-CPU entities, the effect of this
|
Note that although MSRs are per-CPU entities, the effect of this
|
||||||
particular MSR is global.
|
particular MSR is global.
|
||||||
@@ -82,20 +85,25 @@ MSR_KVM_SYSTEM_TIME_NEW: 0x4b564d01
|
|||||||
time at the time this structure was last updated. Unit is
|
time at the time this structure was last updated. Unit is
|
||||||
nanoseconds.
|
nanoseconds.
|
||||||
|
|
||||||
tsc_to_system_mul: a function of the tsc frequency. One has
|
tsc_to_system_mul: multiplier to be used when converting
|
||||||
to multiply any tsc-related quantity by this value to get
|
tsc-related quantity to nanoseconds
|
||||||
a value in nanoseconds, besides dividing by 2^tsc_shift
|
|
||||||
|
|
||||||
tsc_shift: cycle to nanosecond divider, as a power of two, to
|
tsc_shift: shift to be used when converting tsc-related
|
||||||
allow for shift rights. One has to shift right any tsc-related
|
quantity to nanoseconds. This shift will ensure that
|
||||||
quantity by this value to get a value in nanoseconds, besides
|
multiplication with tsc_to_system_mul does not overflow.
|
||||||
multiplying by tsc_to_system_mul.
|
A positive value denotes a left shift, a negative value
|
||||||
|
a right shift.
|
||||||
|
|
||||||
With this information, guests can derive per-CPU time by
|
The conversion from tsc to nanoseconds involves an additional
|
||||||
doing:
|
right shift by 32 bits. With this information, guests can
|
||||||
|
derive per-CPU time by doing:
|
||||||
|
|
||||||
time = (current_tsc - tsc_timestamp)
|
time = (current_tsc - tsc_timestamp)
|
||||||
time = (time * tsc_to_system_mul) >> tsc_shift
|
if (tsc_shift >= 0)
|
||||||
|
time <<= tsc_shift;
|
||||||
|
else
|
||||||
|
time >>= -tsc_shift;
|
||||||
|
time = (time * tsc_to_system_mul) >> 32
|
||||||
time = time + system_time
|
time = time + system_time
|
||||||
|
|
||||||
flags: bits in this field indicate extended capabilities
|
flags: bits in this field indicate extended capabilities
|
||||||
|
Reference in New Issue
Block a user