]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/x86/kvm/x86.c
KVM: VMX: support MSR_IA32_ARCH_CAPABILITIES as a feature MSR
[mirror_ubuntu-bionic-kernel.git] / arch / x86 / kvm / x86.c
index 94bd294f2d2f0f5fb3604247baa66f1e76f2dfe6..a8f18e42abed33caf0a47e843f625fbfb0f67c1e 100644 (file)
@@ -1053,17 +1053,33 @@ static unsigned num_emulated_msrs;
  * can be used by a hypervisor to validate requested CPU features.
  */
 static u32 msr_based_features[] = {
+       MSR_IA32_ARCH_CAPABILITIES,
 };
 
 static unsigned int num_msr_based_features;
 
+static int kvm_get_msr_feature(struct kvm_msr_entry *msr)
+{
+       switch (msr->index) {
+       case MSR_IA32_ARCH_CAPABILITIES:
+               rdmsrl_safe(msr->index, &msr->data);
+               break;
+       default:
+               if (kvm_x86_ops->get_msr_feature(msr))
+                       return 1;
+       }
+       return 0;
+}
+
 static int do_get_msr_feature(struct kvm_vcpu *vcpu, unsigned index, u64 *data)
 {
        struct kvm_msr_entry msr;
+       int r;
 
        msr.index = index;
-       if (kvm_x86_ops->get_msr_feature(&msr))
-               return 1;
+       r = kvm_get_msr_feature(&msr);
+       if (r)
+               return r;
 
        *data = msr.data;
 
@@ -4413,7 +4429,7 @@ static void kvm_init_msr_list(void)
                struct kvm_msr_entry msr;
 
                msr.index = msr_based_features[i];
-               if (kvm_x86_ops->get_msr_feature(&msr))
+               if (kvm_get_msr_feature(&msr))
                        continue;
 
                if (j < i)