Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-block.git] / arch / x86 / kvm / x86.c
index eb9d2c23fb04ecdd94728f4541c18655c6e3579c..4bd5f8a751de91ffeb666e1be9c5db8ae3b65f36 100644 (file)
@@ -1029,15 +1029,10 @@ void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvm_load_host_xsave_state);
 
-static inline u64 kvm_guest_supported_xcr0(struct kvm_vcpu *vcpu)
-{
-       return vcpu->arch.guest_fpu.fpstate->user_xfeatures;
-}
-
 #ifdef CONFIG_X86_64
 static inline u64 kvm_guest_supported_xfd(struct kvm_vcpu *vcpu)
 {
-       return kvm_guest_supported_xcr0(vcpu) & XFEATURE_MASK_USER_DYNAMIC;
+       return vcpu->arch.guest_supported_xcr0 & XFEATURE_MASK_USER_DYNAMIC;
 }
 #endif
 
@@ -1060,7 +1055,7 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
         * saving.  However, xcr0 bit 0 is always set, even if the
         * emulated CPU does not support XSAVE (see kvm_vcpu_reset()).
         */
-       valid_bits = kvm_guest_supported_xcr0(vcpu) | XFEATURE_MASK_FP;
+       valid_bits = vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FP;
        if (xcr0 & ~valid_bits)
                return 1;
 
@@ -1088,6 +1083,7 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
 
 int kvm_emulate_xsetbv(struct kvm_vcpu *vcpu)
 {
+       /* Note, #UD due to CR4.OSXSAVE=0 has priority over the intercept. */
        if (static_call(kvm_x86_get_cpl)(vcpu) != 0 ||
            __kvm_set_xcr(vcpu, kvm_rcx_read(vcpu), kvm_read_edx_eax(vcpu))) {
                kvm_inject_gp(vcpu, 0);
@@ -1575,12 +1571,32 @@ static const u32 msr_based_features_all[] = {
 static u32 msr_based_features[ARRAY_SIZE(msr_based_features_all)];
 static unsigned int num_msr_based_features;
 
+/*
+ * Some IA32_ARCH_CAPABILITIES bits have dependencies on MSRs that KVM
+ * does not yet virtualize. These include:
+ *   10 - MISC_PACKAGE_CTRLS
+ *   11 - ENERGY_FILTERING_CTL
+ *   12 - DOITM
+ *   18 - FB_CLEAR_CTRL
+ *   21 - XAPIC_DISABLE_STATUS
+ *   23 - OVERCLOCKING_STATUS
+ */
+
+#define KVM_SUPPORTED_ARCH_CAP \
+       (ARCH_CAP_RDCL_NO | ARCH_CAP_IBRS_ALL | ARCH_CAP_RSBA | \
+        ARCH_CAP_SKIP_VMENTRY_L1DFLUSH | ARCH_CAP_SSB_NO | ARCH_CAP_MDS_NO | \
+        ARCH_CAP_PSCHANGE_MC_NO | ARCH_CAP_TSX_CTRL_MSR | ARCH_CAP_TAA_NO | \
+        ARCH_CAP_SBDR_SSDP_NO | ARCH_CAP_FBSDP_NO | ARCH_CAP_PSDP_NO | \
+        ARCH_CAP_FB_CLEAR | ARCH_CAP_RRSBA | ARCH_CAP_PBRSB_NO)
+
 static u64 kvm_get_arch_capabilities(void)
 {
        u64 data = 0;
 
-       if (boot_cpu_has(X86_FEATURE_ARCH_CAPABILITIES))
+       if (boot_cpu_has(X86_FEATURE_ARCH_CAPABILITIES)) {
                rdmsrl(MSR_IA32_ARCH_CAPABILITIES, data);
+               data &= KVM_SUPPORTED_ARCH_CAP;
+       }
 
        /*
         * If nx_huge_pages is enabled, KVM's shadow paging will ensure that
@@ -1628,9 +1644,6 @@ static u64 kvm_get_arch_capabilities(void)
                 */
        }
 
-       /* Guests don't need to know "Fill buffer clear control" exists */
-       data &= ~ARCH_CAP_FB_CLEAR_CTRL;
-
        return data;
 }
 
@@ -10848,7 +10861,8 @@ static inline int vcpu_block(struct kvm_vcpu *vcpu)
        case KVM_MP_STATE_INIT_RECEIVED:
                break;
        default:
-               return -EINTR;
+               WARN_ON_ONCE(1);
+               break;
        }
        return 1;
 }
@@ -11302,9 +11316,22 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
 
        vcpu_load(vcpu);
 
-       if (!lapic_in_kernel(vcpu) &&
-           mp_state->mp_state != KVM_MP_STATE_RUNNABLE)
+       switch (mp_state->mp_state) {
+       case KVM_MP_STATE_UNINITIALIZED:
+       case KVM_MP_STATE_HALTED:
+       case KVM_MP_STATE_AP_RESET_HOLD:
+       case KVM_MP_STATE_INIT_RECEIVED:
+       case KVM_MP_STATE_SIPI_RECEIVED:
+               if (!lapic_in_kernel(vcpu))
+                       goto out;
+               break;
+
+       case KVM_MP_STATE_RUNNABLE:
+               break;
+
+       default:
                goto out;
+       }
 
        /*
         * Pending INITs are reported using KVM_SET_VCPU_EVENTS, disallow
@@ -11773,7 +11800,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
        vcpu->arch.mci_ctl2_banks = kcalloc(KVM_MAX_MCE_BANKS, sizeof(u64),
                                            GFP_KERNEL_ACCOUNT);
        if (!vcpu->arch.mce_banks || !vcpu->arch.mci_ctl2_banks)
-               goto fail_free_pio_data;
+               goto fail_free_mce_banks;
        vcpu->arch.mcg_cap = KVM_MAX_MCE_BANKS;
 
        if (!zalloc_cpumask_var(&vcpu->arch.wbinvd_dirty_mask,
@@ -11827,7 +11854,6 @@ free_wbinvd_dirty_mask:
 fail_free_mce_banks:
        kfree(vcpu->arch.mce_banks);
        kfree(vcpu->arch.mci_ctl2_banks);
-fail_free_pio_data:
        free_page((unsigned long)vcpu->arch.pio_data);
 fail_free_lapic:
        kvm_free_lapic(vcpu);