From: Ketan Chaturvedi <Ketan.Chaturvedi@xxxxxxx> Add support for Secure TSC, allowing userspace to configure the Secure TSC feature for SNP guests. Use the SNP specification's desired TSC frequency parameter during the SNP_LAUNCH_START command to set the mean TSC frequency in KHz for Secure TSC enabled guests. If the frequency is not specified by the VMM, default to tsc_khz. Signed-off-by: Ketan Chaturvedi <Ketan.Chaturvedi@xxxxxxx> Co-developed-by: Nikunj A Dadhania <nikunj@xxxxxxx> Signed-off-by: Nikunj A Dadhania <nikunj@xxxxxxx> --- arch/x86/include/uapi/asm/kvm.h | 3 ++- arch/x86/kvm/svm/sev.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h index 460306b35a4b..075af0dcee25 100644 --- a/arch/x86/include/uapi/asm/kvm.h +++ b/arch/x86/include/uapi/asm/kvm.h @@ -839,7 +839,8 @@ struct kvm_sev_snp_launch_start { __u64 policy; __u8 gosvw[16]; __u16 flags; - __u8 pad0[6]; + __u8 pad0[2]; + __u32 desired_tsc_khz; __u64 pad1[4]; }; diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 50263b473f95..b61d6bd75b37 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -2205,6 +2205,20 @@ static int snp_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp) start.gctx_paddr = __psp_pa(sev->snp_context); start.policy = params.policy; + + if (snp_secure_tsc_enabled(kvm)) { + u32 user_tsc_khz = params.desired_tsc_khz; + + /* Use tsc_khz if the VMM has not provided the TSC frequency */ + if (!user_tsc_khz) + user_tsc_khz = tsc_khz; + + start.desired_tsc_khz = user_tsc_khz; + + /* Set the arch default TSC for the VM*/ + kvm->arch.default_tsc_khz = user_tsc_khz; + } + memcpy(start.gosvw, params.gosvw, sizeof(params.gosvw)); rc = __sev_issue_cmd(argp->sev_fd, SEV_CMD_SNP_LAUNCH_START, &start, &argp->error); if (rc) { @@ -2927,6 +2941,8 @@ void __init sev_set_cpu_caps(void) if (sev_snp_enabled) { kvm_cpu_cap_set(X86_FEATURE_SEV_SNP); kvm_caps.supported_vm_types |= BIT(KVM_X86_SNP_VM); + + kvm_cpu_cap_check_and_set(X86_FEATURE_SNP_SECURE_TSC); } } @@ -3059,6 +3075,9 @@ void __init sev_hardware_setup(void) sev_supported_vmsa_features = 0; if (sev_es_debug_swap_enabled) sev_supported_vmsa_features |= SVM_SEV_FEAT_DEBUG_SWAP; + + if (sev_snp_enabled && cpu_feature_enabled(X86_FEATURE_SNP_SECURE_TSC)) + sev_supported_vmsa_features |= SVM_SEV_FEAT_SECURE_TSC; } void sev_hardware_unsetup(void) -- 2.43.0