KVM: x86: Add macros to track first...last VMX feature MSRs
authorSean Christopherson <seanjc@google.com>
Sat, 11 Mar 2023 00:46:00 +0000 (16:46 -0800)
committerSean Christopherson <seanjc@google.com>
Thu, 6 Apr 2023 21:57:22 +0000 (14:57 -0700)
Add macros to track the range of VMX feature MSRs that are emulated by
KVM to reduce the maintenance cost of extending the set of emulated MSRs.

Note, KVM doesn't necessarily emulate all known/consumed VMX MSRs, e.g.
PROCBASED_CTLS3 is consumed by KVM to enable IPI virtualization, but is
not emulated as KVM doesn't emulate/virtualize IPI virtualization for
nested guests.

No functional change intended.

Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Link: https://lore.kernel.org/r/20230311004618.920745-4-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.h

index 70183d2271b5a2a69aed805ba77756d2449c969f..7584eb85410b01775b8ee91247149e1a94423baf 100644 (file)
@@ -4124,7 +4124,7 @@ static bool svm_has_emulated_msr(struct kvm *kvm, u32 index)
 {
        switch (index) {
        case MSR_IA32_MCG_EXT_CTL:
-       case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
+       case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR:
                return false;
        case MSR_IA32_SMBASE:
                if (!IS_ENABLED(CONFIG_KVM_SMM))
index c18f74899f011d5a75b3f7cecf6d69e6388154f6..e89340dfa32293753cb7a7705a9fc7b9ad5ec0d3 100644 (file)
@@ -1945,7 +1945,7 @@ static inline bool is_vmx_feature_control_msr_valid(struct vcpu_vmx *vmx,
 static int vmx_get_msr_feature(struct kvm_msr_entry *msr)
 {
        switch (msr->index) {
-       case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
+       case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR:
                if (!nested)
                        return 1;
                return vmx_get_vmx_msr(&vmcs_config.nested, msr->index, &msr->data);
@@ -2030,7 +2030,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                msr_info->data = to_vmx(vcpu)->msr_ia32_sgxlepubkeyhash
                        [msr_info->index - MSR_IA32_SGXLEPUBKEYHASH0];
                break;
-       case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
+       case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR:
                if (!nested_vmx_allowed(vcpu))
                        return 1;
                if (vmx_get_vmx_msr(&vmx->nested.msrs, msr_info->index,
@@ -2384,7 +2384,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                vmx->msr_ia32_sgxlepubkeyhash
                        [msr_index - MSR_IA32_SGXLEPUBKEYHASH0] = data;
                break;
-       case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
+       case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR:
                if (!msr_info->host_initiated)
                        return 1; /* they are read-only */
                if (!nested_vmx_allowed(vcpu))
@@ -6974,7 +6974,7 @@ static bool vmx_has_emulated_msr(struct kvm *kvm, u32 index)
                 * real mode.
                 */
                return enable_unrestricted_guest || emulate_invalid_guest_state;
-       case MSR_IA32_VMX_BASIC ... MSR_IA32_VMX_VMFUNC:
+       case KVM_FIRST_EMULATED_VMX_MSR ... KVM_LAST_EMULATED_VMX_MSR:
                return nested;
        case MSR_AMD64_VIRT_SPEC_CTRL:
        case MSR_AMD64_TSC_RATIO:
index 754190af17912cb05f1bbc902aa29715bb453280..4bc483d082ee3b4189ebbde483ad7374e29835b6 100644 (file)
@@ -40,6 +40,14 @@ void kvm_spurious_fault(void);
        failed;                                                         \
 })
 
+/*
+ * The first...last VMX feature MSRs that are emulated by KVM.  This may or may
+ * not cover all known VMX MSRs, as KVM doesn't emulate an MSR until there's an
+ * associated feature that KVM supports for nested virtualization.
+ */
+#define KVM_FIRST_EMULATED_VMX_MSR     MSR_IA32_VMX_BASIC
+#define KVM_LAST_EMULATED_VMX_MSR      MSR_IA32_VMX_VMFUNC
+
 #define KVM_DEFAULT_PLE_GAP            128
 #define KVM_VMX_DEFAULT_PLE_WINDOW     4096
 #define KVM_DEFAULT_PLE_WINDOW_GROW    2