#define        X86_FEATURE_GBPAGES             KVM_X86_CPU_FEATURE(0x80000001, 0, EDX, 26)
 #define        X86_FEATURE_RDTSCP              KVM_X86_CPU_FEATURE(0x80000001, 0, EDX, 27)
 #define        X86_FEATURE_LM                  KVM_X86_CPU_FEATURE(0x80000001, 0, EDX, 29)
+#define        X86_FEATURE_INVTSC              KVM_X86_CPU_FEATURE(0x80000007, 0, EDX, 8)
 #define        X86_FEATURE_RDPRU               KVM_X86_CPU_FEATURE(0x80000008, 0, EBX, 4)
 #define        X86_FEATURE_AMD_IBPB            KVM_X86_CPU_FEATURE(0x80000008, 0, EBX, 12)
 #define        X86_FEATURE_NPT                 KVM_X86_CPU_FEATURE(0x8000000A, 0, EDX, 0)
 
        if (msr->write)
                GUEST_ASSERT_3(msr_val == msr->write_val, msr->idx,
                               msr_val, msr->write_val);
+
+       /* Invariant TSC bit appears when TSC invariant control MSR is written to */
+       if (msr->idx == HV_X64_MSR_TSC_INVARIANT_CONTROL) {
+               if (!this_cpu_has(HV_ACCESS_TSC_INVARIANT))
+                       GUEST_ASSERT(this_cpu_has(X86_FEATURE_INVTSC));
+               else
+                       GUEST_ASSERT(this_cpu_has(X86_FEATURE_INVTSC) ==
+                                    !!(msr_val & HV_INVARIANT_TSC_EXPOSED));
+       }
+
 done:
        GUEST_DONE();
 }
        int stage = 0;
        vm_vaddr_t msr_gva;
        struct msr_data *msr;
+       bool has_invtsc = kvm_cpu_has(X86_FEATURE_INVTSC);
 
        while (true) {
                vm = vm_create_with_one_vcpu(&vcpu, guest_msr);
                        break;
 
                case 44:
+                       /* MSR is not available when CPUID feature bit is unset */
+                       if (!has_invtsc)
+                               continue;
+                       msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
+                       msr->write = false;
+                       msr->fault_expected = true;
+                       break;
+               case 45:
+                       /* MSR is vailable when CPUID feature bit is set */
+                       if (!has_invtsc)
+                               continue;
+                       vcpu_set_cpuid_feature(vcpu, HV_ACCESS_TSC_INVARIANT);
+                       msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
+                       msr->write = false;
+                       msr->fault_expected = false;
+                       break;
+               case 46:
+                       /* Writing bits other than 0 is forbidden */
+                       if (!has_invtsc)
+                               continue;
+                       msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
+                       msr->write = true;
+                       msr->write_val = 0xdeadbeef;
+                       msr->fault_expected = true;
+                       break;
+               case 47:
+                       /* Setting bit 0 enables the feature */
+                       if (!has_invtsc)
+                               continue;
+                       msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
+                       msr->write = true;
+                       msr->write_val = 1;
+                       msr->fault_expected = false;
+                       break;
+
+               default:
                        kvm_vm_free(vm);
                        return;
                }