[RFC PATCH v2 06/10] x86/virt/tdx: Convert the handoff metadata reader
From: Chao Gao
Date: Fri Sep 18 2026 - 10:06:19 EST
Continue converting the metadata readers to the table-driven helper.
Add a table that pairs each field ID with the 'struct
tdx_sys_info_handoff' member that holds its value, and read all fields by
walking that table.
AI was used under supervision to review code and workshop logs
Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
---
arch/x86/virt/vmx/tdx/tdx.c | 12 ++++++++++++
arch/x86/virt/vmx/tdx/tdx.h | 3 +++
arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 13 -------------
3 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 7b6b1ee075a3..2bd7a2c9432b 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -499,6 +499,18 @@ static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *td_ctrl)
return read_sys_metadata_table(td_ctrl_mappings, td_ctrl);
}
+#define TDX_SYSINFO_MAP_HANDOFF(_field_id, _member) \
+ TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_handoff, _member)
+
+static const struct field_mapping handoff_mappings[] = {
+ TDX_SYSINFO_MAP_HANDOFF(MODULE_HV, module_hv),
+};
+
+static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *handoff)
+{
+ return read_sys_metadata_table(handoff_mappings, 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.h b/arch/x86/virt/vmx/tdx/tdx.h
index f33eb7dc7b45..6f99e4cdcc19 100644
--- a/arch/x86/virt/vmx/tdx/tdx.h
+++ b/arch/x86/virt/vmx/tdx/tdx.h
@@ -86,6 +86,9 @@
#define TDX_MD_FIELD_ID_TDCS_BASE_SIZE 0x9800000100000100ULL
#define TDX_MD_FIELD_ID_TDVPS_BASE_SIZE 0x9800000100000200ULL
+/* Class "TDX Module Handoff" */
+#define TDX_MD_FIELD_ID_MODULE_HV 0x8900000100000000ULL
+
/* TDX page types */
#define PT_NDA 0x0
#define PT_RSVD 0x1
diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
index c6b375771265..36bbf42dead9 100644
--- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
+++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c
@@ -40,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