KVM: x86: Move EDX initialization at vCPU RESET to common code
authorSean Christopherson <seanjc@google.com>
Tue, 13 Jul 2021 16:32:57 +0000 (09:32 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 2 Aug 2021 15:01:52 +0000 (11:01 -0400)
Move the EDX initialization at vCPU RESET, which is now identical between
VMX and SVM, into common code.

No functional change intended.

Reviewed-by: Reiji Watanabe <reijiw@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210713163324.627647-20-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index d798650..ec8e4ac 100644 (file)
@@ -1773,11 +1773,6 @@ static inline unsigned long read_msr(unsigned long msr)
 }
 #endif
 
-static inline u32 get_rdx_init_val(void)
-{
-       return 0x600; /* P6 family */
-}
-
 static inline void kvm_inject_gp(struct kvm_vcpu *vcpu, u32 error_code)
 {
        kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
index acb7bd1..f42ec7d 100644 (file)
@@ -1330,25 +1330,12 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
 static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
-       u32 dummy;
-       u32 eax = 1;
 
        svm->spec_ctrl = 0;
        svm->virt_spec_ctrl = 0;
 
        init_vmcb(vcpu);
 
-       /*
-        * Fall back to KVM's default Family/Model/Stepping if no CPUID match
-        * is found.  Note, it's impossible to get a match at RESET since KVM
-        * emulates RESET before exposing the vCPU to userspace, i.e. it's
-        * impossible for kvm_cpuid() to find a valid entry on RESET.  But, go
-        * through the motions in case that's ever remedied, and to be pedantic.
-        */
-       if (!kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy, true))
-               eax = get_rdx_init_val();
-       kvm_rdx_write(vcpu, eax);
-
        if (kvm_vcpu_apicv_active(vcpu) && !init_event)
                avic_update_vapic_bar(svm, APIC_DEFAULT_PHYS_BASE);
 }
index e487f10..ad41f34 100644 (file)
@@ -4391,7 +4391,6 @@ static void init_vmcs(struct vcpu_vmx *vmx)
 static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 {
        struct vcpu_vmx *vmx = to_vmx(vcpu);
-       u32 eax, dummy;
        u64 cr0;
 
        vmx->rmode.vm86_active = 0;
@@ -4399,11 +4398,6 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 
        vmx->msr_ia32_umwait_control = 0;
 
-       eax = 1;
-       if (!kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy, true))
-               eax = get_rdx_init_val();
-       kvm_rdx_write(vcpu, eax);
-
        vmx->hv_deadline_tsc = -1;
        kvm_set_cr8(vcpu, 0);
 
index 164ecca..ed8b6d1 100644 (file)
@@ -10792,6 +10792,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
 void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 {
        unsigned long old_cr0 = kvm_read_cr0(vcpu);
+       u32 eax, dummy;
 
        kvm_lapic_reset(vcpu, init_event);
 
@@ -10858,6 +10859,18 @@ void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
        vcpu->arch.regs_avail = ~0;
        vcpu->arch.regs_dirty = ~0;
 
+       /*
+        * Fall back to KVM's default Family/Model/Stepping of 0x600 (P6/Athlon)
+        * if no CPUID match is found.  Note, it's impossible to get a match at
+        * RESET since KVM emulates RESET before exposing the vCPU to userspace,
+        * i.e. it'simpossible for kvm_cpuid() to find a valid entry on RESET.
+        * But, go through the motions in case that's ever remedied.
+        */
+       eax = 1;
+       if (!kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy, true))
+               eax = 0x600;
+       kvm_rdx_write(vcpu, eax);
+
        vcpu->arch.ia32_xss = 0;
 
        static_call(kvm_x86_vcpu_reset)(vcpu, init_event);