kvm: fix wrong address when writing Hyper-V tsc page
When kvm_write_guest writes the tsc_ref structure to the guest, or it will lead the low HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT bits of the TSC page address must be cleared, or the guest can see a non-zero sequence number. Otherwise Windows guests would not be able to get a correct clocksource (QueryPerformanceCounter will always return 0) which causes serious chaos. Signed-off-by: Xiaoming Gao <newtongao@tencnet.com> Cc: stable@vger.kernel.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
682367c494
commit
e1fa108d24
|
@ -1898,7 +1898,7 @@ static int set_msr_hyperv_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
||||||
if (!(data & HV_X64_MSR_TSC_REFERENCE_ENABLE))
|
if (!(data & HV_X64_MSR_TSC_REFERENCE_ENABLE))
|
||||||
break;
|
break;
|
||||||
gfn = data >> HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT;
|
gfn = data >> HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT;
|
||||||
if (kvm_write_guest(kvm, data,
|
if (kvm_write_guest(kvm, gfn << HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT,
|
||||||
&tsc_ref, sizeof(tsc_ref)))
|
&tsc_ref, sizeof(tsc_ref)))
|
||||||
return 1;
|
return 1;
|
||||||
mark_page_dirty(kvm, gfn);
|
mark_page_dirty(kvm, gfn);
|
||||||
|
|
Loading…
Reference in New Issue