diff mbox series

[v3,1/4] kvm: x86: encapsulate wrmsr(MSR_KVM_SYSTEM_TIME) emulation in helper fn

Message ID 20200806151433.2747952-2-oupton@google.com (mailing list archive)
State New, archived
Headers show
Series Restrict PV features to only enabled guests | expand

Commit Message

Oliver Upton Aug. 6, 2020, 3:14 p.m. UTC
No functional change intended.

Reviewed-by: Jim Mattson <jmattson@google.com>
Reviewed-by: Peter Shier <pshier@google.com>
Signed-off-by: Oliver Upton <oupton@google.com>
---
 arch/x86/kvm/x86.c | 58 +++++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 26 deletions(-)

Comments

Wanpeng Li Aug. 14, 2020, 12:18 a.m. UTC | #1
On Fri, 7 Aug 2020 at 01:56, Oliver Upton <oupton@google.com> wrote:
>
> No functional change intended.
>
> Reviewed-by: Jim Mattson <jmattson@google.com>
> Reviewed-by: Peter Shier <pshier@google.com>
> Signed-off-by: Oliver Upton <oupton@google.com>

Reviewed-by: Wanpeng Li <wanpengli@tencent.com>

> ---
>  arch/x86/kvm/x86.c | 58 +++++++++++++++++++++++++---------------------
>  1 file changed, 32 insertions(+), 26 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index dc4370394ab8..5ba713108686 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -1822,6 +1822,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);
> @@ -2973,33 +3001,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;
> --
> 2.28.0.236.gb10cc79966-goog
>
diff mbox series

Patch

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index dc4370394ab8..5ba713108686 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1822,6 +1822,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);
@@ -2973,33 +3001,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;