r = enable_pmu ? KVM_CAP_PMU_VALID_MASK : 0;
                break;
        case KVM_CAP_DISABLE_QUIRKS2:
-               r = KVM_X86_VALID_QUIRKS;
+               r = kvm_caps.supported_quirks;
                break;
        case KVM_CAP_X86_NOTIFY_VMEXIT:
                r = kvm_caps.has_notify_vmexit;
        switch (cap->cap) {
        case KVM_CAP_DISABLE_QUIRKS2:
                r = -EINVAL;
-               if (cap->args[0] & ~KVM_X86_VALID_QUIRKS)
+               if (cap->args[0] & ~kvm_caps.supported_quirks)
                        break;
                fallthrough;
        case KVM_CAP_DISABLE_QUIRKS:
-               kvm->arch.disabled_quirks |= cap->args[0];
+               kvm->arch.disabled_quirks |= cap->args[0] & kvm_caps.supported_quirks;
                r = 0;
                break;
        case KVM_CAP_SPLIT_IRQCHIP: {
                kvm_host.xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
                kvm_caps.supported_xcr0 = kvm_host.xcr0 & KVM_SUPPORTED_XCR0;
        }
+       kvm_caps.supported_quirks = KVM_X86_VALID_QUIRKS;
        kvm_caps.inapplicable_quirks = KVM_X86_CONDITIONAL_QUIRKS;
 
        rdmsrl_safe(MSR_EFER, &kvm_host.efer);
        /* Decided by the vendor code for other VM types.  */
        kvm->arch.pre_fault_allowed =
                type == KVM_X86_DEFAULT_VM || type == KVM_X86_SW_PROTECTED_VM;
-       kvm->arch.disabled_quirks = kvm_caps.inapplicable_quirks;
+       kvm->arch.disabled_quirks = kvm_caps.inapplicable_quirks & kvm_caps.supported_quirks;
 
        ret = kvm_page_track_init(kvm);
        if (ret)