mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Kai Huang <kai.huang@intel.com>
To: 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: [PATCH v4 3/8] x86/virt/tdx: Prepare to support reading other global metadata fields
Date: Tue, 24 Sep 2024 23:28:30 +1200	[thread overview]
Message-ID: <101f6f252db860ad7a7433596006da0d210dd5cb.1727173372.git.kai.huang@intel.com> (raw)
In-Reply-To: <cover.1727173372.git.kai.huang@intel.com>

The TDX module provides a set of "Global Metadata Fields".  They report
things like TDX module version, supported features, and fields related
to create/run TDX guests and so on.  TDX supports 8/16/32/64 bits
metadata field element sizes.  For a given metadata field, the element
size is encoded in the metadata field ID.

For now the kernel only reads "TD Memory Region" (TDMR) related metadata
fields and they are all 16-bit.  Thus the kernel only has one primitive
__read_sys_metadata_field16() to read 16-bit metadata field and the
macro, read_sys_metadata_field16(), which does additional build-time
check of the field ID makes sure the field is indeed 16-bit.

Future changes will need to read more metadata fields with different
element sizes.  Choose to provide one primitive for each element size to
support that.  Similar to the build_mmio_read() macro, reimplement the
body of __read_sys_metadata_field16() as a macro build_sysmd_read(_size)
in size-agnostic way, so it can be used to generate one primitive for
each element size:

  build_sysmd_read(8)
  build_sysmd_read(16)
  ..

Also extend read_sys_metadata_field16() take the '_size' as argument
(and rename it to read_sys_metadata_field() to make it size-agnostic) to
allow the READ_SYS_INFO() macro to choose which primitive to use.

Signed-off-by: Kai Huang <kai.huang@intel.com>
---

v3 -> v4:
 - Change to use one primitive for each element size, similar to
   build_mmio_read() macro - Dan.
 - Rewrite changelog based on the new code.
 - "global metadata fields" -> "Global Metadata Fields" - Ardian.

v2 -> v3:
 - Rename read_sys_metadata_field() to tdh_sys_rd() so the former can be
   used as the high level wrapper.  Get rid of "stbuf_" prefix since
   people don't like it.
 
 - Rewrite after removing 'struct field_mapping' and reimplementing
   TD_SYSINFO_MAP().
 
---
 arch/x86/virt/vmx/tdx/tdx.c | 40 ++++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 2f7e4abc1bb9..b5c8dde9caf0 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -250,7 +250,7 @@ static int build_tdx_memlist(struct list_head *tmb_list)
 	return ret;
 }
 
-static int read_sys_metadata_field(u64 field_id, u64 *data)
+static int tdh_sys_rd(u64 field_id, u64 *data)
 {
 	struct tdx_module_args args = {};
 	int ret;
@@ -270,25 +270,29 @@ static int read_sys_metadata_field(u64 field_id, u64 *data)
 	return 0;
 }
 
-static int __read_sys_metadata_field16(u64 field_id, u16 *val)
-{
-	u64 tmp;
-	int ret;
-
-	ret = read_sys_metadata_field(field_id, &tmp);
-	if (ret)
-		return ret;
-
-	*val = tmp;
-
-	return 0;
+#define build_sysmd_read(_size)							\
+static int __read_sys_metadata_field##_size(u64 field_id, u##_size *val)	\
+{										\
+	u64 tmp;								\
+	int ret;								\
+										\
+	ret = tdh_sys_rd(field_id, &tmp);					\
+	if (ret)								\
+		return ret;							\
+										\
+	*val = tmp;								\
+										\
+	return 0;								\
 }
 
-#define read_sys_metadata_field16(_field_id, _val)		\
+build_sysmd_read(16)
+
+#define read_sys_metadata_field(_field_id, _val, _size)		\
 ({								\
 	BUILD_BUG_ON(MD_FIELD_ID_ELE_SIZE_CODE(_field_id) !=	\
-			MD_FIELD_ID_ELE_SIZE_16BIT);		\
-	__read_sys_metadata_field16(_field_id, _val);		\
+			MD_FIELD_ID_ELE_SIZE_##_size##BIT);	\
+	BUILD_BUG_ON(_size != sizeof(*_val) * 8);		\
+	__read_sys_metadata_field##_size(_field_id, _val);	\
 })
 
 static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
@@ -296,8 +300,8 @@ static int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
 	int ret = 0;
 
 #define READ_SYS_INFO(_field_id, _member)				\
-	ret = ret ?: read_sys_metadata_field16(MD_FIELD_ID_##_field_id,	\
-					&sysinfo_tdmr->_member)
+	ret = ret ?: read_sys_metadata_field(MD_FIELD_ID_##_field_id,	\
+					&sysinfo_tdmr->_member, 16)
 
 	READ_SYS_INFO(MAX_TDMRS,	     max_tdmrs);
 	READ_SYS_INFO(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr);
-- 
2.46.0


  parent reply	other threads:[~2024-09-24 11:29 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-24 11:28 [PATCH v4 0/8] TDX host: metadata reading tweaks, bug fix and info dump Kai Huang
2024-09-24 11:28 ` [PATCH v4 1/8] x86/virt/tdx: Rename 'struct tdx_tdmr_sysinfo' to reflect the spec better Kai Huang
2024-09-24 11:28 ` [PATCH v4 2/8] x86/virt/tdx: Rework TD_SYSINFO_MAP to support build-time verification Kai Huang
2024-09-24 11:28 ` Kai Huang [this message]
2024-09-26  6:27   ` [PATCH v4 3/8] x86/virt/tdx: Prepare to support reading other global metadata fields Nikolay Borisov
2024-09-26 12:13     ` Huang, Kai
2024-09-26 15:47   ` Dave Hansen
2024-09-26 22:22     ` Huang, Kai
2024-09-26 22:26       ` Dave Hansen
2024-09-26 23:05         ` Huang, Kai
2024-10-01  7:56           ` Dan Williams
2024-10-01 10:44             ` Huang, Kai
2024-10-01 15:19               ` Dave Hansen
2024-10-01 21:40                 ` Huang, Kai
2024-10-07  3:07                   ` Huang, Kai
2024-10-07  3:44                     ` Dave Hansen
2024-10-07  6:53                       ` Huang, Kai
2024-10-09 11:10                         ` Huang, Kai
2024-09-24 11:28 ` [PATCH v4 4/8] x86/virt/tdx: Refine a comment to reflect the latest TDX spec Kai Huang
2024-09-24 11:28 ` [PATCH v4 5/8] x86/virt/tdx: Start to track all global metadata in one structure Kai Huang
2024-09-26  6:21   ` Nikolay Borisov
2024-09-24 11:28 ` [PATCH v4 6/8] x86/virt/tdx: Print TDX module version Kai Huang
2024-09-24 11:28 ` [PATCH v4 7/8] x86/virt/tdx: Require the module to assert it has the NO_RBP_MOD mitigation Kai Huang
2024-09-24 11:28 ` [PATCH v4 8/8] x86/virt/tdx: Reduce TDMR's reserved areas by using CMRs to find memory holes Kai Huang

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=101f6f252db860ad7a7433596006da0d210dd5cb.1727173372.git.kai.huang@intel.com \
    --to=kai.huang@intel.com \
    --cc=adrian.hunter@intel.com \
    --cc=bp@alien8.de \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=hpa@zytor.com \
    --cc=isaku.yamahata@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®