public inbox for linux-crypto@vger.kernel.org
 help / color / mirror / Atom feed
From: Tom Lendacky <thomas.lendacky@amd.com>
To: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Ashish Kalra <ashish.kalra@amd.com>,
	John Allen <john.allen@amd.com>
Cc: kvm@vger.kernel.org, linux-crypto@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Herbert Xu <herbert@gondor.apana.org.au>,
	Tycho Andersen <tycho@kernel.org>
Subject: Re: [PATCH v3 2/7] crypto/ccp: export firmware supported vm types
Date: Fri, 17 Apr 2026 09:12:49 -0500	[thread overview]
Message-ID: <0f4bb67e-ada5-42c5-8470-6447b5df0085@amd.com> (raw)
In-Reply-To: <20260416232329.3408497-3-seanjc@google.com>

On 4/16/26 18:23, Sean Christopherson wrote:
> From: Tycho Andersen <tycho@kernel.org>
> 
> In some configurations, the firmware does not support all VM types. The SEV
> firmware has an entry in the TCB_VERSION structure referred to as the
> Security Version Number in the SEV-SNP firmware specification and referred
> to as the "SPL" in SEV firmware release notes. The SEV firmware release
> notes say:
> 
>     On every SEV firmware release where a security mitigation has been
>     added, the SNP SPL gets increased by 1. This is to let users know that
>     it is important to update to this version.
> 
> The SEV firmware release that fixed CVE-2025-48514 by disabling SEV-ES
> support on vulnerable platforms has this SVN increased to reflect the fix.
> The SVN is platform-specific, as is the structure of TCB_VERSION.
> 
> Check CURRENT_TCB instead of REPORTED_TCB, since the firmware behaves with
> the CURRENT_TCB SVN level and will reject SEV-ES VMs accordingly.
> 
> Parse the SVN, and mask off the SEV_ES supported VM type from the list of
> supported types if it is above the per-platform threshold for the relevant
> platforms.
> 
> Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
> Signed-off-by: Sean Christopherson <seanjc@google.com>

Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>

