From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2652530C147; Wed, 30 Sep 2026 05:41:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746866; cv=none; b=mw6/+qLXNzNPRhtYsSXf1MSBnDZOQDh6SZy82Uq8NxyORHf161d/5FVb0IoaOlZTxN2zK/YKGiOFFZpTYZkCfyO072mQC0uVTRyysUJWm9FqNgSlJ6vUbRiM5FdDyd+pOSTY+OKQhBzvfQZhC6yyKviCT+Ar6anbxdxetDEfipM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746866; c=relaxed/simple; bh=T9P6mcgxpWhKz75d2zCXZHo0i7BHFj5BIcLfYB+EXZE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iv4rAafEVBEp2KBPDzZRsdLKXfig1KSP4DPm9egeF4X21zzUVg8p3VO0NViNxnBjHHfdMaxhJQefpUL9MDf9z4aBDLIopbCxYwIMYoEt+11eWSH3KZlv+5z+95h5vVMrfGXOqD/QTbD6xi1+RVFmGBVhA60Ylnuu7kyaoZwFbeQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=IRjeSaVZ; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="IRjeSaVZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746865; x=1822282865; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=T9P6mcgxpWhKz75d2zCXZHo0i7BHFj5BIcLfYB+EXZE=; b=IRjeSaVZX/qAPuZ6yXuTTxcj0x4TY2h1XMFjf8eLDiZ9wM2nvW5jzDEU oLoIHt1f5fTrMwT9aaPtasohUBPBKpLtFKZ9wMi/6JNQOjyUydrjRDBUu L686GlCXNv6JdvA+wocbZR/yQFYq/oCFskqUGQJc8qf8Xak5RD6vAN9kr aaGI2TS0F9FcoZhbjMrQtulvdt6WMUZx+vaaDaQdCWls1IQKI4ewUJgg7 cHvURSjjClHxnhTGtMTR4XTwBTEK1Ct0imROrvQn1MHRCNESpQ8BwvFSF lm5jjdcx4GFO8wj1WvTQ2CrK8wzrKo2J+1wrt96XBGud/5xS+kTd6/IeN Q==; X-CSE-ConnectionGUID: 6Fbea9tqQrC4KyXiY7t6EA== X-CSE-MsgGUID: 14eF4eLwSQmnVKFHr2xkqw== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149077" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149077" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:40:59 -0700 X-CSE-ConnectionGUID: vdfn8dUtTOy84d3pfGUCJw== X-CSE-MsgGUID: C7cJUmLVR1GPTbLUo+tUHQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936392" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:40:58 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 01/10] x86/virt/tdx: Add a helper to read a table of metadata fields Date: Tue, 29 Sep 2026 22:38:35 -0700 Message-ID: <20260930053901.22528-2-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The metadata field readers get_tdx_sys_info_() in tdx_global_metadata.c were generated by an out-of-tree script. That has not worked out: the JSON file they were generated from is neither stable nor authoritative enough [1]. The goal now is to maintain the readers by hand and to establish one standard way of adding a metadata field. Take get_tdx_sys_info_version() as an example: if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000003, &va= l))) sysinfo_version->minor_version =3D val; if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000004, &va= l))) sysinfo_version->major_version =3D val; if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000005, &va= l))) sysinfo_version->update_version =3D val; Two patterns stand out: the read-check-store sequence repeats once per field, and the error of each read is chained into the reads that follow. Neither is common in hand-written code. Prepare to eliminate both with a loop that reads each field, stores the value into its structure member, and returns on the first error. Add 'struct field_mapping' to describe one field as its ID plus the offset and size of the member that receives its value. Add TDX_SYSINFO_MAP() to build such an entry from a field ID, a structure type and a member name. Add __read_sys_metadata_table() helper to read every field in a table. Annotate that helper __maybe_unused as there is no caller right now. Following changes will convert the existing readers to use the new helper. AI was used under supervision to review code and workshop logs. It suggested adding read_sys_metadata_table() macro, which avoids repeating the table name when passing both the table and its size. Signed-off-by: Chao Gao Link: https://lore.kernel.org/kvm/1e7bcbad-eb26-44b7-97ca-88ab53467212@inte= l.com/ # [1] Reviewed-by: Nikolay Borisov Reviewed-by: Rick Edgecombe --- v3: - Pass the field ID to TDX_SYSINFO_MAP() instead of pasting the TDX_MD_FIELD_ID_ prefix onto a suffix inside the macro [Rick] - Call out that this patch only prepares to eliminate the two patterns. [Rick] - Define @offset in struct field_mapping as size_t [Binbin] --- arch/x86/virt/vmx/tdx/tdx.c | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 96ced0494b68..67a80ed86bd3 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -395,6 +395,45 @@ static int read_sys_metadata_field(u64 field_id, u64 *= data) return 0; } =20 +/* + * Map a TDX global metadata field to a structure member. + * @field_id: The TDX global metadata field ID. + * @size: The size of the structure member. + * @offset: The member's offset within its containing structure. + */ +struct field_mapping { + u64 field_id; + size_t size; + size_t offset; +}; + +/* Read each metadata field listed in @mappings[] into @data. */ +static int __maybe_unused __read_sys_metadata_table(const struct field_map= ping *mappings, + int num_mappings, void *data) +{ + int i, ret; + u64 val; + + for (i =3D 0; i < num_mappings; i++) { + ret =3D read_sys_metadata_field(mappings[i].field_id, &val); + if (ret) + return ret; + memcpy((char *)data + mappings[i].offset, &val, mappings[i].size); + } + + return 0; +} + +#define read_sys_metadata_table(_mappings, _data) \ + __read_sys_metadata_table(_mappings, ARRAY_SIZE(_mappings), _data) + +#define TDX_SYSINFO_MAP(_field, _type, _member) \ +{ \ + .field_id =3D _field, \ + .offset =3D offsetof(_type, _member), \ + .size =3D sizeof_field(_type, _member), \ +} + #include "tdx_global_metadata.c" =20 static __init int check_features(struct tdx_sys_info *sysinfo) --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 704563B3894; Wed, 30 Sep 2026 05:41:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746868; cv=none; b=fvM/od+aSan5uRsuCean+ET/Unpo6KMD29sK1a9pHyk1Mq4GK+1Ye762PnJUsim3Y64lTLAP1O4qL8HfLTd8Vhd7CpM2K2MljDxCceo9ZY+vytchcwfQNgz+EruCkXSj9QAYqYx4YKHvTgUuRKyNV8G8+JtAJAu12PpRP34mLLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746868; c=relaxed/simple; bh=Cm6dmU1l4xfttZ2AVXjfsIAw6ZUJD5tOA2TKKdoTZR4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jz2oLkpiNmvMienov0qIwph1Yg7QypIiSfLTzfJ0APaXQBfiq5HA9XG2dW/ASnZXX40nywP56HGUEtV/uPG+ofaXDoKatkBy3zes+WB90Eky7OdO79GgaqNmi3lwJUw+wTAvrODjRaBtfaCZ2VjYq91EMob56hrYuHawibafr10= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=g/IHOfBr; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="g/IHOfBr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746867; x=1822282867; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Cm6dmU1l4xfttZ2AVXjfsIAw6ZUJD5tOA2TKKdoTZR4=; b=g/IHOfBr4GNqri28YSPN2tWSqrN1HQYLyg/FMpeY4Q4tp+nGy2BdC448 V3wTiv0xZdU57IrFV4aw2dCOs+HdseWqB7/7/MvLa1t2YLkgfKrUT7yEn vJRPHypf1CSIsmKmVVlARIzizpWnY6SmKCCvNMs5bRg5+8ZW49B2rg4fI y+y0ZiyqmLxyHL5ZS6ydb/K4RNCpvuP5/alg93DLH9cJCTDH15/pWRjlI YmuoHAq0ChLvGOFzkjHJbynVPmtWJNWQBty6EpFjFNf0NPkfikoMTpjPO dpJGEv0Lzvn8HW3JWM8UCZobllbvepWR8CCyhOa1ggVeNzpFBvV10F3kX A==; X-CSE-ConnectionGUID: V0mXDnuQTGaZMa3PvKlYrA== X-CSE-MsgGUID: AS1wzP3fTHuPFlX5fENpqg== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149081" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149081" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:40:59 -0700 X-CSE-ConnectionGUID: XFmdSlsEThWP9/RdlMPKyQ== X-CSE-MsgGUID: S+UXnwdtSG+Y7rxZvJuCkQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936396" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:40:59 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 02/10] x86/virt/tdx: Convert the version metadata reader Date: Tue, 29 Sep 2026 22:38:36 -0700 Message-ID: <20260930053901.22528-3-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" With the helper to read a table of metadata fields in place, the existing metadata readers can be standardized on it. Convert the version metadata reader: add a table that pairs each field ID with the 'struct tdx_sys_info_version' member that holds its value, and read all version fields by walking that table. Name the field IDs for readability, so the table entries don't carry raw hex literals. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- v3: - Drop the get_tdx_sys_info_*() wrappers to remove an unnecessary layer of abstraction. [Rick, Dave] - Shorten the field ID defines from TDX_MD_FIELD_ID_* to TDX_FIELD_* [Rick] --- arch/x86/virt/vmx/tdx/tdx.c | 15 ++++++++++++--- arch/x86/virt/vmx/tdx/tdx.h | 10 ++++++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 17 +---------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 67a80ed86bd3..9d8a55a5da31 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -408,8 +408,8 @@ struct field_mapping { }; =20 /* Read each metadata field listed in @mappings[] into @data. */ -static int __maybe_unused __read_sys_metadata_table(const struct field_map= ping *mappings, - int num_mappings, void *data) +static int __read_sys_metadata_table(const struct field_mapping *mappings, + int num_mappings, void *data) { int i, ret; u64 val; @@ -434,6 +434,15 @@ static int __maybe_unused __read_sys_metadata_table(co= nst struct field_mapping * .size =3D sizeof_field(_type, _member), \ } =20 +#define TDX_SYSINFO_MAP_VERSION(_field_id, _member) \ + TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_version, _member) + +static const struct field_mapping version_mappings[] =3D { + TDX_SYSINFO_MAP_VERSION(TDX_FIELD_MINOR_VERSION, minor_version), + TDX_SYSINFO_MAP_VERSION(TDX_FIELD_MAJOR_VERSION, major_version), + TDX_SYSINFO_MAP_VERSION(TDX_FIELD_UPDATE_VERSION, update_version), +}; + #include "tdx_global_metadata.c" =20 static __init int check_features(struct tdx_sys_info *sysinfo) @@ -1401,7 +1410,7 @@ int tdx_module_run_update(void) if (ret) return ret; =20 - ret =3D get_tdx_sys_info_version(&tdx_sysinfo.version); + ret =3D read_sys_metadata_table(version_mappings, &tdx_sysinfo.version); /* * Only fails if there is something unexpected * and severely wrong with the module. diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index db209541d3cd..10cbc2d77a5a 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -52,6 +52,16 @@ #define TDH_PHYMEM_PAMT_REMOVE 59 #define TDH_SYS_DISABLE 69 =20 +/* + * TDX global metadata field IDs. + * + * See "global_metadata.pdf" in Intel TDX Module ABI Definitions. + */ +/* Class "TDX Module Version" */ +#define TDX_FIELD_MINOR_VERSION 0x0800000100000003ULL +#define TDX_FIELD_MAJOR_VERSION 0x0800000100000004ULL +#define TDX_FIELD_UPDATE_VERSION 0x0800000100000005ULL + /* 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/vm= x/tdx/tdx_global_metadata.c index 98ebf17aab1c..c55674cd4ce6 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,21 +7,6 @@ * Include this file to other C file instead. */ =20 -static int get_tdx_sys_info_version(struct tdx_sys_info_version *sysinfo_v= ersion) -{ - int ret =3D 0; - u64 val; - - if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000003, &val))) - sysinfo_version->minor_version =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000004, &val))) - sysinfo_version->major_version =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x0800000100000005, &val))) - sysinfo_version->update_version =3D val; - - return ret; -} - static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *= sysinfo_features) { int ret =3D 0; @@ -129,7 +114,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info = *sysinfo) { int ret =3D 0; =20 - ret =3D ret ?: get_tdx_sys_info_version(&sysinfo->version); + ret =3D ret ?: read_sys_metadata_table(version_mappings, &sysinfo->versio= n); =20 pr_info("Module version: " TDX_VERSION_FMT "\n", sysinfo->version.major_version, --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4B7C3B42C4; Wed, 30 Sep 2026 05:41:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746876; cv=none; b=aUQhZLqW0OIAobz6WMBBAHNji1zRRVhbmr/y7+0TFpgHrCMvPo9KwI/1AMbs/+hvFQKIQQ2NezInzb6H2NKofc/A2jwtq+T9P+N4KFeY0ix1yYZShsNfluTR06aC36RGHpAtfQ5YkFmdozpRemLm533RrhkLGiEM1iaOgua9Va8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746876; c=relaxed/simple; bh=pbFuUbGzpIZoG5uC6Tm5ggE5txSjxZHHrdMa2QBn85c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fMQ5Jt+jKoUNT1+seCFaZ7lbZPDGBTamYkvCFCWZoofCtpGhU9/54pOwlAPsmO27IzrBil5wftR8DMUJq3i/+tkHqFWJDaCZ1VgYG23tNMY3GoN7lsKVvsADb5ckEbFJbU282uG+wZTtlwoW/wvO4TwgWAmZVAhrrzyVJBT3s3k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=inNDimNn; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="inNDimNn" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746867; x=1822282867; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pbFuUbGzpIZoG5uC6Tm5ggE5txSjxZHHrdMa2QBn85c=; b=inNDimNnPrWwEv8swZ03nw4TWAJHyLlQO7uq/FOGlVEOpwMmJo+rLoGK ZYyH/0UT0stWg+o2sVXnlxiIlshmKU3MBvL/exCdR25TfLfwYcYb6SB1J zpbAIFCXWcY5GsGKB4uqyA4wJ/r7avWs5rt3nvG37GrjX52eoGysmc5ZO pLjBE2MMZ4Ng03FlSNRb+zWM/HYsnAf6aDT09U0z5H/4rgWsHliQlzyYE QjudRQGeSfhmjVcz14UZz1cE9qjQgo8w6vQnY6pGyYhdGneOxfaizcXhM mkXPbKZFTXDHkuGw1ChYaOI07XnX383c3kTp3mqf/07y2GbxtP95+g8W/ A==; X-CSE-ConnectionGUID: V09lzrVrRIOBfN6QMnAoaA== X-CSE-MsgGUID: Vd1L2g1sSsexfsMPnpoeUA== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149089" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149089" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:00 -0700 X-CSE-ConnectionGUID: Cov5FLUhSaSj+fs3XhCVxw== X-CSE-MsgGUID: 7yb5u6H+QRmCbIVyX7M8wg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936399" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:00 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 03/10] x86/virt/tdx: Convert the features metadata reader Date: Tue, 29 Sep 2026 22:38:37 -0700 Message-ID: <20260930053901.22528-4-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Continue converting the metadata readers to the table-driven helper. Add a table that pairs each field ID with the 'struct tdx_sys_info_features' member that holds its value, and read all fields by walking that table. Even though the structure has only one field, add a table anyway for symmetry with the other classes. Adding a field later then becomes a one-line change. Annotate the table as __initconst as it is referenced only during init. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- arch/x86/virt/vmx/tdx/tdx.c | 7 +++++++ arch/x86/virt/vmx/tdx/tdx.h | 3 +++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 13 +------------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 9d8a55a5da31..c78bb3be6303 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -443,6 +443,13 @@ static const struct field_mapping version_mappings[] = =3D { TDX_SYSINFO_MAP_VERSION(TDX_FIELD_UPDATE_VERSION, update_version), }; =20 +#define TDX_SYSINFO_MAP_FEATURES(_field_id, _member) \ + TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_features, _member) + +static const struct field_mapping feature_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_FEATURES(TDX_FIELD_TDX_FEATURES0, tdx_features0), +}; + #include "tdx_global_metadata.c" =20 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 10cbc2d77a5a..87e055a2546c 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -62,6 +62,9 @@ #define TDX_FIELD_MAJOR_VERSION 0x0800000100000004ULL #define TDX_FIELD_UPDATE_VERSION 0x0800000100000005ULL =20 +/* Class "TDX Module Info" */ +#define TDX_FIELD_TDX_FEATURES0 0x0A00000300000008ULL + /* 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/vm= x/tdx/tdx_global_metadata.c index c55674cd4ce6..3996af787ff8 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,17 +7,6 @@ * Include this file to other C file instead. */ =20 -static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *= sysinfo_features) -{ - int ret =3D 0; - u64 val; - - if (!ret && !(ret =3D read_sys_metadata_field(0x0A00000300000008, &val))) - sysinfo_features->tdx_features0 =3D val; - - return ret; -} - static __init int get_tdx_sys_info_tdmr_dpamt(struct tdx_sys_info_tdmr *sy= sinfo_tdmr) { int ret; @@ -121,7 +110,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info = *sysinfo) sysinfo->version.minor_version, sysinfo->version.update_version); =20 - ret =3D ret ?: get_tdx_sys_info_features(&sysinfo->features); + ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); ret =3D ret ?: get_tdx_sys_info_tdmr(&sysinfo->tdmr); ret =3D ret ?: get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C8EC3B47D9; Wed, 30 Sep 2026 05:41:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746869; cv=none; b=JHCS84Bva0QEg0u+OqhyXUepPr3ANfSeV2CSXnb7bRZpP9KBvPCg83HbaG5kFRIQX0xq2iHIVgkzX6sV/dyPHVeGATP97kzQHRkd/LJ68Q7MVXd9LmKXpgSnD76Rzddi0D1xF5I6NYsAJxFq7M/f6lLp4DOEzbDn+k7bVhcKhAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746869; c=relaxed/simple; bh=SdQqq/oRL4CEYqQuixCNqv+VHen61iBhlGgfKJxYsKE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uPglOli1r2vkL35z4XNVcFMu74onpOp+Sx+3hFap4ISXZ1HD7idMORQST3HylaiQdtyRt4bgHL69U5HvPJmYEuBmng6rBjh3pLrMrRbFrIZTZuwX+3jK8qyjQfZ7r2xEfnXQ8Pnwf1k5n3iXQRdUy0E/DNod2NkIBraYjA0oUdo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=EzhNYH6y; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="EzhNYH6y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746867; x=1822282867; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=SdQqq/oRL4CEYqQuixCNqv+VHen61iBhlGgfKJxYsKE=; b=EzhNYH6yG19TwtPPRgqcJM9UU5TWvCNLwLMpptJ8WMdFThbOBg8si/gP dkMRKhUGlLDoPLLRutcp9sOVgdRF12N0O4AYHB4rnCexnfCHXvU3cmenO pWXHZamuRnbJ+JlWsWPnZVbSOpnuoXxYVz/ugX9+Y2Lvd7CdseJArUypA xxSCO/O+1Lrc119TKfQe04s95Ghe8TBDBONo2LZ0Kca9i9lScDAA8VCHF 9GAd7t2qg6MaSEaa2Z5HfZVVtF9MLm0/hQu8VHh24IPTE7kfoM5EAgdoP QWq5RkS++IjVojO8khQB/jTt+bq4rabiLXt22x9MkRR3FIiYMyFki6Sv5 g==; X-CSE-ConnectionGUID: ZzHFE4TVQoetdvmem5C5Gg== X-CSE-MsgGUID: SFvca1y9RSiFkbAQKgKh2A== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149096" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149096" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:01 -0700 X-CSE-ConnectionGUID: SlQ+8CupS9eQy8BTLL3yFA== X-CSE-MsgGUID: pyHwcwGQTWi6gsvtqMIYpw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936405" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:00 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 04/10] x86/virt/tdx: Convert the tdmr metadata reader Date: Tue, 29 Sep 2026 22:38:38 -0700 Message-ID: <20260930053901.22528-5-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Continue converting the metadata readers to the table-driven helper. The "TDMR info" metadata class has two readers: one for the fields that are always present, and one for the fields that exist only when the module supports Dynamic PAMT. Add a table for each, both pairing field IDs with the 'struct tdx_sys_info_tdmr' members that hold their values, and read all fields by walking the tables. Annotate both tables as __initconst since they are referenced only during init. AI was used under supervision to review the code and workshop the changelog. Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- arch/x86/virt/vmx/tdx/tdx.c | 16 ++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 8 +++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 35 ++------------------- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index c78bb3be6303..24d22d8a2016 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -450,6 +450,22 @@ static const struct field_mapping feature_mappings[] _= _initconst =3D { TDX_SYSINFO_MAP_FEATURES(TDX_FIELD_TDX_FEATURES0, tdx_features0), }; =20 +#define TDX_SYSINFO_MAP_TDMR(_field_id, _member) \ + TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_tdmr, _member) + +static const struct field_mapping tdmr_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_MAX_TDMRS, max_tdmrs), + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_MAX_RESERVED_PER_TDMR, max_reserved_per_td= mr), + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_PAMT_4K_ENTRY_SIZE, pamt_4k_entry_size), + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_PAMT_2M_ENTRY_SIZE, pamt_2m_entry_size), + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_PAMT_1G_ENTRY_SIZE, pamt_1g_entry_size), +}; + +static const struct field_mapping dpamt_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_TDMR(TDX_FIELD_PAMT_PAGE_BITMAP_ENTRY_BITS, + pamt_page_bitmap_entry_bits), +}; + #include "tdx_global_metadata.c" =20 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 87e055a2546c..4faf07925dc0 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -65,6 +65,14 @@ /* Class "TDX Module Info" */ #define TDX_FIELD_TDX_FEATURES0 0x0A00000300000008ULL =20 +/* Class "TDMR Info" */ +#define TDX_FIELD_MAX_TDMRS 0x9100000100000008ULL +#define TDX_FIELD_MAX_RESERVED_PER_TDMR 0x9100000100000009ULL +#define TDX_FIELD_PAMT_4K_ENTRY_SIZE 0x9100000100000010ULL +#define TDX_FIELD_PAMT_2M_ENTRY_SIZE 0x9100000100000011ULL +#define TDX_FIELD_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL +#define TDX_FIELD_PAMT_PAGE_BITMAP_ENTRY_BITS 0x9100000000000013ULL + /* 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/vm= x/tdx/tdx_global_metadata.c index 3996af787ff8..870caac6a585 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,37 +7,6 @@ * Include this file to other C file instead. */ =20 -static __init int get_tdx_sys_info_tdmr_dpamt(struct tdx_sys_info_tdmr *sy= sinfo_tdmr) -{ - int ret; - u64 val; - - ret =3D read_sys_metadata_field(0x9100000000000013, &val); - if (!ret) - sysinfo_tdmr->pamt_page_bitmap_entry_bits =3D val; - - return ret; -} - -static __init int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *sysinfo_= tdmr) -{ - int ret =3D 0; - u64 val; - - if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000008, &val))) - sysinfo_tdmr->max_tdmrs =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000009, &val))) - sysinfo_tdmr->max_reserved_per_tdmr =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000010, &val))) - sysinfo_tdmr->pamt_4k_entry_size =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000011, &val))) - sysinfo_tdmr->pamt_2m_entry_size =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000012, &val))) - sysinfo_tdmr->pamt_1g_entry_size =3D val; - - return ret; -} - static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sy= sinfo_td_ctrl) { int ret =3D 0; @@ -111,7 +80,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *= sysinfo) sysinfo->version.update_version); =20 ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); - ret =3D ret ?: get_tdx_sys_info_tdmr(&sysinfo->tdmr); + ret =3D ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); ret =3D ret ?: get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); =20 @@ -122,7 +91,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *= sysinfo) * DPAMT but don't expose the metadata. */ if (!ret && tdx_supports_dynamic_pamt(sysinfo)) - ret =3D get_tdx_sys_info_tdmr_dpamt(&sysinfo->tdmr); + ret =3D read_sys_metadata_table(dpamt_mappings, &sysinfo->tdmr); =20 return ret; } --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C0CB3B4417; Wed, 30 Sep 2026 05:41:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746885; cv=none; b=u9slOcLxKjf0R5MQGpMIZjTA4yuG80Xi9W0TcaZmk+gKOK+N2Fn7MRcTbmTdDKpTC4NsafXhveMZ6UPhYFz/elNnG14H7qkz1plcfPK6fi+yefhe2y15WXohwIueCNkY0HI9xMd6IbIWDO5sZjdo6Jt4G4+C1Fi5aQryzfQ1iCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746885; c=relaxed/simple; bh=6OfOeZTYIqTvp1O/Xj2Yc9QGbBOJ8BpQDtW4XYGACoA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZuMHutcCgj6h8B9Ko5HYAp/QOlRGf/bA2NR5uVt5h9dSCqU+rjC1McHRMAEWBddsdKxeDYfV0De9zyWig3peaH3DQjINgjMyiiK/bDA3gY1+0/AWN4IvbSdYf9/h4AqewELFQxkmeWBz9oNB+2iTgjx+jfkc5W3GnMv5cCGHGQM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=h/UZXIl/; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="h/UZXIl/" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746883; x=1822282883; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6OfOeZTYIqTvp1O/Xj2Yc9QGbBOJ8BpQDtW4XYGACoA=; b=h/UZXIl/LE2sh0QAPlWr7MMtYT07TPA9+KFV+z5b4wcia6/WuRB21oTY QqMgEOjbL5meyZcnx/vZ8bC2bF4eOr1HNwD6z1dxv7XlGFvsr4CgNBfCo EOUit8OPMWGHHuRWD+tCXWfauPgnk9jr5fOz26Ol8F5xAvSCD0TAci3Bx xaiZ+fPn+t+NOUzziu7KKAxHjfecFxhYRvGCdwGLI58asUfXHGP7MkDUc aRgFUqjAESXDOUpyOFaPS6pEWlcFejwT717BgF6sm2/zNVyJJE2zhD4mv J02pfeZHvmk3pPDd+b8SSOKrMJ2H12+ZZ+FdGI2aBjrJzBXT8NrQhDgoZ w==; X-CSE-ConnectionGUID: aYl+iaJDRUeche0oW4YFVA== X-CSE-MsgGUID: TJfEujflSWCJ2bS/Dwoufg== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149103" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149103" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:02 -0700 X-CSE-ConnectionGUID: 8PdCllWvRyegD2kOQEghdQ== X-CSE-MsgGUID: UWfrV5aVTNiAQJiYt4bB5Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936412" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:01 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 05/10] x86/virt/tdx: Convert the td_ctrl metadata reader Date: Tue, 29 Sep 2026 22:38:39 -0700 Message-ID: <20260930053901.22528-6-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Continue converting the metadata readers to the table-driven helper. Add a table that pairs each field ID with the 'struct tdx_sys_info_td_ctrl' member that holds its value, and read all fields by walking that table. Annotate the table as __initconst as it is referenced only during init. AI was used under supervision to review code and workshop logs Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- arch/x86/virt/vmx/tdx/tdx.c | 9 +++++++++ arch/x86/virt/vmx/tdx/tdx.h | 5 +++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 17 +---------------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 24d22d8a2016..af4cafdd4c4e 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -466,6 +466,15 @@ static const struct field_mapping dpamt_mappings[] __i= nitconst =3D { pamt_page_bitmap_entry_bits), }; =20 +#define TDX_SYSINFO_MAP_TD_CTRL(_field_id, _member) \ + TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_td_ctrl, _member) + +static const struct field_mapping td_ctrl_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_TD_CTRL(TDX_FIELD_TDR_BASE_SIZE, tdr_base_size), + TDX_SYSINFO_MAP_TD_CTRL(TDX_FIELD_TDCS_BASE_SIZE, tdcs_base_size), + TDX_SYSINFO_MAP_TD_CTRL(TDX_FIELD_TDVPS_BASE_SIZE, tdvps_base_size), +}; + #include "tdx_global_metadata.c" =20 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 4faf07925dc0..8bd8928c1802 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -73,6 +73,11 @@ #define TDX_FIELD_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL #define TDX_FIELD_PAMT_PAGE_BITMAP_ENTRY_BITS 0x9100000000000013ULL =20 +/* Class "TD Control Structures" */ +#define TDX_FIELD_TDR_BASE_SIZE 0x9800000100000000ULL +#define TDX_FIELD_TDCS_BASE_SIZE 0x9800000100000100ULL +#define TDX_FIELD_TDVPS_BASE_SIZE 0x9800000100000200ULL + /* 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/vm= x/tdx/tdx_global_metadata.c index 870caac6a585..30834ecdccab 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,21 +7,6 @@ * Include this file to other C file instead. */ =20 -static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *sy= sinfo_td_ctrl) -{ - int ret =3D 0; - u64 val; - - if (!ret && !(ret =3D read_sys_metadata_field(0x9800000100000000, &val))) - sysinfo_td_ctrl->tdr_base_size =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9800000100000100, &val))) - sysinfo_td_ctrl->tdcs_base_size =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9800000100000200, &val))) - sysinfo_td_ctrl->tdvps_base_size =3D val; - - return ret; -} - static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sy= sinfo_td_conf) { int ret =3D 0; @@ -81,7 +66,7 @@ static __init int get_tdx_sys_info(struct tdx_sys_info *s= ysinfo) =20 ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); ret =3D ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); - ret =3D ret ?: get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); + ret =3D ret ?: read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctr= l); ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); =20 /* --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4318A3B6BEB; Wed, 30 Sep 2026 05:41:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746876; cv=none; b=HLDMQFJF/34+cv/yej9CtcIOqFnpxDfpKDZyDHiSmQXvJsKpqi3z7nwzLi2f9sidbQ5pUEGypT+GeGpUvCkcXaOoXUlLSRzdkH7HBWFhGdRoZpTyz2EaMRawEq++u9tEoBfd0yrvxoZmm6Tzzxa7KSWDgZAknoVEfAf951RikKQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746876; c=relaxed/simple; bh=akLzHqg0jwPSwxruy5P8AaBz/uOKDnUCRgnL9ASsJjU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eoAEvTqFFahYKSe53Oi2lMUn4AXfHST/i2VSbZodCJUYmahaBPhz6yC+iYsA8xQ3A5i01ymklr6rPx7L4ZAJrErNbM6so614db1HINe8MkqfDBEK1yEz2MmnEFy03H75zTsneEFPqa7Drlw0dr+VxEOLc5urQ7iXs51bnYUOMX0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=McnGAMa2; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="McnGAMa2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746868; x=1822282868; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=akLzHqg0jwPSwxruy5P8AaBz/uOKDnUCRgnL9ASsJjU=; b=McnGAMa2Jh10ZwAy46LN523F+Jc7kXheViecMuQWQ42MeA9/HJbKyxiv EYrl0EbuCFauEVGIHAPM3949xMEM+6A6sR80mVN2DYz5l2B3Nm6//Dqdh 4qGDOyXDOkC07lhug6U0oGl89Gn9XXVNdI1R6kszzAjvkpY3y78LkAgiH f+7EUILnUeJqHcIHwiMEYJYeLu4Whx/O1JjO0TqtUFUuzDWEeIDUjP/h7 cRx7bMiGA3OksHBP3t7IysgZYYV22VZf6oOwA3ylXYuFOvhdzTqnZWwgZ AU/U3NpW2vMlKP9Uha0c4LEtU0/eUK4JfPRiZH5JYmJkeiGNv1MmJglJ9 A==; X-CSE-ConnectionGUID: Hkcqr4TgSV+PrXXZvFZTNQ== X-CSE-MsgGUID: vgtbu7eMRfai8rEV3DuZbw== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149109" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149109" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:02 -0700 X-CSE-ConnectionGUID: BY9cx4ewRamOo4z9w9TGug== X-CSE-MsgGUID: BYtNGbj3TM2eAQxG4Wk3qA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936416" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:02 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 06/10] x86/virt/tdx: Convert the handoff metadata reader Date: Tue, 29 Sep 2026 22:38:40 -0700 Message-ID: <20260930053901.22528-7-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Rick Edgecombe --- arch/x86/virt/vmx/tdx/tdx.c | 9 ++++++++- arch/x86/virt/vmx/tdx/tdx.h | 3 +++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 13 ------------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index af4cafdd4c4e..79561312ebfd 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -475,6 +475,13 @@ static const struct field_mapping td_ctrl_mappings[] _= _initconst =3D { TDX_SYSINFO_MAP_TD_CTRL(TDX_FIELD_TDVPS_BASE_SIZE, tdvps_base_size), }; =20 +#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[] =3D { + TDX_SYSINFO_MAP_HANDOFF(TDX_FIELD_MODULE_HV, module_hv), +}; + #include "tdx_global_metadata.c" =20 static __init int check_features(struct tdx_sys_info *sysinfo) @@ -1402,7 +1409,7 @@ int tdx_module_shutdown(void) int ret; int cpu; =20 - ret =3D get_tdx_sys_info_handoff(&handoff); + ret =3D read_sys_metadata_table(handoff_mappings, &handoff); /* * Handoff information is required for proper * shutdown. Refuse to shut down without it. diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index 8bd8928c1802..720e301f599e 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -78,6 +78,9 @@ #define TDX_FIELD_TDCS_BASE_SIZE 0x9800000100000100ULL #define TDX_FIELD_TDVPS_BASE_SIZE 0x9800000100000200ULL =20 +/* Class "TDX Module Handoff" */ +#define TDX_FIELD_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/vm= x/tdx/tdx_global_metadata.c index 30834ecdccab..8ca1cdcf55fe 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_sy= s_info_td_conf *sysinfo_ return ret; } =20 -static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *sysinfo_h= andoff) -{ - int ret; - u64 val; - - ret =3D read_sys_metadata_field(0x8900000100000000, &val); - if (ret) - return ret; - - sysinfo_handoff->module_hv =3D val; - return 0; -} - static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { int ret =3D 0; --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2880F3B83FE; Wed, 30 Sep 2026 05:41:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746882; cv=none; b=AM8wt/rq5o+TFXbyW6eBqhsLzihmMl0VGqZZgjWXtMujq2qXiT/9BeYK0rymQ424W11SYq+plm5KVMsZRfObuO5fJnhAETLguFNN4QkXjCI/lIPpQFGSLQRfex8vcD3qquYW3L7hVXbccoUqJlM+t851TEk9SkPOh0QlHsLprBM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746882; c=relaxed/simple; bh=q2v/osZjxi7h32nT5ySFdmZTRBLTsBcuuYUKbmbhATU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TiKz2F0z1g4vtIKagtwh/P6Z/8hPvxGwDfSoINkXv3kRQCsdv7bZ3W1MPd9kuuJWYuUoJYuznX0kXzFcYkSG+MemoQMMKhptIohljiYIF3xLXT2L0T7lsctERRINuhryPr3rmGq4umaaSue0kJMTI4NbFhnJyg6jDYdw+1xSAdQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=DKHJ4IKP; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="DKHJ4IKP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746869; x=1822282869; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=q2v/osZjxi7h32nT5ySFdmZTRBLTsBcuuYUKbmbhATU=; b=DKHJ4IKPWSLV9SwzjPI8r6kg081Ca4Ff69MHQI+KJFkaoTW5DpRPrvdW Wnlxk5PoWXPqnQjufKSxoNoaSmA4Q1GwryeyUKw4mf6z1zFXuvjG8I/wz n1X7CnS+ha/UgKV4VuCg6piIeRyvp6l1g/MrN9gax0TBte73sb3iH/i9K 82WLijFiH+Jfh1wdktlpODl+b1+AEPxXzIy00wAxf0TKa741gWPjVimLu CwBj+PfcD1f5HTxFYnGD3MDfxjb4ueXWm9bhAadV7nVbTWJKn8PhOVaKm uosSmYpKXwpVPfesOwJ+7QDv+Gbx1Szn2ppoWk//4U5P0P//lfNvAnPRm g==; X-CSE-ConnectionGUID: 7kncwOpdSFeAVvvmvEmWMg== X-CSE-MsgGUID: sRyqqCh7Rz6LgY/NeUBHhQ== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149118" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149118" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:04 -0700 X-CSE-ConnectionGUID: rTHVA477QA2a+VTuizz+pA== X-CSE-MsgGUID: L9jQM28ORv2jPBKaKI9RmQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936423" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:03 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 07/10] x86/virt/tdx: Convert the td_conf metadata reader Date: Tue, 29 Sep 2026 22:38:41 -0700 Message-ID: <20260930053901.22528-8-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Continue converting the metadata readers to the table-driven helper. The "TD Configurability" class holds several scalar fields plus two CPUID arrays. The arrays have a fixed capacity, but the number of entries to read is variable and reported by the num_cpuid_config scalar field. Add a table that pairs each scalar field ID with the 'struct tdx_sys_info_td_conf' member that holds its value, and read those fields by walking that table. Annotate the table as __initconst as it is referenced only during init. Leave the two arrays open coded. 'struct field_mapping' pairs one field ID with one structure member, so describing an array would require a field ID per element plus an entry count that is unknown until num_cpuid_config has been read. That is not worth building for the only two arrays the kernel reads. Read the arrays with explicit loops as the generated code did, but store each value directly into its array member instead of into a temporary u64 first. The members are u64 already, so the extra copies serve no purpose. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao --- v3: - Reword the comment above the CPUID loops --- arch/x86/virt/vmx/tdx/tdx.c | 53 +++++++++++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 10 ++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 33 ------------- 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 79561312ebfd..e821ab76a140 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -482,6 +482,59 @@ static const struct field_mapping handoff_mappings[] = =3D { TDX_SYSINFO_MAP_HANDOFF(TDX_FIELD_MODULE_HV, module_hv), }; =20 +#define TDX_SYSINFO_MAP_TD_CONF(_field_id, _member) \ + TDX_SYSINFO_MAP(_field_id, struct tdx_sys_info_td_conf, _member) + +static const struct field_mapping td_conf_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_ATTRIBUTES_FIXED0, attributes_fixed0), + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_ATTRIBUTES_FIXED1, attributes_fixed1), + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_XFAM_FIXED0, xfam_fixed0), + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_XFAM_FIXED1, xfam_fixed1), + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_NUM_CPUID_CONFIG, num_cpuid_config), + TDX_SYSINFO_MAP_TD_CONF(TDX_FIELD_MAX_VCPUS_PER_TD, max_vcpus_per_td), +}; + +static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *td= _conf) +{ + int ret, i, j; + + ret =3D read_sys_metadata_table(td_conf_mappings, td_conf); + if (ret) + return ret; + + /* + * The number of CPUID config entries must not exceed the array + * sizes. + */ + if (td_conf->num_cpuid_config > ARRAY_SIZE(td_conf->cpuid_config_leaves) = || + td_conf->num_cpuid_config > ARRAY_SIZE(td_conf->cpuid_config_values)) + return -EINVAL; + + /* + * TDX_FIELD_CPUID_CONFIG_LEAVES and TDX_FIELD_CPUID_CONFIG_VALUES + * give the field ID of each array's first element. The remaining + * elements follow consecutively, in the order they appear in the + * structure. + */ + for (i =3D 0; i < td_conf->num_cpuid_config; i++) { + ret =3D read_sys_metadata_field(TDX_FIELD_CPUID_CONFIG_LEAVES + i, + &td_conf->cpuid_config_leaves[i]); + if (ret) + return ret; + + /* Each config has two u64s of CPUID values. */ + for (j =3D 0; j < 2; j++) { + ret =3D read_sys_metadata_field( + TDX_FIELD_CPUID_CONFIG_VALUES + i * 2 + j, + &td_conf->cpuid_config_values[i][j]); + if (ret) + return ret; + } + } + + return 0; +} + #include "tdx_global_metadata.c" =20 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 720e301f599e..e41fc5e4925e 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -78,6 +78,16 @@ #define TDX_FIELD_TDCS_BASE_SIZE 0x9800000100000100ULL #define TDX_FIELD_TDVPS_BASE_SIZE 0x9800000100000200ULL =20 +/* Class "TD Configurability" */ +#define TDX_FIELD_ATTRIBUTES_FIXED0 0x1900000300000000ULL +#define TDX_FIELD_ATTRIBUTES_FIXED1 0x1900000300000001ULL +#define TDX_FIELD_XFAM_FIXED0 0x1900000300000002ULL +#define TDX_FIELD_XFAM_FIXED1 0x1900000300000003ULL +#define TDX_FIELD_NUM_CPUID_CONFIG 0x9900000100000004ULL +#define TDX_FIELD_MAX_VCPUS_PER_TD 0x9900000100000008ULL +#define TDX_FIELD_CPUID_CONFIG_LEAVES 0x9900000300000400ULL +#define TDX_FIELD_CPUID_CONFIG_VALUES 0x9900000300000500ULL + /* Class "TDX Module Handoff" */ #define TDX_FIELD_MODULE_HV 0x8900000100000000ULL =20 diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vm= x/tdx/tdx_global_metadata.c index 8ca1cdcf55fe..f248c962fd5d 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -7,39 +7,6 @@ * Include this file to other C file instead. */ =20 -static __init int get_tdx_sys_info_td_conf(struct tdx_sys_info_td_conf *sy= sinfo_td_conf) -{ - int ret =3D 0; - u64 val; - int i, j; - - if (!ret && !(ret =3D read_sys_metadata_field(0x1900000300000000, &val))) - sysinfo_td_conf->attributes_fixed0 =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x1900000300000001, &val))) - sysinfo_td_conf->attributes_fixed1 =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x1900000300000002, &val))) - sysinfo_td_conf->xfam_fixed0 =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x1900000300000003, &val))) - sysinfo_td_conf->xfam_fixed1 =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9900000100000004, &val))) - sysinfo_td_conf->num_cpuid_config =3D val; - if (!ret && !(ret =3D read_sys_metadata_field(0x9900000100000008, &val))) - sysinfo_td_conf->max_vcpus_per_td =3D val; - if (sysinfo_td_conf->num_cpuid_config > ARRAY_SIZE(sysinfo_td_conf->cpuid= _config_leaves)) - return -EINVAL; - for (i =3D 0; i < sysinfo_td_conf->num_cpuid_config; i++) - if (!ret && !(ret =3D read_sys_metadata_field(0x9900000300000400 + i, &v= al))) - sysinfo_td_conf->cpuid_config_leaves[i] =3D val; - if (sysinfo_td_conf->num_cpuid_config > ARRAY_SIZE(sysinfo_td_conf->cpuid= _config_values)) - return -EINVAL; - for (i =3D 0; i < sysinfo_td_conf->num_cpuid_config; i++) - for (j =3D 0; j < 2; j++) - if (!ret && !(ret =3D read_sys_metadata_field(0x9900000300000500 + i * = 2 + j, &val))) - sysinfo_td_conf->cpuid_config_values[i][j] =3D val; - - return ret; -} - static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { int ret =3D 0; --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFE243B42D7; Wed, 30 Sep 2026 05:41:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746884; cv=none; b=pIhxfVAr0I+JY7uB9uJRHtx07iD8ash0sLkFi/lBofTzxOcPthtG/dOFL7cHnXSszlnP5aB9mVn+Eoowob9MQYTSyiWHcGGMWHH0AS9v648F2bJP3DPEu78u5sJxUy7vplFvBBtA23m2UkeY7cD3inEhr7Spk0o4JUgmCp9IIMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746884; c=relaxed/simple; bh=cwDtfRYsdH3jMKIPH+Tp4JIlHXZp7wg/7Z6hCNh+7Kc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oqrvxVgR+Wi5f+O7L68u4UPaa3CPqL7k4AhKMqVQThlA49XJKNXH2QEAQ1iobolMtN0MYiZvUVCygfVxhiTPZkh3n4bM+WhlrbrkpfbA4cin2DqfP2shARMZbWzT/6d4a8RV3iazGmewWbOgZ/GbxG8j6sK9AFkHUjW4Z6KOTT0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NyuXyGOd; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NyuXyGOd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746880; x=1822282880; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cwDtfRYsdH3jMKIPH+Tp4JIlHXZp7wg/7Z6hCNh+7Kc=; b=NyuXyGOd8dh3CzsH4P42dMMsV9grmKeiV8KON38TX30a8mSIHO+/NbqK Wlx4LV9jzNlZe3AUqkqC95kJDBUIwDKBAqS1tkBSRS4jbV+VbUZOZW1L7 PbvcTXKkaeuH+E4xmfvhvRzkT9dOIy58NAtHh/imd2jt4v/UQZ7sTKSZd VkkaLAAOi20XAxsYrAFlE3+8W/CGsV8Ix2PfV3g8LnZ4UzXBdMkicQCDZ 6PXss4JuIYa3W2QjcfTWZtUKx6UBbBVLK+RORDe3bSxs+hPKH6A66bsdI u6nwcQFFRQpM50x+z7gcCfJwN9G01nru9z9q1Mar+8khW6VEVDYeBSlR7 w==; X-CSE-ConnectionGUID: Q6SM1KuQQ8C/yo8YxA6zaA== X-CSE-MsgGUID: 6mwpZCzNTneR9VajHedwUg== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149126" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149126" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:04 -0700 X-CSE-ConnectionGUID: sTTmDoFFSFm3PXWEnU4rgg== X-CSE-MsgGUID: cmN4yuJITgKcc2C4nAizeg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936430" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:03 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Rick Edgecombe , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau Subject: [PATCH v3 08/10] x86/virt/tdx: Remove tdx_global_metadata.c Date: Tue, 29 Sep 2026 22:38:42 -0700 Message-ID: <20260930053901.22528-9-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" tdx_global_metadata.c held the script-generated metadata readers, deliberately kept in their own file so that generated code stayed separate from hand-written code. It cannot be compiled on its own because it lacks the low-level SEAMCALL wrappers, so tdx.c #includes it directly. Including one C file into another is unusual, and now that the readers are maintained by hand there is nothing left to isolate. get_tdx_sys_info() is the only function still in the file. Move get_tdx_sys_info() verbatim into tdx.c and delete tdx_global_metadata.c along with its #include. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- arch/x86/virt/vmx/tdx/tdx.c | 28 +++++++++++++++- arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 36 --------------------- 2 files changed, 27 insertions(+), 37 deletions(-) delete mode 100644 arch/x86/virt/vmx/tdx/tdx_global_metadata.c diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index e821ab76a140..1a69beb62ec2 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -535,7 +535,33 @@ static __init int get_tdx_sys_info_td_conf(struct tdx_= sys_info_td_conf *td_conf) return 0; } =20 -#include "tdx_global_metadata.c" +static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) +{ + int ret =3D 0; + + ret =3D ret ?: read_sys_metadata_table(version_mappings, &sysinfo->versio= n); + + pr_info("Module version: " TDX_VERSION_FMT "\n", + sysinfo->version.major_version, + sysinfo->version.minor_version, + sysinfo->version.update_version); + + ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); + ret =3D ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); + ret =3D ret ?: read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctr= l); + ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); + + /* + * The kernel supports using TDX without DPAMT, so + * avoid reporting failure if it's not supported. Don't + * try to support buggy TDX modules that advertise + * DPAMT but don't expose the metadata. + */ + if (!ret && tdx_supports_dynamic_pamt(sysinfo)) + ret =3D read_sys_metadata_table(dpamt_mappings, &sysinfo->tdmr); + + return ret; +} =20 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/vm= x/tdx/tdx_global_metadata.c deleted file mode 100644 index f248c962fd5d..000000000000 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Functions to read TDX global metadata. - * - * This file doesn't compile on its own as it lacks of inclusion - * of SEAMCALL wrapper primitive which reads global metadata. - * Include this file to other C file instead. - */ - -static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) -{ - int ret =3D 0; - - ret =3D ret ?: read_sys_metadata_table(version_mappings, &sysinfo->versio= n); - - pr_info("Module version: " TDX_VERSION_FMT "\n", - sysinfo->version.major_version, - sysinfo->version.minor_version, - sysinfo->version.update_version); - - ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); - ret =3D ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); - ret =3D ret ?: read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctr= l); - ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); - - /* - * The kernel supports using TDX without DPAMT, so - * avoid reporting failure if it's not supported. Don't - * try to support buggy TDX modules that advertise - * DPAMT but don't expose the metadata. - */ - if (!ret && tdx_supports_dynamic_pamt(sysinfo)) - ret =3D read_sys_metadata_table(dpamt_mappings, &sysinfo->tdmr); - - return ret; -} --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E66013B5318; Wed, 30 Sep 2026 05:41:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746882; cv=none; b=cb0kXATNWyzMP4iL4UbJCRYe/EvGYqHd1A438D+eUssyaFmLlNKDRagTwAhYTlZdWMn+ogmw1EVfmaTfVHHZkLvQn3HAJKe/USHFwtWm1/n10CjtQjUvDRavX8FRV1AQeugkznNzZ45diUmnP0uorQoKeH6tCTFGVW4JQQ9+4jE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746882; c=relaxed/simple; bh=xrHwoJOfZBklJb6DwE80ancRVkpnUAPyNXCgdD8wRIg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jDD1/nOXQWxhAfER63hcGwNGNvPGpHsRc7+4OQO9RIjczqhDk2Kydk4Jr9erCVed6I9abhbT3gbZpQFWkVK8S6/HWs3A7s+1w/y3KMQPfZe38bhRE7yXm7X2OAIsXN9YlojBzhUe4UzO9jTJxB8JmhDLPXVeeOU22quhB5xJhYQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=DVAGkefY; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="DVAGkefY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746878; x=1822282878; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=xrHwoJOfZBklJb6DwE80ancRVkpnUAPyNXCgdD8wRIg=; b=DVAGkefYZCo28Og1O/NMnM8v7f5yMwlurnl/GGF4Nwfl7BDzwqG9bK9v f1rDxhCSrYNFleUr5d0yIJDaOMPBtSWk6+UpatdRklsOBp7/1PBEBkEys eS24lWl+EVF0AtEJg/LYT8/7BNPY7gwpj9L5O86x4vqxfZcMXEY2qSWWk Z1n3aMAul4deGlQvzcSL85VZixyVQt+oI/c3+t8t/o34uH/H9He/xXhAD IhJPp4Vt7gjze1w0eABH5AONRNoXR+eYMMe8Aq7s3TsCv6tlNiG0njd5l fdEFnh2nu18JzPrpSS1zUoGEt0/EsI7M0YdlnVjHg4VLQzK707ipb67JZ Q==; X-CSE-ConnectionGUID: ca6Yq6HNTkW0z6womiHkvA== X-CSE-MsgGUID: dXgmb8IHSsyRhGSwYsgGTg== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149138" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149138" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:05 -0700 X-CSE-ConnectionGUID: BKl12byaRDm98IsW1h0sxA== X-CSE-MsgGUID: 5CIFEh0KQLWWQRQfRZQzBA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936435" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:04 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 09/10] x86/virt/tdx: Use early returns in get_tdx_sys_info() Date: Tue, 29 Sep 2026 22:38:43 -0700 Message-ID: <20260930053901.22528-10-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" get_tdx_sys_info() was generated by a script. It chains its metadata reads with: ret =3D ret ?: get_tdx_sys_info_foo(...); The function is maintained by hand now. Use conventional early returns instead. Print the module version only after its metadata has been read successfully. The "ret ?:" chain had no early exit, so the pr_info() between the reads ran even when the version read itself failed, printing a partially read or all-zero version. That isn't considered a big problem, but early returns make it easy to avoid. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao Reviewed-by: Rick Edgecombe --- v3: - Print the module version only after reading its metadata succeeds [Rick] --- arch/x86/virt/vmx/tdx/tdx.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 1a69beb62ec2..e7d4fc3f350f 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -537,19 +537,32 @@ static __init int get_tdx_sys_info_td_conf(struct tdx= _sys_info_td_conf *td_conf) =20 static __init int get_tdx_sys_info(struct tdx_sys_info *sysinfo) { - int ret =3D 0; + int ret; =20 - ret =3D ret ?: read_sys_metadata_table(version_mappings, &sysinfo->versio= n); + ret =3D read_sys_metadata_table(version_mappings, &sysinfo->version); + if (ret) + return ret; =20 pr_info("Module version: " TDX_VERSION_FMT "\n", sysinfo->version.major_version, sysinfo->version.minor_version, sysinfo->version.update_version); =20 - ret =3D ret ?: read_sys_metadata_table(feature_mappings, &sysinfo->featur= es); - ret =3D ret ?: read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); - ret =3D ret ?: read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctr= l); - ret =3D ret ?: get_tdx_sys_info_td_conf(&sysinfo->td_conf); + ret =3D read_sys_metadata_table(feature_mappings, &sysinfo->features); + if (ret) + return ret; + + ret =3D read_sys_metadata_table(tdmr_mappings, &sysinfo->tdmr); + if (ret) + return ret; + + ret =3D read_sys_metadata_table(td_ctrl_mappings, &sysinfo->td_ctrl); + if (ret) + return ret; + + ret =3D get_tdx_sys_info_td_conf(&sysinfo->td_conf); + if (ret) + return ret; =20 /* * The kernel supports using TDX without DPAMT, so @@ -557,10 +570,13 @@ static __init int get_tdx_sys_info(struct tdx_sys_inf= o *sysinfo) * try to support buggy TDX modules that advertise * DPAMT but don't expose the metadata. */ - if (!ret && tdx_supports_dynamic_pamt(sysinfo)) + if (tdx_supports_dynamic_pamt(sysinfo)) { ret =3D read_sys_metadata_table(dpamt_mappings, &sysinfo->tdmr); + if (ret) + return ret; + } =20 - return ret; + return 0; } =20 static __init int check_features(struct tdx_sys_info *sysinfo) --=20 2.52.0 From nobody Fri Oct 2 06:58:00 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10A563B47C3; Wed, 30 Sep 2026 05:41:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.9 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746885; cv=none; b=aT976lDw4csdCPPVZLvsoNECnXcC3hEjS3hF4dV7UPcoFiHKUcQH9kPeC/l2lRvZ+Zxt+7iCInuaO9I0kMLwn9EgMLG1Q7g1CQazywZsD5/WyQvN8Unqdb5V+f+DX8sHk/FPVxTeDhto+3ah8L0dgQF2t62XrmD9agI4o9dK90c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790746885; c=relaxed/simple; bh=RNrQaJ9ZisYgkrcaPbEnmywd57d4FwQtZ1SfF+5GZi0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PmNUhbZPs7Uy1vvnNPgfTL+thqGiAybYI6nJYh7w62AFXbg2q+/jq1jgHyr5cEol2hr2Q26Q3+cvU7W1roG9vXCiUXUsjLGCe2vk+lv52u6kXkPnu0gxvYmzoxDkQeNpVirwg8QvK3zCQsDaUv+kK/nCAHrGeMG5KvZ8ScDP/DQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=L1X4o3RY; arc=none smtp.client-ip=192.198.163.9 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="L1X4o3RY" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790746883; x=1822282883; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RNrQaJ9ZisYgkrcaPbEnmywd57d4FwQtZ1SfF+5GZi0=; b=L1X4o3RY/kWMUfNPbY3aXt8HYDHY9qIboaG7UTHKnA/slJqRfa20q0Dl LgGZwj5zpHH29LFHkgXI8nVp17CicIGhZcTN0z19RrTmb7bzscbPqNELb yFLlBuyHPd+3K2/hTwTevgpNTHKlZHscNi9026x410E94ago/RX5i2olI dDj3vJMPq20LN21i8ulVcMnvyOi3DENlJbywZufG9feASpkCa5FD5hIRC VfKmvIhArDdFK08AJGpZzHKf/s4GHI97zFbIQscYjzYDeyrXHEwQRfDO3 w00dFuB5BqfOgmWI1mKJth4/JiTgD3tpLEUmak8BQK7G5wCwcQaEIhkdf w==; X-CSE-ConnectionGUID: vFEn5qoXShqi9Bx4Ey3VOw== X-CSE-MsgGUID: HQnwCcrlRXWKB6yTKCdHwg== X-IronPort-AV: E=McAfee;i="6800,10657,11920"; a="102149142" X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="102149142" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:05 -0700 X-CSE-ConnectionGUID: ihpuifHZTAygPoFdymmAsA== X-CSE-MsgGUID: PhQFSmDFRe2rDBtUNiKZTw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,132,1787036400"; d="scan'208";a="278936442" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2026 22:41:04 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: yilun.xu@linux.intel.com, chao.gao@intel.com, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [PATCH v3 10/10] x86/virt/tdx: Verify structure member sizes against metadata field IDs Date: Tue, 29 Sep 2026 22:38:44 -0700 Message-ID: <20260930053901.22528-11-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260930053901.22528-1-chao.gao@intel.com> References: <20260930053901.22528-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The TDX module reports its capabilities and limits as a set of metadata fields, each identified by a field ID, and TDH.SYS.RD reads one field by its ID. TDH.SYS.RD returns the value as a u64, but metadata fields are not all 64 bits wide. A field ID therefore encodes the field's size into bits 33:32. The kernel mirrors these fields in C structures, and each member's size must match the size encoded in the field ID. TDX_SYSINFO_MAP() stores the member size and uses it to decide how many bytes to copy from the value returned by TDH.SYS.RD. The size in the field ID is never consulted, so any mismatch goes unnoticed. Declaring a u32 member for a 64-bit field, for example, would silently store only its low 4 bytes. Add macros to extract the size encoded in a field ID and check it against the member size. The check happens at build time, so it catches a wrongly typed member with no runtime cost. BUILD_BUG_ON() cannot be used in a structure initializer, so use BUILD_BUG_ON_ZERO() and add its zero result to the .size initializer. This performs the build-time check without changing the stored size. An alternative would be to leave the size bits out of the field ID definitions and construct the IDs from the member sizes, which makes a mismatch impossible. But the TDX module ABI definitions list the full field IDs, and definitions with the size bits stripped would match nothing in the docs, making them harder to verify. Keep the IDs exactly as documented and check the size they encode against the C type instead. AI was used under supervision to review code and workshop logs. It suggested extracting TDX_FIELD_SIZE_CHECK() instead of open coding the check in TDX_SYSINFO_MAP(), to keep the .size line from being too long. Signed-off-by: Chao Gao --- v3: - Add background on the size bits encoded in a field ID. [Rick] - Add rationale for checking the size in the field ID instead of building the ID from the member size. [Rick] - Squash TDX_MD_FIELD_ELE_SIZE_CODE() and TDX_MD_FIELD_ELE_SIZE() into a single TDX_FIELD_SIZE(). [Rick] --- arch/x86/virt/vmx/tdx/tdx.c | 12 +++++++++++- arch/x86/virt/vmx/tdx/tdx.h | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index e7d4fc3f350f..360875efb263 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -427,11 +427,21 @@ static int __read_sys_metadata_table(const struct fie= ld_mapping *mappings, #define read_sys_metadata_table(_mappings, _data) \ __read_sys_metadata_table(_mappings, ARRAY_SIZE(_mappings), _data) =20 +/* + * The size encoded in the field ID and the size of the destination C + * member must agree. + */ +#define TDX_FIELD_SIZE_CHECK(_field, _type, _member) \ + BUILD_BUG_ON_ZERO(sizeof_field(_type, _member) !=3D \ + TDX_FIELD_SIZE(_field)) + #define TDX_SYSINFO_MAP(_field, _type, _member) \ { \ .field_id =3D _field, \ .offset =3D offsetof(_type, _member), \ - .size =3D sizeof_field(_type, _member), \ + .size =3D sizeof_field(_type, _member) + \ + TDX_FIELD_SIZE_CHECK( \ + _field, _type, _member), \ } =20 #define TDX_SYSINFO_MAP_VERSION(_field_id, _member) \ diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index e41fc5e4925e..b3694a80a0c8 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -91,6 +91,13 @@ /* Class "TDX Module Handoff" */ #define TDX_FIELD_MODULE_HV 0x8900000100000000ULL =20 +/* + * Bits 33:32 of a field ID hold the log2 of the metadata field size in + * bytes. See "Metadata Field Identifier" in the Intel TDX Module ABI + * Specification. + */ +#define TDX_FIELD_SIZE(field_id) (1 << (((field_id) >> 32) & 0x3)) + /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 --=20 2.52.0