From: Dan Williams <dan.j.williams@intel.com>
To: Kai Huang <kai.huang@intel.com>, <dave.hansen@intel.com>,
<kirill.shutemov@linux.intel.com>, <tglx@linutronix.de>,
<bp@alien8.de>, <peterz@infradead.org>, <mingo@redhat.com>,
<hpa@zytor.com>, <dan.j.williams@intel.com>, <seanjc@google.com>,
<pbonzini@redhat.com>
Cc: <x86@kernel.org>, <linux-kernel@vger.kernel.org>,
<kvm@vger.kernel.org>, <rick.p.edgecombe@intel.com>,
<isaku.yamahata@intel.com>, <adrian.hunter@intel.com>,
<nik.borisov@suse.com>, <kai.huang@intel.com>
Subject: Re: [PATCH v6 03/10] x86/virt/tdx: Use auto-generated code to read global metadata
Date: Mon, 28 Oct 2024 14:46:52 -0700 [thread overview]
Message-ID: <6720064bf2c69_bc69d2947b@dwillia2-xfh.jf.intel.com.notmuch> (raw)
In-Reply-To: <8955c0e6f0ae801a8166c920b669746da037bccd.1730118186.git.kai.huang@intel.com>
Kai Huang wrote:
> From: Paolo Bonzini <pbonzini@redhat.com>
>
> The TDX module provides a set of "Global Metadata Fields". Currently
> the kernel only reads "TD Memory Region" (TDMR) related fields for
> module initialization. There are needs to read more global metadata
> fields including TDX module version [1], supported features [2] and
> "Convertible Memory Regions" (CMRs) to fix a module initialization
> failure [3]. Future changes to support KVM TDX and other features like
> TDX Connect will need to read more.
>
> The current global metadata reading code has limitations (e.g., it only
> has a primitive helper to read metadata field with 16-bit element size,
> while TDX supports 8/16/32/64 bits metadata element sizes). It needs
> tweaks in order to read more metadata fields.
>
> But even with the tweaks, when new code is added to read a new field,
> the reviewers will still need to review against the spec to make sure
> the new code doesn't screw up things like using the wrong metadata
> field ID (each metadata field is associated with a unique field ID,
> which is a TDX-defined u64 constant) etc.
>
> TDX documents all global metadata fields in a 'global_metadata.json'
> file as part of TDX spec [4]. JSON format is machine readable. Instead
> of tweaking the metadata reading code, use a script [5] to generate the
> code so that:
>
> 1) Using the generated C is simple.
> 2) Adding a field is dirty simple, e.g., the script just pulls the
Probably meant "dirt simple", but if this is fixed up on apply I'd drop
the idiom and just say "simple".
...don't spin the patch just for this nit.
> field ID out of the JSON for a given field thus no manual review is
> needed.
>
> Specifically, to match the layout of the 'struct tdx_sys_info' and its
> sub-structures, the script uses a table with each entry containing the
> the name of the sub-structures (which reflects the "Class") and the
> "Field Name" of all its fields, and auto-generate:
>
> 1) The 'struct tdx_sys_info' and all 'struct tdx_sys_info_xx'
> sub-structures in 'tdx_global_metadata.h'
>
> 2) The main function 'get_tdx_sys_info()' which reads all metadata to
> 'struct tdx_sys_info' and the 'get_tdx_sys_info_xx()' functions
> which read 'struct tdx_sys_info_xx()' in 'tdx_global_metadata.c'.
>
> Using the generated C is simple: 1) include "tdx_global_metadata.h" to
> the local "tdx.h"; 2) explicitly include "tdx_global_metadata.c" to the
> local "tdx.c" after the read_sys_metadata_field() primitive (which is a
> wrapper of TDH.SYS.RD SEAMCALL to read global metadata).
>
> Adding a field is also simple: 1) just add the new field to an existing
> structure, or add it with a new structure; 2) re-run the script to
> generate the new code; 3) update the existing tdx_global_metadata.{hc}
> with the new ones.
>
> For now, use the auto-generated code to read the aforesaid metadata
> fields: 1) TDX module version; 2) supported features; 3) CMRs.
>
> Reading CMRs is more complicated than reading a simple field, since
> there are two arrays containing the "CMR_BASE" and "CMR_SIZE" for each
> CMR respectively.
>
> TDX spec [3] section "Metadata Access Interface", sub-section "Arrays of
> Metadata Fields" defines the way to read metadata fields in an array.
> There's a "Base field ID" (say, X) for the array and the field ID for
> entry array[i] is X + i.
>
> For CMRs, the field "NUM_CMRS" reports the number of CMR entries that
> can be read, and the code needs to use the value reported via "NUM_CMRS"
> to loop despite the JSON file says the "Num Fields" of both "CMR_BASE"
> and "CMR_SIZE" are 32.
>
> The tdx_global_metadata.{hc} can be generated by running below:
>
> #python tdx.py global_metadata.json tdx_global_metadata.h \
> tdx_global_metadata.c
>
> .. where tdx.py can be found in [5] and global_metadata.json can be
> fetched from [4].
>
> Link: https://lore.kernel.org/lkml/4b3adb59-50ea-419e-ad02-e19e8ca20dee@intel.com/ [1]
> Link: https://lore.kernel.org/all/fc0e8ab7-86d4-4428-be31-82e1ece6dd21@intel.com/ [2]
> Link: https://lore.kernel.org/kvm/0853b155ec9aac09c594caa60914ed6ea4dc0a71.camel@intel.com/ [5]
Just an fyi, that lore accepts the simple:
https://lore.kernel.org/$msg_id
...format, no need to record the list name in the URL (127734e23aed
("Documentation: best practices for using Link trailers"))
> Link: https://github.com/canonical/tdx/issues/135 [3]
> Link: https://cdrdv2.intel.com/v1/dl/getContent/795381 [4]
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Co-developed-by: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Kai Huang <kai.huang@intel.com>
Looks good to me, with or without the above nits addressed.
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
next prev parent reply other threads:[~2024-10-28 21:46 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-28 12:41 [PATCH v6 00/10] TDX host: metadata reading tweaks, bug fix and info dump Kai Huang
2024-10-28 12:41 ` [PATCH v6 01/10] x86/virt/tdx: Rename 'struct tdx_tdmr_sysinfo' to reflect the spec better Kai Huang
2024-10-28 12:41 ` [PATCH v6 02/10] x86/virt/tdx: Start to track all global metadata in one structure Kai Huang
2024-10-28 21:37 ` Dan Williams
2024-10-28 12:41 ` [PATCH v6 03/10] x86/virt/tdx: Use auto-generated code to read global metadata Kai Huang
2024-10-28 21:46 ` Dan Williams [this message]
2024-10-28 22:47 ` Huang, Kai
2024-10-28 12:41 ` [PATCH v6 04/10] x86/virt/tdx: Use dedicated struct members for PAMT entry sizes Kai Huang
2024-10-28 13:29 ` Nikolay Borisov
2024-10-28 21:51 ` Dan Williams
2024-10-28 12:41 ` [PATCH v6 05/10] x86/virt/tdx: Add missing header file inclusion to local tdx.h Kai Huang
2024-10-28 13:35 ` Nikolay Borisov
2024-10-28 21:55 ` Dan Williams
2024-10-28 12:41 ` [PATCH v6 06/10] x86/virt/tdx: Switch to use auto-generated global metadata reading code Kai Huang
2024-10-28 14:55 ` Nikolay Borisov
2024-10-28 22:08 ` Dan Williams
2024-10-28 12:41 ` [PATCH v6 07/10] x86/virt/tdx: Trim away tail null CMRs Kai Huang
2024-10-28 22:12 ` Dan Williams
2024-10-28 12:41 ` [PATCH v6 08/10] x86/virt/tdx: Reduce TDMR's reserved areas by using CMRs to find memory holes Kai Huang
2024-10-28 22:26 ` Dan Williams
2024-10-28 23:22 ` Huang, Kai
2024-10-28 12:41 ` [PATCH v6 09/10] x86/virt/tdx: Require the module to assert it has the NO_RBP_MOD mitigation Kai Huang
2024-10-28 12:41 ` [PATCH v6 10/10] x86/virt/tdx: Print TDX module version Kai Huang
2024-10-28 22:36 ` Dan Williams
2024-10-28 22:59 ` Huang, Kai
2024-10-28 17:59 ` [PATCH v6 00/10] TDX host: metadata reading tweaks, bug fix and info dump Paolo Bonzini
2024-10-28 21:50 ` Huang, Kai
2024-10-28 18:35 ` Paolo Bonzini
2024-10-28 21:39 ` Huang, Kai
2024-10-29 0:23 ` Huang, Kai
2024-10-30 14:48 ` Paolo Bonzini
2024-10-30 20:40 ` Huang, Kai
2024-10-31 10:44 ` [PATCH 9/8] x86/virt/tdx: Add the global metadata code generation script Kai Huang
2024-11-06 11:00 ` [PATCH v6 00/10] TDX host: metadata reading tweaks, bug fix and info dump Huang, Kai
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=6720064bf2c69_bc69d2947b@dwillia2-xfh.jf.intel.com.notmuch \
--to=dan.j.williams@intel.com \
--cc=adrian.hunter@intel.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=isaku.yamahata@intel.com \
--cc=kai.huang@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nik.borisov@suse.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--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®