From: Tom Lendacky <thomas.lendacky@amd.com>
To: Thomas Courrege <thomas.courrege@thorondor.fr>,
ashish.kalra@amd.com, corbet@lwn.net,
herbert@gondor.apana.org.au, john.allen@amd.com, nikunj@amd.com,
pbonzini@redhat.com, seanjc@google.com
Cc: kvm@vger.kernel.org, linux-crypto@vger.kernel.org,
linux-kernel@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH v7 1/1] KVM: SEV: Add KVM_SEV_SNP_HV_REPORT_REQ command
Date: Mon, 2 Mar 2026 09:08:20 -0600 [thread overview]
Message-ID: <45f3b7ec-6796-43a1-90c0-baf2d9b7e383@amd.com> (raw)
In-Reply-To: <20260302143626.289792-2-thomas.courrege@thorondor.fr>
On 3/2/26 08:36, Thomas Courrege wrote:
> Add support for retrieving the SEV-SNP attestation report via the
> SNP_HV_REPORT_REQ firmware command and expose it through a new KVM
> ioctl for SNP guests.
>
> Signed-off-by: Thomas Courrege <thomas.courrege@thorondor.fr>
You're missing my Reviewed-by: from the v6 series. Unless there were
some changes that need re-reviewing?
Thanks,
Tom
> ---
> .../virt/kvm/x86/amd-memory-encryption.rst | 27 ++++++++
> arch/x86/include/uapi/asm/kvm.h | 9 +++
> arch/x86/kvm/svm/sev.c | 63 +++++++++++++++++++
> drivers/crypto/ccp/sev-dev.c | 1 +
> include/linux/psp-sev.h | 31 +++++++++
> 5 files changed, 131 insertions(+)
>
> diff --git a/Documentation/virt/kvm/x86/amd-memory-encryption.rst b/Documentation/virt/kvm/x86/amd-memory-encryption.rst
> index b2395dd4769d..38522b174a7b 100644
> --- a/Documentation/virt/kvm/x86/amd-memory-encryption.rst
> +++ b/Documentation/virt/kvm/x86/amd-memory-encryption.rst
> @@ -618,6 +618,33 @@ approach to synchronizing firmware/certificate updates via file-locking,
> which should make it easier to maintain interoperability across
> tools/VMMs/vendors.
>
> +22. KVM_SEV_SNP_HV_REPORT_REQ
> +-----------------------------
> +
> +The KVM_SEV_SNP_HV_REPORT_REQ command requests a hypervisor-generated
> +SNP guest attestation report. This report is produced by the SEV firmware
> +using the key selected by the caller.
> +
> +The ``key_sel`` field indicates which key the platform will use to sign the
> +report:
> + * ``0``: If VLEK is installed, sign with VLEK. Otherwise, sign with VCEK.
> + * ``1``: Sign with VCEK.
> + * ``2``: Sign with VLEK.
> + * Other values are reserved.
> +
> +Parameters (in): struct kvm_sev_snp_hv_report_req
> +
> +Returns: 0 on success, -negative on error
> +
> +::
> + struct kvm_sev_snp_hv_report_req {
> + __u64 report_uaddr;
> + __u64 report_len;
> + __u8 key_sel;
> + __u8 pad0[7];
> + __u64 pad1[4];
> + };
> +
> Device attribute API
> ====================
>
> diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
> index 846a63215ce1..d86cb352ea89 100644
> --- a/arch/x86/include/uapi/asm/kvm.h
> +++ b/arch/x86/include/uapi/asm/kvm.h
> @@ -745,6 +745,7 @@ enum sev_cmd_id {
> KVM_SEV_SNP_LAUNCH_UPDATE,
> KVM_SEV_SNP_LAUNCH_FINISH,
> KVM_SEV_SNP_ENABLE_REQ_CERTS,
> + KVM_SEV_SNP_HV_REPORT_REQ,
>
> KVM_SEV_NR_MAX,
> };
> @@ -873,6 +874,14 @@ struct kvm_sev_receive_update_data {
> __u32 pad2;
> };
>
> +struct kvm_sev_snp_hv_report_req {
> + __u64 report_uaddr;
> + __u64 report_len;
> + __u8 key_sel;
> + __u8 pad0[7];
> + __u64 pad1[4];
> +};
> +
> struct kvm_sev_snp_launch_start {
> __u64 policy;
> __u8 gosvw[16];
> diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
> index 3f9c1aa39a0a..62daa23ccd1b 100644
> --- a/arch/x86/kvm/svm/sev.c
> +++ b/arch/x86/kvm/svm/sev.c
> @@ -2271,6 +2271,66 @@ static int snp_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)
> return rc;
> }
>
> +static int sev_snp_hv_report_request(struct kvm *kvm, struct kvm_sev_cmd *argp)
> +{
> + struct kvm_sev_info *sev = to_kvm_sev_info(kvm);
> + struct sev_data_snp_msg_report_rsp *report_rsp;
> + struct kvm_sev_snp_hv_report_req params;
> + struct sev_data_snp_hv_report_req data;
> + size_t rsp_size = sizeof(*report_rsp);
> + void __user *u_report;
> + void __user *u_params;
> + int ret;
> +
> + if (!sev_snp_guest(kvm))
> + return -ENOTTY;
> +
> + u_params = u64_to_user_ptr(argp->data);
> + if (copy_from_user(¶ms, u_params, sizeof(params)))
> + return -EFAULT;
> +
> + if (params.report_len < rsp_size)
> + return -ENOSPC;
> +
> + u_report = u64_to_user_ptr(params.report_uaddr);
> + if (!u_report)
> + return -EINVAL;
> +
> + report_rsp = snp_alloc_firmware_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
> + if (!report_rsp)
> + return -ENOMEM;
> +
> + data.len = sizeof(data);
> + data.key_sel = params.key_sel;
> + data.gctx_addr = __psp_pa(sev->snp_context);
> + data.hv_report_paddr = __psp_pa(report_rsp);
> + data.rsvd = 0;
> +
> + ret = sev_issue_cmd(kvm, SEV_CMD_SNP_HV_REPORT_REQ, &data,
> + &argp->error);
> + if (ret)
> + goto e_free_rsp;
> +
> + if (!report_rsp->status) {
> + if (params.report_len < (rsp_size + report_rsp->report_size))
> + ret = -ENOSPC;
> + else
> + rsp_size += report_rsp->report_size;
> +
> + params.report_len = sizeof(*report_rsp) + report_rsp->report_size;
> + }
> +
> + if (copy_to_user(u_report, report_rsp, rsp_size))
> + ret = -EFAULT;
> +
> + if (copy_to_user(u_params, ¶ms, sizeof(params)))
> + ret = -EFAULT;
> +
> +e_free_rsp:
> + snp_free_firmware_page(report_rsp);
> + return ret;
> +}
> +
> struct sev_gmem_populate_args {
> __u8 type;
> int sev_fd;
> @@ -2678,6 +2738,9 @@ int sev_mem_enc_ioctl(struct kvm *kvm, void __user *argp)
> case KVM_SEV_SNP_LAUNCH_FINISH:
> r = snp_launch_finish(kvm, &sev_cmd);
> break;
> + case KVM_SEV_SNP_HV_REPORT_REQ:
> + r = sev_snp_hv_report_request(kvm, &sev_cmd);
> + break;
> case KVM_SEV_SNP_ENABLE_REQ_CERTS:
> r = snp_enable_certs(kvm);
> break;
> diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c
> index 096f993974d1..30d715f19a25 100644
> --- a/drivers/crypto/ccp/sev-dev.c
> +++ b/drivers/crypto/ccp/sev-dev.c
> @@ -252,6 +252,7 @@ static int sev_cmd_buffer_len(int cmd)
> case SEV_CMD_SNP_COMMIT: return sizeof(struct sev_data_snp_commit);
> case SEV_CMD_SNP_FEATURE_INFO: return sizeof(struct sev_data_snp_feature_info);
> case SEV_CMD_SNP_VLEK_LOAD: return sizeof(struct sev_user_data_snp_vlek_load);
> + case SEV_CMD_SNP_HV_REPORT_REQ: return sizeof(struct sev_data_snp_hv_report_req);
> default: return sev_tio_cmd_buffer_len(cmd);
> }
>
> diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h
> index 69ffa4b4d1fa..c651a400d124 100644
> --- a/include/linux/psp-sev.h
> +++ b/include/linux/psp-sev.h
> @@ -124,6 +124,7 @@ enum sev_cmd {
> SEV_CMD_SNP_GCTX_CREATE = 0x093,
> SEV_CMD_SNP_GUEST_REQUEST = 0x094,
> SEV_CMD_SNP_ACTIVATE_EX = 0x095,
> + SEV_CMD_SNP_HV_REPORT_REQ = 0x096,
> SEV_CMD_SNP_LAUNCH_START = 0x0A0,
> SEV_CMD_SNP_LAUNCH_UPDATE = 0x0A1,
> SEV_CMD_SNP_LAUNCH_FINISH = 0x0A2,
> @@ -594,6 +595,36 @@ struct sev_data_attestation_report {
> u32 len; /* In/Out */
> } __packed;
>
> +/**
> + * struct sev_data_snp_hv_report_req - SNP_HV_REPORT_REQ command params
> + *
> + * @len: length of the command buffer in bytes
> + * @key_sel: Selects which key to use for generating the signature.
> + * @gctx_addr: System physical address of guest context page
> + * @hv_report_paddr: System physical address where MSG_EXPORT_RSP will be written
> + */
> +struct sev_data_snp_hv_report_req {
> + u32 len; /* In */
> + u32 key_sel :2, /* In */
> + rsvd :30;
> + u64 gctx_addr; /* In */
> + u64 hv_report_paddr; /* In */
> +} __packed;
> +
> +/**
> + * struct sev_data_snp_msg_export_rsp
> + *
> + * @status: Status : 0h: Success. 16h: Invalid parameters.
> + * @report_size: Size in bytes of the attestation report
> + * @report: attestation report
> + */
> +struct sev_data_snp_msg_report_rsp {
> + u32 status; /* Out */
> + u32 report_size; /* Out */
> + u8 rsvd[24];
> + u8 report[];
> +} __packed;
> +
> /**
> * struct sev_data_snp_download_firmware - SNP_DOWNLOAD_FIRMWARE command params
> *
next prev parent reply other threads:[~2026-03-02 15:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-02 14:36 [PATCH v7 0/1] " Thomas Courrege
2026-03-02 14:36 ` [PATCH v7 1/1] " Thomas Courrege
2026-03-02 15:08 ` Tom Lendacky [this message]
2026-03-03 7:49 ` Thomas Courrege
2026-03-09 14:36 ` [PATCH v7 0/1] " Thomas Courrege
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=45f3b7ec-6796-43a1-90c0-baf2d9b7e383@amd.com \
--to=thomas.lendacky@amd.com \
--cc=ashish.kalra@amd.com \
--cc=corbet@lwn.net \
--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=nikunj@amd.com \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=thomas.courrege@thorondor.fr \
--cc=x86@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
all inboxes | Powered by JetHome®