* [PATCH v2 0/4] x86/sev: Rework SNP Guest Request
@ 2025-06-11 4:08 Alexey Kardashevskiy
2025-06-11 4:08 ` [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest Alexey Kardashevskiy
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Alexey Kardashevskiy @ 2025-06-11 4:08 UTC (permalink / raw)
To: x86
Cc: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, H. Peter Anvin, Tom Lendacky, Nikunj A Dadhania,
Ard Biesheuvel, Ashish Kalra, Dionna Glaze, Michael Roth,
Kuppuswamy Sathyanarayanan, Alexey Kardashevskiy
Started as a part of the fix for
ae596615d93d ("virt: sev-guest: Reduce the scope of SNP command mutex")
these are the remainder of followup fixes/improvements as
the SNP Guest Request code evolved enough to make it a bit hard to
follow.
Changes:
v2:
* added RBs
* adjusted grammar
* rebased on top of v6.16-rc1
The previous conversation is here:
https://lore.kernel.org/r/20250505141238.4179623-1-aik@amd.com
This is based on sha1
19272b37aa4f Linus Torvalds "Linux 6.16-rc1".
Please comment. Thanks.
Alexey Kardashevskiy (4):
virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest
x86/sev: Allocate request in TSC_INFO_REQ on stack
x86/sev: Document requirement for linear mapping of Guest Request
buffers
x86/sev: Drop unnecessary parameter in snp_issue_guest_request
arch/x86/include/asm/sev.h | 10 ++-
arch/x86/coco/sev/core.c | 72 +++++++++-----------
drivers/virt/coco/sev-guest/sev-guest.c | 9 ++-
3 files changed, 43 insertions(+), 48 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest 2025-06-11 4:08 [PATCH v2 0/4] x86/sev: Rework SNP Guest Request Alexey Kardashevskiy @ 2025-06-11 4:08 ` Alexey Kardashevskiy 2025-06-19 10:40 ` [tip: x86/sev] " tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 2/4] x86/sev: Allocate request in TSC_INFO_REQ on stack Alexey Kardashevskiy ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Alexey Kardashevskiy @ 2025-06-11 4:08 UTC (permalink / raw) To: x86 Cc: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin, Tom Lendacky, Nikunj A Dadhania, Ard Biesheuvel, Ashish Kalra, Dionna Glaze, Michael Roth, Kuppuswamy Sathyanarayanan, Alexey Kardashevskiy SNP Guest Request only uses exitinfo2 which is a return value from GHCB, has meaning beyond ioctl and therefore belongs to snp_guest_req. Move exitinfo2 to snp_guest_req, remove snp_guest_request_ioctl from the SEV platform code. No functional change intended. Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Signed-off-by: Alexey Kardashevskiy <aik@amd.com> --- Not passing exitinfo2 as a parameter as it's been mentioned on v2: === having a struct request which collects all fields you need to pass down or return to callers is the RightThing(tm) to do. === --- arch/x86/include/asm/sev.h | 10 +++--- arch/x86/coco/sev/core.c | 36 +++++++------------- drivers/virt/coco/sev-guest/sev-guest.c | 9 +++-- 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index 58e028d42e41..fbb616fcbfb8 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -231,6 +231,7 @@ struct snp_guest_req { size_t resp_sz; u64 exit_code; + u64 exitinfo2; unsigned int vmpck_id; u8 msg_version; u8 msg_type; @@ -486,8 +487,6 @@ static inline int pvalidate(unsigned long vaddr, bool rmp_psize, bool validate) return rc; } -struct snp_guest_request_ioctl; - void setup_ghcb(void); void early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, unsigned long npages); @@ -513,8 +512,7 @@ void snp_kexec_begin(void); int snp_msg_init(struct snp_msg_desc *mdesc, int vmpck_id); struct snp_msg_desc *snp_msg_alloc(void); void snp_msg_free(struct snp_msg_desc *mdesc); -int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio); +int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req); int snp_svsm_vtpm_send_command(u8 *buffer); @@ -587,8 +585,8 @@ static inline void snp_kexec_begin(void) { } static inline int snp_msg_init(struct snp_msg_desc *mdesc, int vmpck_id) { return -1; } static inline struct snp_msg_desc *snp_msg_alloc(void) { return NULL; } static inline void snp_msg_free(struct snp_msg_desc *mdesc) { } -static inline int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) { return -ENODEV; } +static inline int snp_send_guest_request(struct snp_msg_desc *mdesc, + struct snp_guest_req *req) { return -ENODEV; } static inline int snp_svsm_vtpm_send_command(u8 *buffer) { return -ENODEV; } static inline void __init snp_secure_tsc_prepare(void) { } static inline void __init snp_secure_tsc_init(void) { } diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index b6db4e0b936b..cf91cb4e2c47 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -1389,8 +1389,7 @@ int snp_issue_svsm_attest_req(u64 call_id, struct svsm_call *call, } EXPORT_SYMBOL_GPL(snp_issue_svsm_attest_req); -static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input, - struct snp_guest_request_ioctl *rio) +static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input) { struct ghcb_state state; struct es_em_ctxt ctxt; @@ -1398,7 +1397,7 @@ static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_dat struct ghcb *ghcb; int ret; - rio->exitinfo2 = SEV_RET_NO_FW_CALL; + req->exitinfo2 = SEV_RET_NO_FW_CALL; /* * __sev_get_ghcb() needs to run with IRQs disabled because it is using @@ -1423,8 +1422,8 @@ static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_dat if (ret) goto e_put; - rio->exitinfo2 = ghcb->save.sw_exit_info_2; - switch (rio->exitinfo2) { + req->exitinfo2 = ghcb->save.sw_exit_info_2; + switch (req->exitinfo2) { case 0: break; @@ -1919,8 +1918,7 @@ static int enc_payload(struct snp_msg_desc *mdesc, u64 seqno, struct snp_guest_r return 0; } -static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) +static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req) { unsigned long req_start = jiffies; unsigned int override_npages = 0; @@ -1934,7 +1932,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r * sequence number must be incremented or the VMPCK must be deleted to * prevent reuse of the IV. */ - rc = snp_issue_guest_request(req, &req->input, rio); + rc = snp_issue_guest_request(req, &req->input); switch (rc) { case -ENOSPC: /* @@ -1987,7 +1985,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r snp_inc_msg_seqno(mdesc); if (override_err) { - rio->exitinfo2 = override_err; + req->exitinfo2 = override_err; /* * If an extended guest request was issued and the supplied certificate @@ -2005,8 +2003,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r return rc; } -int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) +int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req) { u64 seqno; int rc; @@ -2043,14 +2040,14 @@ int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req req->input.resp_gpa = __pa(mdesc->response); req->input.data_gpa = req->certs_data ? __pa(req->certs_data) : 0; - rc = __handle_guest_request(mdesc, req, rio); + rc = __handle_guest_request(mdesc, req); if (rc) { if (rc == -EIO && - rio->exitinfo2 == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN)) + req->exitinfo2 == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN)) return rc; pr_alert("Detected error from ASP request. rc: %d, exitinfo2: 0x%llx\n", - rc, rio->exitinfo2); + rc, req->exitinfo2); snp_disable_vmpck(mdesc); return rc; @@ -2069,7 +2066,6 @@ EXPORT_SYMBOL_GPL(snp_send_guest_request); static int __init snp_get_tsc_info(void) { - struct snp_guest_request_ioctl *rio; struct snp_tsc_info_resp *tsc_resp; struct snp_tsc_info_req *tsc_req; struct snp_msg_desc *mdesc; @@ -2093,13 +2089,9 @@ static int __init snp_get_tsc_info(void) if (!req) goto e_free_tsc_resp; - rio = kzalloc(sizeof(*rio), GFP_KERNEL); - if (!rio) - goto e_free_req; - mdesc = snp_msg_alloc(); if (IS_ERR_OR_NULL(mdesc)) - goto e_free_rio; + goto e_free_req; rc = snp_msg_init(mdesc, snp_vmpl); if (rc) @@ -2114,7 +2106,7 @@ static int __init snp_get_tsc_info(void) req->resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; req->exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, req, rio); + rc = snp_send_guest_request(mdesc, req); if (rc) goto e_request; @@ -2135,8 +2127,6 @@ static int __init snp_get_tsc_info(void) memzero_explicit(tsc_resp, sizeof(*tsc_resp) + AUTHTAG_LEN); e_free_mdesc: snp_msg_free(mdesc); -e_free_rio: - kfree(rio); e_free_req: kfree(req); e_free_tsc_resp: diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c index 7a4e2188f109..d2b3ae7113ab 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -101,7 +101,8 @@ static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_request_io req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, &req, arg); + rc = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; if (rc) goto e_free; @@ -152,7 +153,8 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, &req, arg); + rc = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; if (rc) return rc; @@ -249,7 +251,8 @@ static int get_ext_report(struct snp_guest_dev *snp_dev, struct snp_guest_reques req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_EXT_GUEST_REQUEST; - ret = snp_send_guest_request(mdesc, &req, arg); + ret = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; /* If certs length is invalid then copy the returned length */ if (arg->vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN) { -- 2.49.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip: x86/sev] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest 2025-06-11 4:08 ` [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest Alexey Kardashevskiy @ 2025-06-19 10:40 ` tip-bot2 for Alexey Kardashevskiy 0 siblings, 0 replies; 9+ messages in thread From: tip-bot2 for Alexey Kardashevskiy @ 2025-06-19 10:40 UTC (permalink / raw) To: linux-tip-commits Cc: Alexey Kardashevskiy, Borislav Petkov (AMD), Tom Lendacky, Dionna Glaze, x86, linux-kernel The following commit has been merged into the x86/sev branch of tip: Commit-ID: 3f83ab6f9f1db9e8f0141c0c6b974f40b4aa0dcf Gitweb: https://git.kernel.org/tip/3f83ab6f9f1db9e8f0141c0c6b974f40b4aa0dcf Author: Alexey Kardashevskiy <aik@amd.com> AuthorDate: Wed, 11 Jun 2025 14:08:39 +10:00 Committer: Borislav Petkov (AMD) <bp@alien8.de> CommitterDate: Wed, 18 Jun 2025 22:55:30 +02:00 virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest SNP Guest Request uses only exitinfo2 which is a return value from GHCB, has meaning beyond ioctl and therefore belongs to struct snp_guest_req. Move exitinfo2 there and remove snp_guest_request_ioctl from the SEV platform code. No functional change intended. Signed-off-by: Alexey Kardashevskiy <aik@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Link: https://lore.kernel.org/20250611040842.2667262-2-aik@amd.com --- arch/x86/coco/sev/core.c | 36 ++++++++---------------- arch/x86/include/asm/sev.h | 10 ++----- drivers/virt/coco/sev-guest/sev-guest.c | 9 ++++-- 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index b6db4e0..cf91cb4 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -1389,8 +1389,7 @@ int snp_issue_svsm_attest_req(u64 call_id, struct svsm_call *call, } EXPORT_SYMBOL_GPL(snp_issue_svsm_attest_req); -static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input, - struct snp_guest_request_ioctl *rio) +static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input) { struct ghcb_state state; struct es_em_ctxt ctxt; @@ -1398,7 +1397,7 @@ static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_dat struct ghcb *ghcb; int ret; - rio->exitinfo2 = SEV_RET_NO_FW_CALL; + req->exitinfo2 = SEV_RET_NO_FW_CALL; /* * __sev_get_ghcb() needs to run with IRQs disabled because it is using @@ -1423,8 +1422,8 @@ static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_dat if (ret) goto e_put; - rio->exitinfo2 = ghcb->save.sw_exit_info_2; - switch (rio->exitinfo2) { + req->exitinfo2 = ghcb->save.sw_exit_info_2; + switch (req->exitinfo2) { case 0: break; @@ -1919,8 +1918,7 @@ static int enc_payload(struct snp_msg_desc *mdesc, u64 seqno, struct snp_guest_r return 0; } -static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) +static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req) { unsigned long req_start = jiffies; unsigned int override_npages = 0; @@ -1934,7 +1932,7 @@ retry_request: * sequence number must be incremented or the VMPCK must be deleted to * prevent reuse of the IV. */ - rc = snp_issue_guest_request(req, &req->input, rio); + rc = snp_issue_guest_request(req, &req->input); switch (rc) { case -ENOSPC: /* @@ -1987,7 +1985,7 @@ retry_request: snp_inc_msg_seqno(mdesc); if (override_err) { - rio->exitinfo2 = override_err; + req->exitinfo2 = override_err; /* * If an extended guest request was issued and the supplied certificate @@ -2005,8 +2003,7 @@ retry_request: return rc; } -int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) +int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req) { u64 seqno; int rc; @@ -2043,14 +2040,14 @@ int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req req->input.resp_gpa = __pa(mdesc->response); req->input.data_gpa = req->certs_data ? __pa(req->certs_data) : 0; - rc = __handle_guest_request(mdesc, req, rio); + rc = __handle_guest_request(mdesc, req); if (rc) { if (rc == -EIO && - rio->exitinfo2 == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN)) + req->exitinfo2 == SNP_GUEST_VMM_ERR(SNP_GUEST_VMM_ERR_INVALID_LEN)) return rc; pr_alert("Detected error from ASP request. rc: %d, exitinfo2: 0x%llx\n", - rc, rio->exitinfo2); + rc, req->exitinfo2); snp_disable_vmpck(mdesc); return rc; @@ -2069,7 +2066,6 @@ EXPORT_SYMBOL_GPL(snp_send_guest_request); static int __init snp_get_tsc_info(void) { - struct snp_guest_request_ioctl *rio; struct snp_tsc_info_resp *tsc_resp; struct snp_tsc_info_req *tsc_req; struct snp_msg_desc *mdesc; @@ -2093,13 +2089,9 @@ static int __init snp_get_tsc_info(void) if (!req) goto e_free_tsc_resp; - rio = kzalloc(sizeof(*rio), GFP_KERNEL); - if (!rio) - goto e_free_req; - mdesc = snp_msg_alloc(); if (IS_ERR_OR_NULL(mdesc)) - goto e_free_rio; + goto e_free_req; rc = snp_msg_init(mdesc, snp_vmpl); if (rc) @@ -2114,7 +2106,7 @@ static int __init snp_get_tsc_info(void) req->resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; req->exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, req, rio); + rc = snp_send_guest_request(mdesc, req); if (rc) goto e_request; @@ -2135,8 +2127,6 @@ e_request: memzero_explicit(tsc_resp, sizeof(*tsc_resp) + AUTHTAG_LEN); e_free_mdesc: snp_msg_free(mdesc); -e_free_rio: - kfree(rio); e_free_req: kfree(req); e_free_tsc_resp: diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index 58e028d..fbb616f 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -231,6 +231,7 @@ struct snp_guest_req { size_t resp_sz; u64 exit_code; + u64 exitinfo2; unsigned int vmpck_id; u8 msg_version; u8 msg_type; @@ -486,8 +487,6 @@ static inline int pvalidate(unsigned long vaddr, bool rmp_psize, bool validate) return rc; } -struct snp_guest_request_ioctl; - void setup_ghcb(void); void early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, unsigned long npages); @@ -513,8 +512,7 @@ void snp_kexec_begin(void); int snp_msg_init(struct snp_msg_desc *mdesc, int vmpck_id); struct snp_msg_desc *snp_msg_alloc(void); void snp_msg_free(struct snp_msg_desc *mdesc); -int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio); +int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req); int snp_svsm_vtpm_send_command(u8 *buffer); @@ -587,8 +585,8 @@ static inline void snp_kexec_begin(void) { } static inline int snp_msg_init(struct snp_msg_desc *mdesc, int vmpck_id) { return -1; } static inline struct snp_msg_desc *snp_msg_alloc(void) { return NULL; } static inline void snp_msg_free(struct snp_msg_desc *mdesc) { } -static inline int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req, - struct snp_guest_request_ioctl *rio) { return -ENODEV; } +static inline int snp_send_guest_request(struct snp_msg_desc *mdesc, + struct snp_guest_req *req) { return -ENODEV; } static inline int snp_svsm_vtpm_send_command(u8 *buffer) { return -ENODEV; } static inline void __init snp_secure_tsc_prepare(void) { } static inline void __init snp_secure_tsc_init(void) { } diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c index 7a4e218..d2b3ae7 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -101,7 +101,8 @@ static int get_report(struct snp_guest_dev *snp_dev, struct snp_guest_request_io req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, &req, arg); + rc = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; if (rc) goto e_free; @@ -152,7 +153,8 @@ static int get_derived_key(struct snp_guest_dev *snp_dev, struct snp_guest_reque req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, &req, arg); + rc = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; if (rc) return rc; @@ -249,7 +251,8 @@ cmd: req.resp_sz = resp_len; req.exit_code = SVM_VMGEXIT_EXT_GUEST_REQUEST; - ret = snp_send_guest_request(mdesc, &req, arg); + ret = snp_send_guest_request(mdesc, &req); + arg->exitinfo2 = req.exitinfo2; /* If certs length is invalid then copy the returned length */ if (arg->vmm_error == SNP_GUEST_VMM_ERR_INVALID_LEN) { ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/4] x86/sev: Allocate request in TSC_INFO_REQ on stack 2025-06-11 4:08 [PATCH v2 0/4] x86/sev: Rework SNP Guest Request Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest Alexey Kardashevskiy @ 2025-06-11 4:08 ` Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] " tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 3/4] x86/sev: Document requirement for linear mapping of Guest Request buffers Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 4/4] x86/sev: Drop unnecessary parameter in snp_issue_guest_request Alexey Kardashevskiy 3 siblings, 1 reply; 9+ messages in thread From: Alexey Kardashevskiy @ 2025-06-11 4:08 UTC (permalink / raw) To: x86 Cc: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin, Tom Lendacky, Nikunj A Dadhania, Ard Biesheuvel, Ashish Kalra, Dionna Glaze, Michael Roth, Kuppuswamy Sathyanarayanan, Alexey Kardashevskiy Allocate a 88 byte request structure on stack and skip needless kzalloc/kfree. While at this, correct indent. No functional change intended. Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Signed-off-by: Alexey Kardashevskiy <aik@amd.com> --- arch/x86/coco/sev/core.c | 30 ++++++++------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index cf91cb4e2c47..068653865bfb 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2069,7 +2069,7 @@ static int __init snp_get_tsc_info(void) struct snp_tsc_info_resp *tsc_resp; struct snp_tsc_info_req *tsc_req; struct snp_msg_desc *mdesc; - struct snp_guest_req *req; + struct snp_guest_req req = {}; int rc = -ENOMEM; tsc_req = kzalloc(sizeof(*tsc_req), GFP_KERNEL); @@ -2085,28 +2085,24 @@ static int __init snp_get_tsc_info(void) if (!tsc_resp) goto e_free_tsc_req; - req = kzalloc(sizeof(*req), GFP_KERNEL); - if (!req) - goto e_free_tsc_resp; - mdesc = snp_msg_alloc(); if (IS_ERR_OR_NULL(mdesc)) - goto e_free_req; + goto e_free_tsc_resp; rc = snp_msg_init(mdesc, snp_vmpl); if (rc) goto e_free_mdesc; - req->msg_version = MSG_HDR_VER; - req->msg_type = SNP_MSG_TSC_INFO_REQ; - req->vmpck_id = snp_vmpl; - req->req_buf = tsc_req; - req->req_sz = sizeof(*tsc_req); - req->resp_buf = (void *)tsc_resp; - req->resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; - req->exit_code = SVM_VMGEXIT_GUEST_REQUEST; + req.msg_version = MSG_HDR_VER; + req.msg_type = SNP_MSG_TSC_INFO_REQ; + req.vmpck_id = snp_vmpl; + req.req_buf = tsc_req; + req.req_sz = sizeof(*tsc_req); + req.resp_buf = (void *)tsc_resp; + req.resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; + req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, req); + rc = snp_send_guest_request(mdesc, &req); if (rc) goto e_request; @@ -2127,9 +2123,7 @@ static int __init snp_get_tsc_info(void) memzero_explicit(tsc_resp, sizeof(*tsc_resp) + AUTHTAG_LEN); e_free_mdesc: snp_msg_free(mdesc); -e_free_req: - kfree(req); - e_free_tsc_resp: +e_free_tsc_resp: kfree(tsc_resp); e_free_tsc_req: kfree(tsc_req); -- 2.49.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip: x86/sev] x86/sev: Allocate request in TSC_INFO_REQ on stack 2025-06-11 4:08 ` [PATCH v2 2/4] x86/sev: Allocate request in TSC_INFO_REQ on stack Alexey Kardashevskiy @ 2025-06-19 10:39 ` tip-bot2 for Alexey Kardashevskiy 0 siblings, 0 replies; 9+ messages in thread From: tip-bot2 for Alexey Kardashevskiy @ 2025-06-19 10:39 UTC (permalink / raw) To: linux-tip-commits Cc: Alexey Kardashevskiy, Borislav Petkov (AMD), Tom Lendacky, Dionna Glaze, x86, linux-kernel The following commit has been merged into the x86/sev branch of tip: Commit-ID: d100016eac21636c8c0507a83bc32d9eb8cd56ab Gitweb: https://git.kernel.org/tip/d100016eac21636c8c0507a83bc32d9eb8cd56ab Author: Alexey Kardashevskiy <aik@amd.com> AuthorDate: Wed, 11 Jun 2025 14:08:40 +10:00 Committer: Borislav Petkov (AMD) <bp@alien8.de> CommitterDate: Wed, 18 Jun 2025 22:55:39 +02:00 x86/sev: Allocate request in TSC_INFO_REQ on stack Allocate a 88 byte request structure on stack and skip needless kzalloc/kfree. While at this, correct indent. No functional change intended. Signed-off-by: Alexey Kardashevskiy <aik@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Link: https://lore.kernel.org/20250611040842.2667262-3-aik@amd.com --- arch/x86/coco/sev/core.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index cf91cb4..0686538 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2069,7 +2069,7 @@ static int __init snp_get_tsc_info(void) struct snp_tsc_info_resp *tsc_resp; struct snp_tsc_info_req *tsc_req; struct snp_msg_desc *mdesc; - struct snp_guest_req *req; + struct snp_guest_req req = {}; int rc = -ENOMEM; tsc_req = kzalloc(sizeof(*tsc_req), GFP_KERNEL); @@ -2085,28 +2085,24 @@ static int __init snp_get_tsc_info(void) if (!tsc_resp) goto e_free_tsc_req; - req = kzalloc(sizeof(*req), GFP_KERNEL); - if (!req) - goto e_free_tsc_resp; - mdesc = snp_msg_alloc(); if (IS_ERR_OR_NULL(mdesc)) - goto e_free_req; + goto e_free_tsc_resp; rc = snp_msg_init(mdesc, snp_vmpl); if (rc) goto e_free_mdesc; - req->msg_version = MSG_HDR_VER; - req->msg_type = SNP_MSG_TSC_INFO_REQ; - req->vmpck_id = snp_vmpl; - req->req_buf = tsc_req; - req->req_sz = sizeof(*tsc_req); - req->resp_buf = (void *)tsc_resp; - req->resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; - req->exit_code = SVM_VMGEXIT_GUEST_REQUEST; + req.msg_version = MSG_HDR_VER; + req.msg_type = SNP_MSG_TSC_INFO_REQ; + req.vmpck_id = snp_vmpl; + req.req_buf = tsc_req; + req.req_sz = sizeof(*tsc_req); + req.resp_buf = (void *)tsc_resp; + req.resp_sz = sizeof(*tsc_resp) + AUTHTAG_LEN; + req.exit_code = SVM_VMGEXIT_GUEST_REQUEST; - rc = snp_send_guest_request(mdesc, req); + rc = snp_send_guest_request(mdesc, &req); if (rc) goto e_request; @@ -2127,9 +2123,7 @@ e_request: memzero_explicit(tsc_resp, sizeof(*tsc_resp) + AUTHTAG_LEN); e_free_mdesc: snp_msg_free(mdesc); -e_free_req: - kfree(req); - e_free_tsc_resp: +e_free_tsc_resp: kfree(tsc_resp); e_free_tsc_req: kfree(tsc_req); ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 3/4] x86/sev: Document requirement for linear mapping of Guest Request buffers 2025-06-11 4:08 [PATCH v2 0/4] x86/sev: Rework SNP Guest Request Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 2/4] x86/sev: Allocate request in TSC_INFO_REQ on stack Alexey Kardashevskiy @ 2025-06-11 4:08 ` Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] x86/sev: Document requirement for linear mapping of guest request buffers tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 4/4] x86/sev: Drop unnecessary parameter in snp_issue_guest_request Alexey Kardashevskiy 3 siblings, 1 reply; 9+ messages in thread From: Alexey Kardashevskiy @ 2025-06-11 4:08 UTC (permalink / raw) To: x86 Cc: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin, Tom Lendacky, Nikunj A Dadhania, Ard Biesheuvel, Ashish Kalra, Dionna Glaze, Michael Roth, Kuppuswamy Sathyanarayanan, Alexey Kardashevskiy The Guest Request supports 3 types of messages now, the largest is the extended variant of MSG_REPORT_REQ: sizeof(snp_ext_report_req)==112. These used to be allocated on stack and then moved to the SNP guest platform device (snp_guest_dev) for the reason explained in commit db10cb9b5746 ("virt: sevguest: Fix passing a stack buffer as a scatterlist target"): aesgcm_encrypt() and aesgcm_decrypt() are used for guest messages and might potentially use a crypto accelerator which requires DMA buffers to be in the linear mapping. Add a comment, pr_warn() and return -EINVAL when the buffers are not in linear mapping. Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Signed-off-by: Alexey Kardashevskiy <aik@amd.com> --- Changes: v2: * adjust grammar --- arch/x86/coco/sev/core.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 068653865bfb..b0d423a353ab 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2008,6 +2008,15 @@ int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req u64 seqno; int rc; + /* + * enc_payload() calls aesgcm_encrypt(), which can potentially offload to HW. + * The offload's DMA SG list of data to encrypt has to be in linear mapping. + */ + if (!virt_addr_valid(req->req_buf) || !virt_addr_valid(req->resp_buf)) { + pr_warn("AES-GSM buffers must be in linear mapping"); + return -EINVAL; + } + guard(mutex)(&snp_cmd_mutex); /* Check if the VMPCK is not empty */ -- 2.49.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip: x86/sev] x86/sev: Document requirement for linear mapping of guest request buffers 2025-06-11 4:08 ` [PATCH v2 3/4] x86/sev: Document requirement for linear mapping of Guest Request buffers Alexey Kardashevskiy @ 2025-06-19 10:39 ` tip-bot2 for Alexey Kardashevskiy 0 siblings, 0 replies; 9+ messages in thread From: tip-bot2 for Alexey Kardashevskiy @ 2025-06-19 10:39 UTC (permalink / raw) To: linux-tip-commits Cc: Alexey Kardashevskiy, Borislav Petkov (AMD), Tom Lendacky, Dionna Glaze, x86, linux-kernel The following commit has been merged into the x86/sev branch of tip: Commit-ID: 7ffeb2fc26707f613685ce7711c26a9de5890ab1 Gitweb: https://git.kernel.org/tip/7ffeb2fc26707f613685ce7711c26a9de5890ab1 Author: Alexey Kardashevskiy <aik@amd.com> AuthorDate: Wed, 11 Jun 2025 14:08:41 +10:00 Committer: Borislav Petkov (AMD) <bp@alien8.de> CommitterDate: Wed, 18 Jun 2025 22:55:53 +02:00 x86/sev: Document requirement for linear mapping of guest request buffers The Guest Request supports 3 types of messages now, the largest is the extended variant of MSG_REPORT_REQ: sizeof(snp_ext_report_req)==112. These used to be allocated on stack and then moved to the SNP guest platform device (snp_guest_dev) for the reason explained in db10cb9b5746 ("virt: sevguest: Fix passing a stack buffer as a scatterlist target"): aesgcm_encrypt() and aesgcm_decrypt() are used for guest messages and might potentially use a crypto accelerator which requires DMA buffers to be in the linear mapping. Add a comment, warn and return an error when the buffers are not in linear mapping. Signed-off-by: Alexey Kardashevskiy <aik@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Link: https://lore.kernel.org/20250611040842.2667262-4-aik@amd.com --- arch/x86/coco/sev/core.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 0686538..b0d423a 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -2008,6 +2008,15 @@ int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_req *req u64 seqno; int rc; + /* + * enc_payload() calls aesgcm_encrypt(), which can potentially offload to HW. + * The offload's DMA SG list of data to encrypt has to be in linear mapping. + */ + if (!virt_addr_valid(req->req_buf) || !virt_addr_valid(req->resp_buf)) { + pr_warn("AES-GSM buffers must be in linear mapping"); + return -EINVAL; + } + guard(mutex)(&snp_cmd_mutex); /* Check if the VMPCK is not empty */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] x86/sev: Drop unnecessary parameter in snp_issue_guest_request 2025-06-11 4:08 [PATCH v2 0/4] x86/sev: Rework SNP Guest Request Alexey Kardashevskiy ` (2 preceding siblings ...) 2025-06-11 4:08 ` [PATCH v2 3/4] x86/sev: Document requirement for linear mapping of Guest Request buffers Alexey Kardashevskiy @ 2025-06-11 4:08 ` Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] x86/sev: Drop unnecessary parameter in snp_issue_guest_request() tip-bot2 for Alexey Kardashevskiy 3 siblings, 1 reply; 9+ messages in thread From: Alexey Kardashevskiy @ 2025-06-11 4:08 UTC (permalink / raw) To: x86 Cc: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin, Tom Lendacky, Nikunj A Dadhania, Ard Biesheuvel, Ashish Kalra, Dionna Glaze, Michael Roth, Kuppuswamy Sathyanarayanan, Alexey Kardashevskiy Commit 3e385c0d6ce8 ("virt: sev-guest: Move SNP Guest Request data pages handling under snp_cmd_mutex") moved @input from snp_msg_desc to snp_guest_req which is passed to snp_issue_guest_request(). Drop the extra parameter. No functional change intended. Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Signed-off-by: Alexey Kardashevskiy <aik@amd.com> --- arch/x86/coco/sev/core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index b0d423a353ab..8375ca7fbd8a 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -1389,8 +1389,9 @@ int snp_issue_svsm_attest_req(u64 call_id, struct svsm_call *call, } EXPORT_SYMBOL_GPL(snp_issue_svsm_attest_req); -static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input) +static int snp_issue_guest_request(struct snp_guest_req *req) { + struct snp_req_data *input = &req->input; struct ghcb_state state; struct es_em_ctxt ctxt; unsigned long flags; @@ -1932,7 +1933,7 @@ static int __handle_guest_request(struct snp_msg_desc *mdesc, struct snp_guest_r * sequence number must be incremented or the VMPCK must be deleted to * prevent reuse of the IV. */ - rc = snp_issue_guest_request(req, &req->input); + rc = snp_issue_guest_request(req); switch (rc) { case -ENOSPC: /* -- 2.49.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip: x86/sev] x86/sev: Drop unnecessary parameter in snp_issue_guest_request() 2025-06-11 4:08 ` [PATCH v2 4/4] x86/sev: Drop unnecessary parameter in snp_issue_guest_request Alexey Kardashevskiy @ 2025-06-19 10:39 ` tip-bot2 for Alexey Kardashevskiy 0 siblings, 0 replies; 9+ messages in thread From: tip-bot2 for Alexey Kardashevskiy @ 2025-06-19 10:39 UTC (permalink / raw) To: linux-tip-commits Cc: Alexey Kardashevskiy, Borislav Petkov (AMD), Tom Lendacky, Dionna Glaze, x86, linux-kernel The following commit has been merged into the x86/sev branch of tip: Commit-ID: 040ed574ee823a2ce5da36a8d385d3133787c9c5 Gitweb: https://git.kernel.org/tip/040ed574ee823a2ce5da36a8d385d3133787c9c5 Author: Alexey Kardashevskiy <aik@amd.com> AuthorDate: Wed, 11 Jun 2025 14:08:42 +10:00 Committer: Borislav Petkov (AMD) <bp@alien8.de> CommitterDate: Wed, 18 Jun 2025 22:55:58 +02:00 x86/sev: Drop unnecessary parameter in snp_issue_guest_request() Commit 3e385c0d6ce8 ("virt: sev-guest: Move SNP Guest Request data pages handling under snp_cmd_mutex") moved @input from snp_msg_desc to snp_guest_req which is passed to snp_issue_guest_request(). Drop the extra parameter. No functional change intended. Signed-off-by: Alexey Kardashevskiy <aik@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Dionna Glaze <dionnaglaze@google.com> Link: https://lore.kernel.org/20250611040842.2667262-5-aik@amd.com --- arch/x86/coco/sev/core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index b0d423a..8375ca7 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -1389,8 +1389,9 @@ int snp_issue_svsm_attest_req(u64 call_id, struct svsm_call *call, } EXPORT_SYMBOL_GPL(snp_issue_svsm_attest_req); -static int snp_issue_guest_request(struct snp_guest_req *req, struct snp_req_data *input) +static int snp_issue_guest_request(struct snp_guest_req *req) { + struct snp_req_data *input = &req->input; struct ghcb_state state; struct es_em_ctxt ctxt; unsigned long flags; @@ -1932,7 +1933,7 @@ retry_request: * sequence number must be incremented or the VMPCK must be deleted to * prevent reuse of the IV. */ - rc = snp_issue_guest_request(req, &req->input); + rc = snp_issue_guest_request(req); switch (rc) { case -ENOSPC: /* ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-06-19 10:40 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-06-11 4:08 [PATCH v2 0/4] x86/sev: Rework SNP Guest Request Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 1/4] virt: sev-guest: Contain snp_guest_request_ioctl in sev-guest Alexey Kardashevskiy 2025-06-19 10:40 ` [tip: x86/sev] " tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 2/4] x86/sev: Allocate request in TSC_INFO_REQ on stack Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] " tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 3/4] x86/sev: Document requirement for linear mapping of Guest Request buffers Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] x86/sev: Document requirement for linear mapping of guest request buffers tip-bot2 for Alexey Kardashevskiy 2025-06-11 4:08 ` [PATCH v2 4/4] x86/sev: Drop unnecessary parameter in snp_issue_guest_request Alexey Kardashevskiy 2025-06-19 10:39 ` [tip: x86/sev] x86/sev: Drop unnecessary parameter in snp_issue_guest_request() tip-bot2 for Alexey Kardashevskiy
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®