| From e1fa108d24697b78348fd4e5a531029a50d0d36d Mon Sep 17 00:00:00 2001 |
| From: Xiaoming Gao <newtongao@tencent.com> |
| Date: Thu, 19 Jun 2014 19:14:57 +0800 |
| Subject: kvm: fix wrong address when writing Hyper-V tsc page |
| |
| From: Xiaoming Gao <newtongao@tencent.com> |
| |
| commit e1fa108d24697b78348fd4e5a531029a50d0d36d upstream. |
| |
| 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> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/x86.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/kvm/x86.c |
| +++ b/arch/x86/kvm/x86.c |
| @@ -1866,7 +1866,7 @@ static int set_msr_hyperv_pw(struct kvm_ |
| if (!(data & HV_X64_MSR_TSC_REFERENCE_ENABLE)) |
| break; |
| 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))) |
| return 1; |
| mark_page_dirty(kvm, gfn); |