KVM: x86: Move common handling of PAT MSR writes to kvm_set_msr_common()
authorSean Christopherson <seanjc@google.com>
Thu, 11 May 2023 23:33:51 +0000 (16:33 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 1 Jun 2023 20:41:06 +0000 (13:41 -0700)
Move the common check-and-set handling of PAT MSR writes out of vendor
code and into kvm_set_msr_common().  This aligns writes with reads, which
are already handled in common code, i.e. makes the handling of reads and
writes symmetrical in common code.

Alternatively, the common handling in kvm_get_msr_common() could be moved
to vendor code, but duplicating code is generally undesirable (even though
the duplicatated code is trivial in this case), and guest writes to PAT
should be rare, i.e. the overhead of the extra function call is a
non-issue in practice.

Suggested-by: Kai Huang <kai.huang@intel.com>
Reviewed-by: Kai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20230511233351.635053-9-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index e1e17c7dc7d52a11de17ee0c7f1ccf09720c9856..924609d63f8adecf042b5f8d336a2669aebfad0c 100644 (file)
@@ -2939,9 +2939,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
 
                break;
        case MSR_IA32_CR_PAT:
-               if (!kvm_pat_valid(data))
-                       return 1;
-               vcpu->arch.pat = data;
+               ret = kvm_set_msr_common(vcpu, msr);
+               if (ret)
+                       break;
+
                svm->vmcb01.ptr->save.g_pat = data;
                if (is_guest_mode(vcpu))
                        nested_vmcb02_compute_g_pat(svm);
index 33b8625d35414ef0be4e5461cb284ed76f9b6f3e..2d9d155691a7f5e20374066902bc60b7be9e13d4 100644 (file)
@@ -2287,10 +2287,9 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                        return 1;
                goto find_uret_msr;
        case MSR_IA32_CR_PAT:
-               if (!kvm_pat_valid(data))
-                       return 1;
-
-               vcpu->arch.pat = data;
+               ret = kvm_set_msr_common(vcpu, msr_info);
+               if (ret)
+                       break;
 
                if (is_guest_mode(vcpu) &&
                    get_vmcs12(vcpu)->vm_exit_controls & VM_EXIT_SAVE_IA32_PAT)
index 902c9935979fb12c2673956288fbcecc62da365f..5ad55ef71433738cb146a33c984df694bf0c1865 100644 (file)
@@ -3703,12 +3703,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                }
                break;
        case MSR_IA32_CR_PAT:
-               /*
-                * Writes to PAT should be handled by vendor code as both SVM
-                * and VMX track the guest's PAT in the VMCB/VMCS.
-                */
-               WARN_ON_ONCE(1);
-
                if (!kvm_pat_valid(data))
                        return 1;