>+static bool tdparams_tsx_supported(struct kvm_cpuid2 *cpuid) >+{ >+ const struct kvm_cpuid_entry2 *entry; >+ u64 mask; >+ u32 ebx; >+ >+ entry = kvm_find_cpuid_entry2(cpuid->entries, cpuid->nent, 0x7, 0); >+ if (entry) >+ ebx = entry->ebx; >+ else >+ ebx = 0; >+ >+ mask = __feature_bit(X86_FEATURE_HLE) | __feature_bit(X86_FEATURE_RTM); >+ return ebx & mask; >+} >+ > static int setup_tdparams(struct kvm *kvm, struct td_params *td_params, > struct kvm_tdx_init_vm *init_vm) > { >@@ -1299,6 +1322,7 @@ static int setup_tdparams(struct kvm *kvm, struct td_params *td_params, > MEMCPY_SAME_SIZE(td_params->mrowner, init_vm->mrowner); > MEMCPY_SAME_SIZE(td_params->mrownerconfig, init_vm->mrownerconfig); > >+ to_kvm_tdx(kvm)->tsx_supported = tdparams_tsx_supported(cpuid); > return 0; > } > >@@ -2272,6 +2296,11 @@ static int __init __tdx_bringup(void) > return -EIO; > } > } >+ tdx_uret_tsx_ctrl_slot = kvm_find_user_return_msr(MSR_IA32_TSX_CTRL); >+ if (tdx_uret_tsx_ctrl_slot == -1 && boot_cpu_has(X86_FEATURE_MSR_TSX_CTRL)) { >+ pr_err("MSR_IA32_TSX_CTRL isn't included by kvm_find_user_return_msr\n"); >+ return -EIO; >+ } > > /* > * Enabling TDX requires enabling hardware virtualization first, >diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h >index 48cf0a1abfcc..815ff6bdbc7e 100644 >--- a/arch/x86/kvm/vmx/tdx.h >+++ b/arch/x86/kvm/vmx/tdx.h >@@ -29,6 +29,14 @@ struct kvm_tdx { > u8 nr_tdcs_pages; > u8 nr_vcpu_tdcx_pages; > >+ /* >+ * Used on each TD-exit, see tdx_user_return_msr_update_cache(). >+ * TSX_CTRL value on TD exit >+ * - set 0 if guest TSX enabled >+ * - preserved if guest TSX disabled >+ */ >+ bool tsx_supported; Is it possible to drop this boolean and tdparams_tsx_supported()? I think we can use the guest_can_use() framework instead. >+ > u64 tsc_offset; > > enum kvm_tdx_state state; >-- >2.43.0 >