mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
kvm: x86: encapsulate wrmsr(MSR_KVM_SYSTEM_TIME) emulation in helper fn
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>
This commit is contained in:
parent
66af4f5cb1
commit
5b9bb0ebbc
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user