kvm: x86: encapsulate wrmsr(MSR_KVM_SYSTEM_TIME) emulation in helper fn
authorOliver Upton <oupton@google.com>
Tue, 18 Aug 2020 15:24:26 +0000 (15:24 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 21 Oct 2020 21:36:31 +0000 (17:36 -0400)
No functional change intended.

Reviewed-by: Jim Mattson <jmattson@google.com>
Reviewed-by: Peter Shier <pshier@google.com>
Reviewed-by: Wanpeng Li <wanpengli@tencent.com>
Signed-off-by: Oliver Upton <oupton@google.com>
Change-Id: I7cbe71069db98d1ded612fd2ef088b70e7618426
Message-Id: <20200818152429.1923996-2-oupton@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/x86.c

index 0f02d0f..a70733d 100644 (file)
@@ -1948,6 +1948,34 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock)
        kvm_write_guest(kvm, wall_clock, &version, sizeof(version));
 }
 
+static void kvm_write_system_time(struct kvm_vcpu *vcpu, gpa_t system_time,
+                                 bool old_msr, bool host_initiated)
+{
+       struct kvm_arch *ka = &vcpu->kvm->arch;
+
+       if (vcpu->vcpu_id == 0 && !host_initiated) {
+               if (ka->boot_vcpu_runs_old_kvmclock && old_msr)
+                       kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu);
+
+               ka->boot_vcpu_runs_old_kvmclock = old_msr;
+       }
+
+       vcpu->arch.time = system_time;
+       kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu);
+
+       /* we verify if the enable bit is set... */
+       vcpu->arch.pv_time_enabled = false;
+       if (!(system_time & 1))
+               return;
+
+       if (!kvm_gfn_to_hva_cache_init(vcpu->kvm,
+                                      &vcpu->arch.pv_time, system_time & ~1ULL,
+                                      sizeof(struct pvclock_vcpu_time_info)))
+               vcpu->arch.pv_time_enabled = true;
+
+       return;
+}
+
 static uint32_t div_frac(uint32_t dividend, uint32_t divisor)
 {
        do_shl32_div32(dividend, divisor);
@@ -3093,33 +3121,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                kvm_write_wall_clock(vcpu->kvm, data);
                break;
        case MSR_KVM_SYSTEM_TIME_NEW:
-       case MSR_KVM_SYSTEM_TIME: {
-               struct kvm_arch *ka = &vcpu->kvm->arch;
-
-               if (vcpu->vcpu_id == 0 && !msr_info->host_initiated) {
-                       bool tmp = (msr == MSR_KVM_SYSTEM_TIME);
-
-                       if (ka->boot_vcpu_runs_old_kvmclock != tmp)
-                               kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu);
-
-                       ka->boot_vcpu_runs_old_kvmclock = tmp;
-               }
-
-               vcpu->arch.time = data;
-               kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu);
-
-               /* we verify if the enable bit is set... */
-               vcpu->arch.pv_time_enabled = false;
-               if (!(data & 1))
-                       break;
-
-               if (!kvm_gfn_to_hva_cache_init(vcpu->kvm,
-                    &vcpu->arch.pv_time, data & ~1ULL,
-                    sizeof(struct pvclock_vcpu_time_info)))
-                       vcpu->arch.pv_time_enabled = true;
-
+               kvm_write_system_time(vcpu, data, false, msr_info->host_initiated);
+               break;
+       case MSR_KVM_SYSTEM_TIME:
+               kvm_write_system_time(vcpu, data, true, msr_info->host_initiated);
                break;
-       }
        case MSR_KVM_ASYNC_PF_EN:
                if (kvm_pv_enable_async_pf(vcpu, data))
                        return 1;