From: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
To: "linux-coco@lists.linux.dev" <linux-coco@lists.linux.dev>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"yilun.xu@linux.intel.com" <yilun.xu@linux.intel.com>,
"x86@kernel.org" <x86@kernel.org>
Cc: "Gao, Chao" <chao.gao@intel.com>,
"Xu, Yilun" <yilun.xu@intel.com>,
"Duan, Zhenzhong" <zhenzhong.duan@intel.com>,
"kas@kernel.org" <kas@kernel.org>,
"baolu.lu@linux.intel.com" <baolu.lu@linux.intel.com>,
"Li, Xiaoyao" <xiaoyao.li@intel.com>,
"Maloor, Kishen" <kishen.maloor@intel.com>,
"Hunter, Adrian" <adrian.hunter@intel.com>,
"tony.lindgren@linux.intel.com" <tony.lindgren@linux.intel.com>,
"Mehta, Sohil" <sohil.mehta@intel.com>,
"Fang, Peter" <peter.fang@intel.com>,
"nik.borisov@suse.com" <nik.borisov@suse.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"artem.bityutskiy@linux.intel.com"
<artem.bityutskiy@linux.intel.com>
Subject: Re: [PATCH v2 1/5] x86/virt/tdx: Move TDH.SYS.CONFIG operations into a wrapper
Date: Tue, 15 Sep 2026 20:45:04 +0000 [thread overview]
Message-ID: <8b5b577cdad5e81c5166349e13541989f2facf53.camel@intel.com> (raw)
In-Reply-To: <20260915102658.713079-2-yilun.xu@linux.intel.com>
On Tue, 2026-09-15 at 18:26 +0800, Xu Yilun wrote:
> In Linux, SEAMCALL wrappers are introduced to avoid broad SEAMCALL
> access by exposing only a selection of SEAMCALL leafs, but also to
> abstract the SEAMCALL register ABIs.
>
> The latter improves readability and
> reuse for SEAMCALL leafs that are called multiple times.
I'm trying to adjust to not using former/latter. The feedback I've seen is that
it is too much to remember as you read along. How about:
The abstraction improves...
>
> Some SEAMCALL leafs are not explicitly wrapped because the level of TDX
> ABI details needed to perform the call is low enough to flow well with
^are
> the calling code.
>
> For some of the currently unwrapped SEAMCALL leafs, TDX architecture
> adjusts the ABI and adds SEAMCALL version selection for backward
> compatibility.
>
Reads a little weird to me. Like I'm not sure when this adjusting is happening.
How about:
..., the TDX architecture has evolved the ABI to introduce new versions of
existing SEAMCALLs. VMM code can select the version to call based on what is
supported by the loaded TDX module.
> Future kernel will need to support the changes.
>
?? I guess you mean selecting between SEAMCALL versions?
> This will
> leak more ABI details into the surrounding caller code and decrease
> readability of the other logic. To keep the ABI details contained, move
> the SEAMCALL leafs that will need version selection into wrappers.
>
> The cleanest separation would be to have kernel data types for the
> SEAMCALL wrapper arguments,
>
This is now talking about general seamcall wrapper design. It could read like
it's instead talking about clean separation of SEAMCALL versions?
> and have them marshaled into SEAMCALL leaf
> ABI types (often u64s) inside the wrapper. This works for many SEAMCALL
> leafs but becomes cumbersome when the register ABI type is a physical
> address which points to a buffer for an in-memory ABI. If the SEAMCALL
> wrapper only accepts kernel data types, it may need duplicate buffer
> allocation and copies to match the in-memory ABI. Another solution is
> to define a named helper structure that mirrors the in-memory ABI,
> populate it in a separate flow, then pass it to the SEAMCALL wrapper.
> struct seamldr_params is an existing example of this pattern.
>
> TDH.SYS.CONFIG requires a list of TDMR information in the form of a PA
> array. The PA array is the in-memory ABI. Create a structure for the PA
> array, use it as the argument when creating the wrapper for
> TDH.SYS.CONFIG.
>
> Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
> Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
> ---
> v2:
> - Remove TDH.SYS.UPDATE wrapper (Dave & Rick)
> - Talk about the handling of in-memory ABIs for SEAMCALL wrappers
> (Rick)
> - Refactor the entire changelog according to Rick's suggestion (Rick)
> - Add code comment for struct tdmr_info_pa_array (AI nitpicker)
> - Use kernel data type for nr_tdmr_pa parameter (AI nitpicker)
>
> v1:
> - This patch is split out from the last series (Rick)
> ---
> arch/x86/virt/vmx/tdx/tdx.c | 34 +++++++++++++++++++++++++++-------
> 1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index 1668f8615607..e06932f80395 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c
> @@ -998,11 +998,33 @@ static __init int construct_tdmrs(struct list_head *tmb_list,
> return ret;
> }
>
> +/*
> + * This is an array of HPAs, each points to a TDMR_INFO data structure (see
> + * struct tdmr_info).
> + *
> + * It is the in-memory ABI that the kernel passes to the TDX module to specify
> + * the ranges of TD Memory Regions (TDMRs) and their associated PAMT memory.
> + */
> +struct tdmr_info_pa_array {
> + DECLARE_FLEX_ARRAY(u64, phys);
> +};
> +
> +static __init int tdx_sys_config(struct tdmr_info_pa_array *tdmr_pa_array,
> + unsigned int nr_tdmr_pa, u64 global_keyid)
> +{
> + struct tdx_module_args args = {
> + .rcx = __pa(tdmr_pa_array),
> + .rdx = nr_tdmr_pa,
> + .r8 = global_keyid,
> + };
> +
> + return seamcall_prerr(TDH_SYS_CONFIG, &args);
> +}
> +
> static __init int config_tdx_module(struct tdmr_info_list *tdmr_list,
> u64 global_keyid)
> {
> - struct tdx_module_args args = {};
> - u64 *tdmr_pa_array;
> + struct tdmr_info_pa_array *tdmr_pa_array;
> size_t array_sz;
> int i, ret;
>
> @@ -1021,12 +1043,10 @@ static __init int config_tdx_module(struct tdmr_info_list *tdmr_list,
> return -ENOMEM;
Outside the diff it has:
array_sz = tdmr_list->nr_consumed_tdmrs * sizeof(u64);
Could be now changed to:
array_sz = tdmr_list->nr_consumed_tdmrs * sizeof(*tdmr_pa_array->phys);
A bit of existing cleanup, but the u64 is especially tucked away compared to
before, so I'd argue its maintaining readability of the existing code.
>
> for (i = 0; i < tdmr_list->nr_consumed_tdmrs; i++)
> - tdmr_pa_array[i] = __pa(tdmr_entry(tdmr_list, i));
> + tdmr_pa_array->phys[i] = __pa(tdmr_entry(tdmr_list, i));
>
> - args.rcx = __pa(tdmr_pa_array);
> - args.rdx = tdmr_list->nr_consumed_tdmrs;
> - args.r8 = global_keyid;
> - ret = seamcall_prerr(TDH_SYS_CONFIG, &args);
> + ret = tdx_sys_config(tdmr_pa_array, tdmr_list->nr_consumed_tdmrs,
> + global_keyid);
>
> /* Free the array as it is not required anymore. */
> kfree(tdmr_pa_array);
> --
> 2.25.1
next prev parent reply other threads:[~2026-09-15 20:45 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 10:26 [PATCH v2 0/5] Enable TDX module extensions Xu Yilun
2026-09-15 10:26 ` [PATCH v2 1/5] x86/virt/tdx: Move TDH.SYS.CONFIG operations into a wrapper Xu Yilun
2026-09-15 20:45 ` Edgecombe, Rick P [this message]
2026-09-15 10:26 ` [PATCH v2 2/5] x86/virt/tdx: Configure add-on features on TDX module init Xu Yilun
2026-09-15 20:54 ` Edgecombe, Rick P
2026-09-16 3:23 ` Chao Gao
2026-09-15 10:26 ` [PATCH v2 3/5] x86/virt/tdx: Detect if the extensions initialization is required Xu Yilun
2026-09-15 21:14 ` Edgecombe, Rick P
2026-09-15 10:26 ` [PATCH v2 4/5] x86/virt/tdx: Add extra memory to TDX module for the extensions Xu Yilun
2026-09-15 21:19 ` Edgecombe, Rick P
2026-09-16 7:40 ` Chao Gao
2026-09-15 10:26 ` [PATCH v2 5/5] x86/virt/tdx: Make TDX module initialize " Xu Yilun
2026-09-15 22:09 ` [PATCH v2 0/5] Enable TDX module extensions Edgecombe, Rick P
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=8b5b577cdad5e81c5166349e13541989f2facf53.camel@intel.com \
--to=rick.p.edgecombe@intel.com \
--cc=adrian.hunter@intel.com \
--cc=artem.bityutskiy@linux.intel.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=kas@kernel.org \
--cc=kishen.maloor@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=nik.borisov@suse.com \
--cc=peter.fang@intel.com \
--cc=sohil.mehta@intel.com \
--cc=tony.lindgren@linux.intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=yilun.xu@intel.com \
--cc=yilun.xu@linux.intel.com \
--cc=zhenzhong.duan@intel.com \
/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®