!kvm_cpu_has(feature.anti_feature);
 }
 
+static __always_inline uint64_t kvm_cpu_supported_xcr0(void)
+{
+       if (!kvm_cpu_has_p(X86_PROPERTY_SUPPORTED_XCR0_LO))
+               return 0;
+
+       return kvm_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_LO) |
+              ((uint64_t)kvm_cpu_property(X86_PROPERTY_SUPPORTED_XCR0_HI) << 32);
+}
+
 static inline size_t kvm_cpuid2_size(int nr_entries)
 {
        return sizeof(struct kvm_cpuid2) +
 
 
 int main(int argc, char *argv[])
 {
+       uint64_t *xstate_bv, saved_xstate_bv;
        vm_vaddr_t nested_gva = 0;
        struct kvm_cpuid2 empty_cpuid = {};
        struct kvm_regs regs1, regs2;
                 * allow KVM_SET_XSAVE regardless of guest CPUID.  Manually
                 * load only XSAVE state, MSRs in particular have a much more
                 * convoluted ABI.
+                *
+                * Load two versions of XSAVE state: one with the actual guest
+                * XSAVE state, and one with all supported features forced "on"
+                * in xstate_bv, e.g. to ensure that KVM allows loading all
+                * supported features, even if something goes awry in saving
+                * the original snapshot.
                 */
+               xstate_bv = (void *)&((uint8_t *)state->xsave->region)[512];
+               saved_xstate_bv = *xstate_bv;
+
                vcpuN = __vm_vcpu_add(vm, vcpu->id + 1);
                vcpu_xsave_set(vcpuN, state->xsave);
+               *xstate_bv = kvm_cpu_supported_xcr0();
+               vcpu_xsave_set(vcpuN, state->xsave);
 
                vcpu_init_cpuid(vcpuN, &empty_cpuid);
                vcpu_xsave_set(vcpuN, state->xsave);
+               *xstate_bv = saved_xstate_bv;
+               vcpu_xsave_set(vcpuN, state->xsave);
 
                kvm_x86_state_cleanup(state);