> ---
>  drivers/crypto/ccp/sev-dev.c | 70 ++++++++++++++++++++++++++++++++++++
>  include/linux/psp-sev.h      | 37 +++++++++++++++++++
>  2 files changed, 107 insertions(+)
> 
> diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
> index 64fc402f58df..1e3286c048fe 100644
> --- a/drivers/crypto/ccp/sev-dev.c
> +++ b/drivers/crypto/ccp/sev-dev.c
> @@ -2940,3 +2940,73 @@ void sev_pci_exit(void)
>  
>  	sev_firmware_shutdown(sev);
>  }
> +
> +static int get_v1_svn(struct sev_device *sev)
> +{
> +	struct sev_snp_tcb_version_genoa_milan *tcb;
> +	struct sev_user_data_snp_status status;
> +	int ret, error = 0;
> +
> +	mutex_lock(&sev_cmd_mutex);
> +	ret = __sev_do_snp_platform_status(&status, &error);
> +	mutex_unlock(&sev_cmd_mutex);
> +	if (ret < 0)
> +		return ret;
> +
> +	tcb = (struct sev_snp_tcb_version_genoa_milan *)&status
> +		      .current_tcb_version;
> +	return tcb->snp;
> +}
> +
> +static int get_v2_svn(struct sev_device *sev)
> +{
> +	struct sev_user_data_snp_status status;
> +	struct sev_snp_tcb_version_turin *tcb;
> +	int ret, error = 0;
> +
> +	mutex_lock(&sev_cmd_mutex);
> +	ret = __sev_do_snp_platform_status(&status, &error);
> +	mutex_unlock(&sev_cmd_mutex);
> +	if (ret < 0)
> +		return ret;
> +
> +	tcb = (struct sev_snp_tcb_version_turin *)&status
> +		      .current_tcb_version;
> +	return tcb->snp;
> +}
> +
> +static bool sev_firmware_allows_es(struct sev_device *sev)
> +{
> +	/* Documented in AMD-SB-3023 */
> +	if (boot_cpu_has(X86_FEATURE_ZEN4) || boot_cpu_has(X86_FEATURE_ZEN3))
> +		return get_v1_svn(sev) < 0x1b;
> +	else if (boot_cpu_has(X86_FEATURE_ZEN5))
> +		return get_v2_svn(sev) < 0x4;
> +	else
> +		return true;
> +}
> +
> +int sev_firmware_supported_vm_types(void)
> +{
> +	int supported_vm_types = 0;
> +	struct sev_device *sev;
> +
> +	if (!psp_master || !psp_master->sev_data)
> +		return supported_vm_types;
> +	sev = psp_master->sev_data;
> +
> +	supported_vm_types |= BIT(KVM_X86_SEV_VM);
> +	supported_vm_types |= BIT(KVM_X86_SEV_ES_VM);
> +
> +	if (!sev->snp_initialized)
> +		return supported_vm_types;
> +
> +	supported_vm_types |= BIT(KVM_X86_SNP_VM);
> +
> +	if (!sev_firmware_allows_es(sev))
> +		supported_vm_types &= ~BIT(KVM_X86_SEV_ES_VM);
> +
> +	return supported_vm_types;
> +
> +}
> +EXPORT_SYMBOL_FOR_MODULES(sev_firmware_supported_vm_types, "kvm-amd");
> diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h
> index 69ffa4b4d1fa..383a682e94fd 100644
> --- a/include/linux/psp-sev.h
> +++ b/include/linux/psp-sev.h
> @@ -899,6 +899,42 @@ struct snp_feature_info {
>  /* Feature bits in EBX */
>  #define SNP_SEV_TIO_SUPPORTED			BIT(1)
>  
> +/**
> + * struct sev_snp_tcb_version_genoa_milan
> + *
> + * @boot_loader: SVN of PSP bootloader
> + * @tee: SVN of PSP operating system
> + * @reserved: reserved
> + * @snp: SVN of SNP firmware
> + * @microcode: Lowest current patch level of all cores
> + */
> +struct sev_snp_tcb_version_genoa_milan {
> +	u8 boot_loader;
> +	u8 tee;
> +	u8 reserved[4];
> +	u8 snp;
> +	u8 microcode;
> +};
> +
> +/**
> + * struct sev_snp_tcb_version_turin
> + *
> + * @fmc: SVN of FMC firmware
> + * @boot_loader: SVN of PSP bootloader
> + * @tee: SVN of PSP operating system
> + * @snp: SVN of SNP firmware
> + * @reserved: reserved
> + * @microcode: Lowest current patch level of all cores
> + */
> +struct sev_snp_tcb_version_turin {
> +	u8 fmc;
> +	u8 boot_loader;
> +	u8 tee;
> +	u8 snp;
> +	u8 reserved[3];
> +	u8 microcode;
> +};
> +
>  #ifdef CONFIG_CRYPTO_DEV_SP_PSP
>  
>  /**
> @@ -1045,6 +1081,7 @@ void snp_free_firmware_page(void *addr);
>  void sev_platform_shutdown(void);
>  bool sev_is_snp_ciphertext_hiding_supported(void);
>  u64 sev_get_snp_policy_bits(void);
> +int sev_firmware_supported_vm_types(void);
>  
>  #else	/* !CONFIG_CRYPTO_DEV_SP_PSP */
>  


  reply	other threads:[~2026-04-17 14:12 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-16 23:23 [PATCH v3 0/7] KVM: SEV: Don't advertise unusable VM types Sean Christopherson
2026-04-16 23:23 ` [PATCH v3 1/7] crypto/ccp: hoist kernel part of SNP_PLATFORM_STATUS Sean Christopherson
2026-04-17 13:48   ` Tom Lendacky
2026-04-16 23:23 ` [PATCH v3 2/7] crypto/ccp: export firmware supported vm types Sean Christopherson
2026-04-17 14:12   ` Tom Lendacky [this message]
2026-04-16 23:23 ` [PATCH v3 3/7] KVM: SEV: Set supported SEV+ VM types during sev_hardware_setup() Sean Christopherson
2026-04-17 14:24   ` Tom Lendacky
2026-04-16 23:23 ` [PATCH v3 4/7] KVM: SEV: Consolidate logic for printing state of SEV{,-ES,-SNP} enabling Sean Christopherson
2026-04-17 14:34   ` Tom Lendacky
2026-04-16 23:23 ` [PATCH v3 5/7] KVM: SEV: Don't advertise support for unusable VM types Sean Christopherson
2026-04-17 14:37   ` Tom Lendacky
2026-04-16 23:23 ` [PATCH v3 6/7] KVM: SEV: Don't advertise VM types that are disabled by firmware Sean Christopherson
2026-04-17 14:39   ` Tom Lendacky
2026-04-16 23:23 ` [PATCH v3 7/7] KVM: selftests: Teach sev_*_test about revoking VM types Sean Christopherson
2026-04-17 15:12 ` [PATCH v3 0/7] KVM: SEV: Don't advertise unusable " Tycho Andersen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0f4bb67e-ada5-42c5-8470-6447b5df0085@amd.com \
    --to=thomas.lendacky@amd.com \
    --cc=ashish.kalra@amd.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=john.allen@amd.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    --cc=tycho@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox