[PATCH v1 4/8] x86/virt/tdx: Convert version/tdmr/td_ctrl/handoff readers

Chao Gao <[email protected]>
Newsgroups dev.linux.lists.linux-coco,org.kernel.vger.kvm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
From: Dave Hansen <[email protected]>

Convert the simple-scalar global-metadata classes to the table-driven
reader.

Drop the corresponding functions from the auto-generated file.

Note that the version and handoff tables are not tagged __initconst,
as their readers run at runtime.

Assisted-by: Claude:claude-opus-5
Not-yet-signed-off-by: Dave Hansen <[email protected]>
Signed-off-by: Chao Gao <[email protected]>
---
 arch/x86/virt/vmx/tdx/tdx.c                 | 64 +++++++++++++++++++++
 arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 62 --------------------
 2 files changed, 64 insertions(+), 62 deletions(-)

diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index fb21433e7851..89055afeef68 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -393,6 +393,22 @@ static int read_sys_metadata_table(const struct tdx_sys_field *fields,
 	return 0;
 }
 
+#define MAP_VERSION(_field_id, _member)	\
+	TD_SYSINFO_MAP(_field_id, tdx_sys_info_version, _member)
+
+static const struct tdx_sys_field version_fields[] = {
+	MAP_VERSION(MINOR_VERSION,	minor_version),
+	MAP_VERSION(MAJOR_VERSION,	major_version),
+	MAP_VERSION(UPDATE_VERSION,	update_version),
+};
+
+static int get_tdx_sys_info_version(struct tdx_sys_info_version *sysinfo_version)
+{
+	return read_sys_metadata_table(version_fields,
+				       ARRAY_SIZE(version_fields),
+				       sysinfo_version);
+}
+
 #define MAP_FEATURES(_field_id, _member)	\
 	TD_SYSINFO_MAP(_field_id, tdx_sys_info_features, _member)
 
@@ -407,6 +423,54 @@ static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *sysinf
 				       sysinfo_features);
 }
 
+#define MAP_TDMR(_field_id, _member)	\
+	TD_SYSINFO_MAP(_field_id, tdx_sys_info_tdmr, _member)
+
+static const struct tdx_sys_field tdmr_fields[] __initconst = {
+	MAP_TDMR(MAX_TDMRS,		max_tdmrs),
+	MAP_TDMR(MAX_RESERVED_PER_TDMR,	max_reserved_per_tdmr),
+	MAP_TDMR(PAMT_4K_ENTRY_SIZE,	pamt_4k_entry_size),
+	MAP_TDMR(PAMT_2M_ENTRY_SIZE,	pamt_2m_entry_size),
+	MAP_TDMR(PAMT_1G_ENTRY_SIZE,	pamt_1g_entry_size),
+};
+
+static __init int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
+{
+	return read_sys_metadata_table(tdmr_fields,
+				       ARRAY_SIZE(tdmr_fields),
+				       sysinfo_tdmr);
+}
+
+#define MAP_TD_CTRL(_field_id, _member)	\
+	TD_SYSINFO_MAP(_field_id, tdx_sys_info_td_ctrl, _member)
+
+static const struct tdx_sys_field td_ctrl_fields[] __initconst = {
+	MAP_TD_CTRL(TDR_BASE_SIZE,	tdr_base_size),
+	MAP_TD_CTRL(TDCS_BASE_SIZE,	tdcs_base_size),
+	MAP_TD_CTRL(TDVPS_BASE_SIZE,	tdvps_base_size),
+};
+
+static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sysinfo_td_ctrl)
+{
+	return read_sys_metadata_table(td_ctrl_fields,
+				       ARRAY_SIZE(td_ctrl_fields),
+				       sysinfo_td_ctrl);
+}
+
+#define MAP_HANDOFF(_field_id, _member)	\
+	TD_SYSINFO_MAP(_field_id, tdx_sys_info_handoff, _member)
+
+static const struct tdx_sys_field handoff_fields[] = {
+	MAP_HANDOFF(MODULE_HV,	module_hv),
+};
+
+static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *sysinfo_handoff)
+{
+	return read_sys_metadata_table(handoff_fields,
+				       ARRAY_SIZE(handoff_fields),
+				       sysinfo_handoff);
+}
+
 #include "tdx_global_metadata.c"
 
 static __init int check_features(struct tdx_sys_info *sysinfo)
diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
index e69c655a91a0..0c2cc99f1af1 100644
--- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
+++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
@@ -7,55 +7,6 @@
  * Include this file to other C file instead.
  */
 
-static int get_tdx_sys_info_version(struct tdx_sys_info_version *sysinfo_version)
-{
-	int ret = 0;
-	u64 val;
-
-	if (!ret && !(ret = read_sys_metadata_field(0x0800000100000003, &val)))
-		sysinfo_version->minor_version = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x0800000100000004, &val)))
-		sysinfo_version->major_version = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x0800000100000005, &val)))
-		sysinfo_version->update_version = val;
-
-	return ret;
-}
-
-static __init int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_tdmr)
-{
-	int ret = 0;
-	u64 val;
-
-	if (!ret && !(ret = read_sys_metadata_field(0x9100000100000008, &val)))
-		sysinfo_tdmr->max_tdmrs = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9100000100000009, &val)))
-		sysinfo_tdmr->max_reserved_per_tdmr = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9100000100000010, &val)))
-		sysinfo_tdmr->pamt_4k_entry_size = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9100000100000011, &val)))
-		sysinfo_tdmr->pamt_2m_entry_size = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9100000100000012, &val)))
-		sysinfo_tdmr->pamt_1g_entry_size = val;
-
-	return ret;
-}
-
-static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sysinfo_td_ctrl)
-{
-	int ret = 0;
-	u64 val;
-
-	if (!ret && !(ret = read_sys_metadata_field(0x9800000100000000, &val)))
-		sysinfo_td_ctrl->tdr_base_size = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9800000100000100, &val)))
-		sysinfo_td_ctrl->tdcs_base_size = val;
-	if (!ret && !(ret = read_sys_metadata_field(0x9800000100000200, &val)))
-		sysinfo_td_ctrl->tdvps_base_size = val;
-
-	return ret;
-}
-
 static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sysinfo_td_conf)
 {
 	int ret = 0;
@@ -89,19 +40,6 @@ static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sysinfo_
 	return ret;
 }
 
-static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *sysinfo_handoff)
-{
-	int ret;
-	u64 val;
-
-	ret = read_sys_metadata_field(0x8900000100000000, &val);
-	if (ret)
-		return ret;
-
-	sysinfo_handoff->module_hv = val;
-	return 0;
-}
-
 static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo)
 {
 	int ret = 0;
-- 
2.52.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.