Commit 879238fe authored by Stefan Fritsch's avatar Stefan Fritsch Committed by Marcelo Tosatti

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: default avatarStefan Fritsch <sf@sfritsch.de>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 9fc77441
...@@ -34,9 +34,12 @@ MSR_KVM_WALL_CLOCK_NEW: 0x4b564d00 ...@@ -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 ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment