From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 C370533688C; Tue, 4 Aug 2026 11:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; cv=none; b=VVN8NZAxmkIqP4p7Z1GaqMGv1Hj5h0SyYkw5jJZVjIdWwx8X/YSillW4fM1dtdR8Xlz/FfEe6+4wQllz7ZVPSGmaHB8TzloTmMN9ozlsvNADNtizTATCzPRENrBFndE6ERC39wTS3lIRctt02NAN8aHCjeAaSnDWUgdE5bjjD50= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; c=relaxed/simple; bh=dheLYLhH3hHWdM96NiJlrPMtGHu2WUhpgs2LPgQ1WE0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UwhHvjlRIif3w/9P/cQJzArAYNIKjqiIil7ZYMLoX0xiGorwz7ncKOKQMizL1HSSXpGtO2Beedjkn4V+5HgdNOXY1pYg8iC27wV/CAVwKucFL+meg/HEXPFUyYE9sTneAFQi00YyfMLordAzT7RxI8ylpqNKKCz8Ft70TU+hxBw= 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=Eu7TjxUh; arc=none smtp.client-ip=198.175.65.21 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="Eu7TjxUh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843068; x=1817379068; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=dheLYLhH3hHWdM96NiJlrPMtGHu2WUhpgs2LPgQ1WE0=; b=Eu7TjxUhmi5KldvR702PkjTbCyp2flz4WMC3twWyecRyVFj8e42o6mo1 s8VTu948lwbiOBd8nL53WBy6q96hfkxNh1xI02NvYBbV6x6FOciueuDJy N9jIHaC92gNg7CVFaIOpHpkewxSJ/1gn6zUHyPvxwKBfcZObcffvmshrB nfFyyvh7JrJhHgn8snxGTozlpx0Qp+bMNahDLcFU43zct0ewiPJgi50F5 gtKncrKbwWdzcWBH4qbUpKUdflZzMfSMSq36ijcJcGqOHITehye7wokRF znFSW2457z2ha4kG28tCfiXkNJzYZ9m6KxTG0zJA7SbjKzOCKK+Nf1XBG Q==; X-CSE-ConnectionGUID: ixIjzXnWSPyXeMn7oKefmw== X-CSE-MsgGUID: JWHRYL0yRi2z/CaYp7IXrw== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244233" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244233" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 X-CSE-ConnectionGUID: VtMtWNSoR0OCx1PrxWSjzw== X-CSE-MsgGUID: QqXI0nRhRu+sjW6NjxJUdA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323095" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 1/8] x86/virt/tdx: Stop treating tdx_global_metadata.h as auto-generated Date: Tue, 4 Aug 2026 04:29:29 -0700 Message-ID: <20260804112941.19894-2-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen The TDX module exposes its capabilities and limits through "Global Scope Metadata" fields, defined in the Intel TDX Module ABI spec. The kernel mirrors a small subset of those fields in C structures (for example, struct tdx_sys_info_version/features). Those structures are populated by reading each field via the TDH.SYS.RD SEAMCALL. Today the header that holds these structures is generated by an out-of-tree script from a JSON file listing all of the TDX module's metadata. That made it trivial to add a new field, but everything else suffered for it: - The header is opaque to anyone who doesn't have the script and the JSON file handy, and the "Automatically generated" tag tells reviewers their edits will be clobbered. - The script ships outside the tree, so reproducing changes requires fetching it from a mailing list link. - The structures are short and stable; the script's value over a hand-edited header is small. In preparation for switching to a hand-maintained implementation, mark the header as such: - Drop the "Automatically generated" comment. - Rename the header guard to a non-"AUTO_GENERATED" name following the usual asm/ convention. - Add a comment describing what the structures are and how they are populated. No functional change intended. Assisted-by: Claude:claude-opus-5 Not-yet-signed-off-by: Dave Hansen Signed-off-by: Chao Gao --- arch/x86/include/asm/tdx_global_metadata.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/tdx_global_metadata.h b/arch/x86/include/= asm/tdx_global_metadata.h index 41150d546589..a86be9e5ec77 100644 --- a/arch/x86/include/asm/tdx_global_metadata.h +++ b/arch/x86/include/asm/tdx_global_metadata.h @@ -1,10 +1,15 @@ /* SPDX-License-Identifier: GPL-2.0 */ -/* Automatically generated TDX global metadata structures. */ -#ifndef _X86_VIRT_TDX_AUTO_GENERATED_TDX_GLOBAL_METADATA_H -#define _X86_VIRT_TDX_AUTO_GENERATED_TDX_GLOBAL_METADATA_H +#ifndef _ASM_X86_TDX_GLOBAL_METADATA_H +#define _ASM_X86_TDX_GLOBAL_METADATA_H =20 #include =20 +/* + * TDX module "Global Scope Metadata" as documented in the Intel TDX + * Module ABI spec. Each sub-structure below corresponds to one TDX + * metadata "Class"; its members are populated via TDH.SYS.RD SEAMCALLs. + */ + struct tdx_sys_info_version { u16 minor_version; u16 major_version; @@ -52,4 +57,4 @@ struct tdx_sys_info { struct tdx_sys_info_td_conf td_conf; }; =20 -#endif +#endif /* _ASM_X86_TDX_GLOBAL_METADATA_H */ --=20 2.52.0 From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 C5E6633D505; Tue, 4 Aug 2026 11:31:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; cv=none; b=X9jkhKCbGl7cKjF6uwA424MVD8z3Cm928rVeoYzZX9Vv9tYNPF0FhBgAzzWxJZURLB26wPSsw7hX6aWBvWcB/yJWN9oSSNfamcamP/EtrnLG1RPF8S59/GuVJxnRcAYUM/oguu0ZpIU1ytk1fiEqMVqhGuv+vRTZ+QkHqcQgwvg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; c=relaxed/simple; bh=4tIWKSUatttvcOASc90QvXOofpl3r/2ODnAEdzoKkQE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gejRpaS94751fwWhgj9SHytbkJtEJI4tuZ8PZc+8PBX1p7nvS9oNAgBMXkovSkzTxcC0jpDxN64IncQl31sCeBcB2SwVqDWlKmBWZ+Ilw5zQqcoaYMAiL5gKxTxWEhWlXpksF9ICslSwMpuXv/3O5kRqYAA6KRPOIeAaUTfnqzg= 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=a97hLO0s; arc=none smtp.client-ip=198.175.65.21 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="a97hLO0s" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843069; x=1817379069; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=4tIWKSUatttvcOASc90QvXOofpl3r/2ODnAEdzoKkQE=; b=a97hLO0s+QyEHdr2lV7UdAFAo9NDA0LzdJg7UT8Ajts3qZAxyLZDd9zh 6HV7Gx+tcdccCN23mveWjNrDSfvqGstcqxDJFsMcKnXCrKe25Oe5SUuhi taChGqBqIwJk7FIq0S+7KSeGP2yz6hBVmyJQQpZ/n+0JDS1ztujmLgOuy B3zhGh3RD2o0deLN0ya+Lk5MMwImLTJwQ24gpHN+lRz6qonl+gZH51DGb hcgukev+6aRpVmNl3ade30WZeNfjTMaYe/Zlbe8+u2gEEaK7eZ3hJTi70 BlaS1Yy1cm6B5HeiazWqNHGLjTp93GF1+AEKhOSnNz5ToznD4k0s7ltq1 Q==; X-CSE-ConnectionGUID: rNTGQ6sBSQCw47e0kPlqVQ== X-CSE-MsgGUID: 13Rm3f1CQOSjjbSb1Cnnbw== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244238" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244238" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 X-CSE-ConnectionGUID: AJVEuxWtTYGP0KkcDpEa6g== X-CSE-MsgGUID: 6HrtbajUTEabBjP7bDUXGA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323099" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 2/8] x86/virt/tdx: Name the TDX module global metadata field IDs Date: Tue, 4 Aug 2026 04:29:30 -0700 Message-ID: <20260804112941.19894-3-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen tdx_global_metadata.c currently identifies each field by a bare 64-bit hex literal, extracted from the JSON file by an out-of-tree script: if (!ret && !(ret =3D read_sys_metadata_field(0x9100000100000008, &val))) sysinfo_tdmr->max_tdmrs =3D val; That is unreviewable on its own. Verifying any one line requires the reviewer to cross-reference the JSON file. Add MD_FIELD_ID_ constants for every global metadata field the kernel currently reads (Version, Features, etc), grouped by class. This follows how the kernel handles ABI-defined literals elsewhere. The IDs can then be checked against the spec in one pass, and the read sites become readable without the JSON file. The hex literals in tdx_global_metadata.c are left alone because that file will be replaced by a table-driven reader in the following patches. No functional change intended. Assisted-by: Claude:claude-opus-5 Not-yet-signed-off-by: Dave Hansen Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.h | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index bdfd0e1e337a..5f567cb6c07a 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -58,6 +58,57 @@ */ #define TDX_VERSION_SHIFT 16 =20 +/* + * Global Scope Metadata field IDs. + * + * See "Global-Scope (TDX Module) Metadata" in the Intel TDX Module ABI + * spec. + * + * A field ID is a 64-bit value that encodes the metadata "Class" + * (which Linux mirrors in 'struct tdx_sys_info' sub-structures), + * the element size, and a per-class field index. Each ID below + * is paired with the C member that holds its value. + */ + +/* Class "TDX Module Version" */ +#define MD_FIELD_ID_MINOR_VERSION 0x0800000100000003ULL +#define MD_FIELD_ID_MAJOR_VERSION 0x0800000100000004ULL +#define MD_FIELD_ID_UPDATE_VERSION 0x0800000100000005ULL + +/* Class "TDX Features" */ +#define MD_FIELD_ID_TDX_FEATURES0 0x0A00000300000008ULL + +/* Class "TDMR Info" */ +#define MD_FIELD_ID_MAX_TDMRS 0x9100000100000008ULL +#define MD_FIELD_ID_MAX_RESERVED_PER_TDMR 0x9100000100000009ULL +#define MD_FIELD_ID_PAMT_4K_ENTRY_SIZE 0x9100000100000010ULL +#define MD_FIELD_ID_PAMT_2M_ENTRY_SIZE 0x9100000100000011ULL +#define MD_FIELD_ID_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL + +/* Class "TD Control Structures" */ +#define MD_FIELD_ID_TDR_BASE_SIZE 0x9800000100000000ULL +#define MD_FIELD_ID_TDCS_BASE_SIZE 0x9800000100000100ULL +#define MD_FIELD_ID_TDVPS_BASE_SIZE 0x9800000100000200ULL + +/* Class "TD Configuration" */ +#define MD_FIELD_ID_ATTRIBUTES_FIXED0 0x1900000300000000ULL +#define MD_FIELD_ID_ATTRIBUTES_FIXED1 0x1900000300000001ULL +#define MD_FIELD_ID_XFAM_FIXED0 0x1900000300000002ULL +#define MD_FIELD_ID_XFAM_FIXED1 0x1900000300000003ULL +#define MD_FIELD_ID_NUM_CPUID_CONFIG 0x9900000100000004ULL +#define MD_FIELD_ID_MAX_VCPUS_PER_TD 0x9900000100000008ULL + +/* Class "TDX Module Handoff" */ +#define MD_FIELD_ID_MODULE_HV 0x8900000100000000ULL + +/* + * Base IDs for the configurable-CPUID arrays. The field ID of leaf + * index @i is BASE + i; for the values array, sub-entry @j of index + * @i is BASE + i*2 + j. + */ +#define MD_FIELD_ID_CPUID_CONFIG_LEAVES 0x9900000300000400ULL +#define MD_FIELD_ID_CPUID_CONFIG_VALUES 0x9900000300000500ULL + /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 --=20 2.52.0 From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 6EE70340A46; Tue, 4 Aug 2026 11:31:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; cv=none; b=RkorAdWRjvEQlPTiAeVckaIFB+vycwCii8DucN9z3Je1NZ2+Gv+BP1Ce6CQ8dcSuYAn9fG60kh837yZHJ3dw0moVuBkQtH4KNy8J9/FKOQeuHIbBvr6IAZE/ZvQew4BN5YXftI3UzrtgP32ycTeXwK31mDkBQX4BHfyp0zW3W98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843070; c=relaxed/simple; bh=5RnmrpWOMDV86PTzf5eDaOGgp0G0DtsVia13f/Ss7q4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UPvD0aaGiL0I9XHY1LBGXRpTaQErVjXX5rAFr8jVm6KTRn+w3dUADiENbVYiTCLwrA2OR/Ms9xTqS6Wl5VbF1HqNYH1GJyjqDaWJvhd2KbpH4GQ6oNFImf2/gZV0FSSM0fEXLKmQKn2NM+JsuM6FiM1rM3TIokEqQJdoKVDBmLE= 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=ctniOjC5; arc=none smtp.client-ip=198.175.65.21 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="ctniOjC5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843070; x=1817379070; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=5RnmrpWOMDV86PTzf5eDaOGgp0G0DtsVia13f/Ss7q4=; b=ctniOjC5ZEAWCFZWprJRNil5sF+WshFVq4ikdj504UP0d7pzWEo9fweV 6RDNbOx06d9ufehWd5ngQKpvaWh4V6lcttpnyVQqKq0zRDfl2R5/7xjuU AzGQ/F/ifa/psWdA+EVRM+zKJVN7Xu8nkjzieeHxK3gjk+VulO7bFQx5G x1Hqwr4rr1+6rD6nGbZhKDP5x5jQiltrZqRPQ44UpPw2BvP4vzZUMMYcV mod35T4EY/EVPVNc/5Du5LWLUr7M0y1LrFTUqfyKHG2cz1Q5zMTidTb0x CajS517/M4ChOAPjyEVdpenn7NLjXkvr1vBp0KNPjbsiZfVZEBqVaczm7 w==; X-CSE-ConnectionGUID: c/wsYDyiR9q2IYinL6alNw== X-CSE-MsgGUID: cQuTRRnzQGCN29/JD8UQQg== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244241" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244241" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 X-CSE-ConnectionGUID: DUTxa6/lRKO+eoBhyc0o9Q== X-CSE-MsgGUID: 7HJ9DfupSzuPOgYN5nmEhw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323103" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:07 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 3/8] x86/virt/tdx: Add a table-driven TDX global metadata reader Date: Tue, 4 Aug 2026 04:29:31 -0700 Message-ID: <20260804112941.19894-4-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen The auto-generated tdx_global_metadata.c populates each member of 'struct tdx_sys_info' with a chain like if (!ret && !(ret =3D read_sys_metadata_field(0x..., &val))) sysinfo_xxx->member =3D val; repeated once per field, with a bare hex literal for the field ID and an implicit narrowing assignment. Reading it requires the JSON file, and reviewing any change to it requires the out-of-tree script. Replace it with a small table-driven reader. Each table entry pairs a named MD_FIELD_ID_* with the C member that holds its value: #define MAP_FEATURES(_field_id, _member) \ TD_SYSINFO_MAP(_field_id, tdx_sys_info_features, _member) static const struct tdx_sys_field features_fields[] __initconst =3D { MAP_FEATURES(TDX_FEATURES0, tdx_features0), }; TD_SYSINFO_MAP() derives the destination offset and width from the struct via offsetof()/sizeof_field(). Add read_sys_metadata_table() to walk such a table, reading each field and populating the C struct. Three things fall out of this table-driven reader, all of which matter now that the code is hand-maintained rather than auto-generated: - The field-to-member pairing becomes data rather than code embedded in control flow. - The read logic exists once instead of once per field. - The width is recorded explicitly instead of being implied by a narrowing assignment. Convert the 'features' class only, as an example. The remaining classes follow in later patches. Assisted-by: Claude:claude-opus-5 Not-yet-signed-off-by: Dave Hansen Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 60 +++++++++++++++++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 11 ---- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 42df8ea464c4..fb21433e7851 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -347,6 +347,66 @@ static int read_sys_metadata_field(u64 field_id, u64 *= data) return 0; } =20 +/* + * Mapping between a TDX global metadata field and the C member that + * holds its value. Use TD_SYSINFO_MAP() to populate entries. + */ +struct tdx_sys_field { + u64 field_id; + u16 offset; + u8 size; +}; + +#define TD_SYSINFO_MAP(_field_id, _struct, _member) \ + { \ + .field_id =3D MD_FIELD_ID_##_field_id, \ + .offset =3D offsetof(struct _struct, _member), \ + .size =3D sizeof_field(struct _struct, _member), \ + } + +/* + * Walk a table of TDX global metadata fields, read each via TDH.SYS.RD, + * and store the result into the matching C member of *@base. + */ +static int read_sys_metadata_table(const struct tdx_sys_field *fields, + int nr_fields, void *base) +{ + int i, ret; + u64 val; + + for (i =3D 0; i < nr_fields; i++) { + const struct tdx_sys_field *f =3D &fields[i]; + + ret =3D read_sys_metadata_field(f->field_id, &val); + if (ret) + return ret; + + switch (f->size) { + case 1: *(u8 *)(base + f->offset) =3D val; break; + case 2: *(u16 *)(base + f->offset) =3D val; break; + case 4: *(u32 *)(base + f->offset) =3D val; break; + case 8: *(u64 *)(base + f->offset) =3D val; break; + default: + return -EINVAL; + } + } + return 0; +} + +#define MAP_FEATURES(_field_id, _member) \ + TD_SYSINFO_MAP(_field_id, tdx_sys_info_features, _member) + +static const struct tdx_sys_field features_fields[] __initconst =3D { + MAP_FEATURES(TDX_FEATURES0, tdx_features0), +}; + +static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *= sysinfo_features) +{ + return read_sys_metadata_table(features_fields, + ARRAY_SIZE(features_fields), + sysinfo_features); +} + #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_global_metadata.c b/arch/x86/virt/vm= x/tdx/tdx_global_metadata.c index e49c300f23d4..e69c655a91a0 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -22,17 +22,6 @@ static int get_tdx_sys_info_version(struct tdx_sys_info_= version *sysinfo_version return ret; } =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(struct tdx_sys_info_tdmr *sysinfo_= tdmr) { int ret =3D 0; --=20 2.52.0 From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 215BA349AE0; Tue, 4 Aug 2026 11:31:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843071; cv=none; b=WZrI9vvvf7DF4jKv/xep66Nwlg7Itj75Jm4znuTXe3+6fOk+2T/DC9zVyNrl+pV607jS+iv3atiZmISvgNBVgeRxpKERPKxPWdouRNlWHrMGZW27Nvfv9AQ7+hPZUDiBgT8DFc2gLXH+LpoJo+hBjVv58Ygp/9gTwD9bXf4uLbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843071; c=relaxed/simple; bh=LgnX2KJf0mUKvP9LsvBnNrUpGm3a83MdRRrXS4RG+MY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rxmW3JvWmTX/2kfr1NqfnkI+vVXqpfDB74VS5nz7Z2WDRYQzOUD3A+Bhkdcw0TxomZT2jjnIFLa/Heui3G3VsdzbUnZMETVTUPtMxrE1LP6Rp1ROYvSJN12hXi6lufO6eBM3fv8aeCrKimiUDM1FMe4iJGacp/4Erxjsq+QN0ak= 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=C6AZabgL; arc=none smtp.client-ip=198.175.65.21 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="C6AZabgL" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843070; x=1817379070; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=LgnX2KJf0mUKvP9LsvBnNrUpGm3a83MdRRrXS4RG+MY=; b=C6AZabgL2TajG5It9ap3agY/lvO7s2gPmPUg3uJ0wv2LOh19jJQVOaIi fi5x4NlTP3lNUDsSqW3nNIkizPFMhzamVVWOz37rvF6ElGtStw3ZhBmkf LJy3NSMIIUAanPtTiJLxPFcKfVzS7WMIEPMb/gq/IuQDu2Noh+9/Ci1+P bAEgkn69qRNMOkYvdYlpcObdDpgLwSOw2D47spfWrSpEaPlH+2SVDj2dz 2lTSkZqUJybHZ3mJPUFlG0PlnnuoniCqAtuW916+4el3bWKL8PpAk/eso NrP5aq3tNsXaEKp5YL1BtBBsd/GI2kYstslmdLM1Gu0ziNbStUAqfNvHn g==; X-CSE-ConnectionGUID: bma69mE4QPSTs2sqDbQcyA== X-CSE-MsgGUID: nFU3vnSHRcOvZqXl+PW2Lw== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244245" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244245" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 X-CSE-ConnectionGUID: Lcj0NfC5ST2uHxMM4SX5mA== X-CSE-MsgGUID: h1Zt4MCpQHKnrXw4DkzMhg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323106" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 4/8] x86/virt/tdx: Convert version/tdmr/td_ctrl/handoff readers Date: Tue, 4 Aug 2026 04:29:32 -0700 Message-ID: <20260804112941.19894-5-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen 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 Signed-off-by: Chao Gao --- 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_sy= s_field *fields, return 0; } =20 +#define MAP_VERSION(_field_id, _member) \ + TD_SYSINFO_MAP(_field_id, tdx_sys_info_version, _member) + +static const struct tdx_sys_field version_fields[] =3D { + 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_v= ersion) +{ + 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) =20 @@ -407,6 +423,54 @@ static __init int get_tdx_sys_info_features(struct tdx= _sys_info_features *sysinf sysinfo_features); } =20 +#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 =3D { + 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 =3D { + 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 *sy= sinfo_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[] =3D { + MAP_HANDOFF(MODULE_HV, module_hv), +}; + +static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *sysinfo_h= andoff) +{ + return read_sys_metadata_table(handoff_fields, + ARRAY_SIZE(handoff_fields), + sysinfo_handoff); +} + #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_global_metadata.c b/arch/x86/virt/vm= x/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. */ =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_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; - 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; @@ -89,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:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 E275535AC11; Tue, 4 Aug 2026 11:31:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; cv=none; b=lCUOp9ZKjYoe4uSCk4NF/I7LSwB8YO3x8Rj3I4uC8sNU1rmfTF/dGcA9q7BdqU8gSTNl97gMk+7uX9JdkFZ8nhf2niV8s4iKoy6BAiAzwd4JWP3vExBGZ7doE+yqiWWrAnCen9hxa+nyF4wiprO8IInjpdAWuHkGymBkWJoj8+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; c=relaxed/simple; bh=aw+dZKDsHumz+KUWQ9LezSpTNhLooOFpZP+UtO3hMpI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QTWTMbO6yWIEVe9nVu9LZEBnLpliqwlnNp/LGberNYKX3xAqrLGshEpldydBBiKUqD/+VCIeGUNltjpLPIAsYZORtznIqWKbpC4ejgCaylmlnP9MmTsnNBi6Og/uHYxAWQWnEfezfI5gj0To9c7YBz1TS870jCZ02duRu7Fd0RM= 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=Q7LT65pb; arc=none smtp.client-ip=198.175.65.21 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="Q7LT65pb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843071; x=1817379071; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=aw+dZKDsHumz+KUWQ9LezSpTNhLooOFpZP+UtO3hMpI=; b=Q7LT65pbLiJyFVm47Ch5h+jB6cWb6A2mg8DSMS7uQQ2r1eG1NlB9jO5h saxamP2rJityMwOjDtGpXw3Akj/4VkrWrwodbzkx0LwCwyFX7z4bnvQ78 UCniieH0oTcX0in7lZEjuMliZWicEu8y2SkOwiWAEjGMDEWlyFB5X8ul8 1iD8QgK8yeTe68xvZazIEz8hD3JKRQQHLTpVNbhHUbq6yAKYDznFB0W9c CMgnCCoBdDZ0OgwdY8UwRy+t0WjKiAsVScD6DFSKWKFYCQjBWG7Nf85rI A8jAAfNYk0usvLs8UfKpAkpcKQe5gmqJ4YiOkZbtfvQ993ugxZGiMX7bD w==; X-CSE-ConnectionGUID: soiqDVEHQ1SF5+rquJTXig== X-CSE-MsgGUID: lFj/SyoYTmS2JNFacNlqiQ== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244248" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244248" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 X-CSE-ConnectionGUID: jfd+BNZQRgqnFiGyMucR5A== X-CSE-MsgGUID: RxbNvbE4StC65NrvVy5r2w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323109" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 5/8] x86/virt/tdx: Convert td_conf reader Date: Tue, 4 Aug 2026 04:29:33 -0700 Message-ID: <20260804112941.19894-6-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen Convert the "TD Configuration" class to the table-driven reader. This class has two parts: - Six scalar fields (attributes_fixed{0,1}, xfam_fixed{0,1}, num_cpuid_config, max_vcpus_per_td) that fit straight into a TD_SYSINFO_MAP table. - Two arrays (cpuid_config_leaves[] and cpuid_config_values[][]) whose lengths come from num_cpuid_config and whose field IDs are computed from a base announced by the spec: field_id(leaves[i]) =3D MD_FIELD_ID_CPUID_CONFIG_LEAVES + i field_id(values[i][j]) =3D MD_FIELD_ID_CPUID_CONFIG_VALUES + i*2 + j The arrays can't be expressed as a static table, so read them explicitly after the scalar block has populated num_cpuid_config. Bounds-check num_cpuid_config against the C array sizes before indexing, matching the prior generated code. Drop the corresponding function from the auto-generated file. Assisted-by: Claude:claude-opus-5 Not-yet-signed-off-by: Dave Hansen Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 56 +++++++++++++++++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 33 ------------ 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 89055afeef68..98534e702144 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -471,6 +471,62 @@ static int get_tdx_sys_info_handoff(struct tdx_sys_inf= o_handoff *sysinfo_handoff sysinfo_handoff); } =20 +#define MAP_TD_CONF(_field_id, _member) \ + TD_SYSINFO_MAP(_field_id, tdx_sys_info_td_conf, _member) + +/* + * Scalar fields of the "TD Configuration" class. num_cpuid_config + * must be present here (and must be read before the CPUID arrays + * below) because it sizes them. + */ +static const struct tdx_sys_field td_conf_fields[] __initconst =3D { + MAP_TD_CONF(ATTRIBUTES_FIXED0, attributes_fixed0), + MAP_TD_CONF(ATTRIBUTES_FIXED1, attributes_fixed1), + MAP_TD_CONF(XFAM_FIXED0, xfam_fixed0), + MAP_TD_CONF(XFAM_FIXED1, xfam_fixed1), + MAP_TD_CONF(NUM_CPUID_CONFIG, num_cpuid_config), + MAP_TD_CONF(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_fields, + ARRAY_SIZE(td_conf_fields), + td_conf); + if (ret) + return ret; + + /* + * The configurable-CPUID arrays are sized at runtime by + * num_cpuid_config, so they can't be expressed in a static + * TD_SYSINFO_MAP table. Their field IDs are contiguous from + * the bases announced by the spec. + */ + 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; + + for (i =3D 0; i < td_conf->num_cpuid_config; i++) { + ret =3D read_sys_metadata_field(MD_FIELD_ID_CPUID_CONFIG_LEAVES + i, + &td_conf->cpuid_config_leaves[i]); + if (ret) + return ret; + + for (j =3D 0; j < 2; j++) { + u64 fid =3D MD_FIELD_ID_CPUID_CONFIG_VALUES + i * 2 + j; + + ret =3D read_sys_metadata_field(fid, + &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_global_metadata.c b/arch/x86/virt/vm= x/tdx/tdx_global_metadata.c index 0c2cc99f1af1..4d673cac0976 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:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 5190735C6A1; Tue, 4 Aug 2026 11:31:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; cv=none; b=BKkA6S7huWbNUuWSJ4FNW0TwHTs4t9WmBHrZMTgpIlrAtdL4fblE7kdyR0m71L2zarIvdk8XjbpDunSkv6YY8g9tMki87Dh1kRVMdik6jT5pbd7jqasYGMuFGh3GKP9CcSRsLQKOFx1KoQN8SkyRknMTNBMRu/6bhwGEHq+2qzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; c=relaxed/simple; bh=HqIsEUmWY18ptGel6idwJk4Clpr2GS3PBY7r0EKYLqI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kfgLaVSjGFIQiGBFewRE7s/UDjiRwKjTHrkXiodP1c2RW54ONtOmv0zH3Sc7dvx/aAjLOzDHaPAmR+rAUzaKQqNVniuPFJ2sqshqi/ys4YgM1xGO0GhZUNwhXPgs+cNRihQjW/vf8bR91d2z0HaoQKuZ+p5RHCFS9BlfhgX2eyM= 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=PFYicmXj; arc=none smtp.client-ip=198.175.65.21 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="PFYicmXj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843071; x=1817379071; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=HqIsEUmWY18ptGel6idwJk4Clpr2GS3PBY7r0EKYLqI=; b=PFYicmXj0gMI4JU2Gcj4c+NskMWyPpzgJ+KCojXZ8uhyoxoXFZS3sZV/ KSYV6BtlGVUm0+O1sBt4RUNWzX52Qvknz3SQFAqjehCS51zjm0IR7GHn6 vxJiATNYEpCJoi00LLeNMNEMjMIFzEMtV7mMwTHhVhdd8tWRtzw8EiwNk M4svQhQTdVBb+8p8AHrKGzbZlONzP6v3zP+odwHfGfR6MC1OgmI6F+h30 YwbkoZneAcftDy2Qs3ekgMuUSubDniuxvphVI+BUKUAYwCReeoHJb4FKN c0ys2aNOi9q5GSzIzXXGrPsRHuQ3xlZ/1DUApKIsjkDFbeNSEiHiiFsD8 w==; X-CSE-ConnectionGUID: ncDyduHVQw2du3tCkDoYyQ== X-CSE-MsgGUID: CYJqdGkHQWWweZwT5whckg== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244251" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244251" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 X-CSE-ConnectionGUID: RDzO+XVkQeab3Cr0G5YJHQ== X-CSE-MsgGUID: GRcZlCUfQNeH+L8yDcth2g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323112" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 6/8] x86/virt/tdx: Remove the auto-generated tdx_global_metadata.c Date: Tue, 4 Aug 2026 04:29:34 -0700 Message-ID: <20260804112941.19894-7-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" From: Dave Hansen With all metadata classes converted, the only thing left in the auto-generated tdx_global_metadata.c is get_tdx_sys_info(). Move it into tdx.c so that the auto-generated file can be deleted, along with the unusual `#include "tdx_global_metadata.c"`. No functional change intended. Assisted-by: Claude:claude-opus-5 Not-yet-signed-off-by: Dave Hansen Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 19 ++++++++++++++- arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 27 --------------------- 2 files changed, 18 insertions(+), 28 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 98534e702144..1b8cd7656f36 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -527,7 +527,24 @@ 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 ?: get_tdx_sys_info_version(&sysinfo->version); + + pr_info("Module version: " TDX_VERSION_FMT "\n", + sysinfo->version.major_version, + sysinfo->version.minor_version, + sysinfo->version.update_version); + + ret =3D ret ?: get_tdx_sys_info_features(&sysinfo->features); + 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); + + 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 4d673cac0976..000000000000 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Automatically generated 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 ?: get_tdx_sys_info_version(&sysinfo->version); - - pr_info("Module version: " TDX_VERSION_FMT "\n", - sysinfo->version.major_version, - sysinfo->version.minor_version, - sysinfo->version.update_version); - - ret =3D ret ?: get_tdx_sys_info_features(&sysinfo->features); - 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); - - return ret; -} --=20 2.52.0 From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 045C735F610; Tue, 4 Aug 2026 11:31:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; cv=none; b=US7eQsBlSRxsKT+WrzJEN5IN5nI/D5uZO2lNUQiP3xqMrTgyr9s1YtIFLvnqi+jrsjkWAtQQ8VZHHA1AgJDKTnwgBXCBU4GdTMjSFlPXd+4+9Ia8yZgfL2v/PHtJ/wrxONWYc8YgeZAGd4u22BpIIYH+uDQM+HGo5PqxWPpkT5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843073; c=relaxed/simple; bh=Y6lxi0uxHnn0/lNIpZP0YyNVdKosqCsqHIC38cmFdfg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KVrUYamevx887SsP9uJ1gPpXzQGv4kCSdPSjwkTqLDYn21K9lypXNpJs06MF86XgbDRY5K8ORHgUqAjB7B2ycQqkU2U7g4e1fgQze7eHaN1gg0TqtzYG+9hmNjX2hYLT+6UzvMy2g/Cl9RjDym7J5tixr87yIZAZy9zXuYn3fpU= 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=B5zPP8Em; arc=none smtp.client-ip=198.175.65.21 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="B5zPP8Em" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843072; x=1817379072; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Y6lxi0uxHnn0/lNIpZP0YyNVdKosqCsqHIC38cmFdfg=; b=B5zPP8EmH97KJke1mzRt0Spm6I1eXgYk5J7Ttai7Ke+HYugLXDObIRXv uHALe8uWR1/CEL54GHOJC699MOvWs2siLW06A6NVZWdDQXAIxPskf/laD 9aROe+bWZ78hrVIEVrhqg5f3rTxv1lRyBQYPt4TsECmr7ZCsddxTqcPjp RnVEaHi1ltKQo0/qsrXmvsjJLJttzcFcjSNbB3yLYfaScKTRZSX2nOqKh ygxou6iG0tie0d2dsFWfrfX+wfc6aWf8PXRmmL9mBpNQrc52m4PmtElQJ w6wbMPX1aT5qSKBsXiG+poMtcw4gTp02EU9IHDKtm3IiB7NXbmjfsRnDq g==; X-CSE-ConnectionGUID: fnkrtBovTi6ND6RlOy76oA== X-CSE-MsgGUID: MmyAsl43RPGZ+GRbsIKEYw== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244254" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244254" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:08 -0700 X-CSE-ConnectionGUID: 120NWI3+TlCdShOngetPWQ== X-CSE-MsgGUID: BMUg4Q48S1eOUk+SOo3gJw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323115" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:09 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 7/8] x86/virt/tdx: Clean up error handling in get_tdx_sys_info() Date: Tue, 4 Aug 2026 04:29:35 -0700 Message-ID: <20260804112941.19894-8-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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() chains its calls with ret =3D ret ?: get_tdx_sys_info_foo(...); so that the remaining reads are skipped once one fails. That is an artifact of the code generator rather than the usual kernel idiom. Use plain early returns instead. The version is still printed before the error from reading it is checked, so a failed read is reported with whatever the print shows. No functional change intended. Assisted-by: Claude:claude-opus-5 Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 1b8cd7656f36..4bf21848df62 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -529,21 +529,31 @@ 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 ?: get_tdx_sys_info_version(&sysinfo->version); + ret =3D get_tdx_sys_info_version(&sysinfo->version); =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 ?: get_tdx_sys_info_features(&sysinfo->features); - 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); + if (ret) + return ret; =20 - return ret; + ret =3D get_tdx_sys_info_features(&sysinfo->features); + if (ret) + return ret; + + ret =3D get_tdx_sys_info_tdmr(&sysinfo->tdmr); + if (ret) + return ret; + + ret =3D get_tdx_sys_info_td_ctrl(&sysinfo->td_ctrl); + if (ret) + return ret; + + return get_tdx_sys_info_td_conf(&sysinfo->td_conf); } =20 static __init int check_features(struct tdx_sys_info *sysinfo) --=20 2.52.0 From nobody Fri Oct 2 06:58:27 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) (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 C3EC6369D51; Tue, 4 Aug 2026 11:31:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.21 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843076; cv=none; b=boO/WqrkK0fmvIDYD29TLOhJ8OW5fgKq65dWFRQnc3t35gih2Z5XE1EDG5CQRX2iFwW9KxbIoxbx4OOrT0MRTtsiJR8Ou7/xr/p2YbLs3ipQkUPQJOmuH7njO8LBOj+WRMFbbFREvTsl72dy2GFbRo5I8VHEgfvgm29YEXUkOXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785843076; c=relaxed/simple; bh=Pi5qbVX2SOI5SdGfiFCW/36EzzapHXmkthYgHMyLdi8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VyfrngkiMwNHlfEkFEV1DUSjOz89Y1Lq6cFkvCiGLFelqmPqwtXRXpdKoyOLLRB+35DkLnsnQywEYFtJyNICPLVbwBFlJvt/IyVnJLelZ/Wj/sMfRWbsEnYpagOBRX6uO6FoMX2DnI4PCmikLjAxJjIj4dTYWteg0ftqt5RY/U4= 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=jA8GFWk0; arc=none smtp.client-ip=198.175.65.21 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="jA8GFWk0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785843074; x=1817379074; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Pi5qbVX2SOI5SdGfiFCW/36EzzapHXmkthYgHMyLdi8=; b=jA8GFWk0avpIlAXgTZJLhi5Vei+5Teo1ViMBOvGysmvs8rmnwtrXzt1z 6vSZbLZ7aEshYtfGFuo2E3wlpKocB5E+lT+sVhjxDJ+QU3iXFc8iGlOd1 cPdtWuaJzV+/Pm8nCIwchlGyYVuCAXyA9Z2W47sU8pGKyfnigCmxKUCLH s91Cec8rgfEsoE+N342PaG9updO/BMfQf6adsefhL5wgXgMT396LVdXW0 0i5e3vGuHs0t5RrqLIzL2W60ZONQCu2qML2sd/c9KISSK+ufRycT6FNcJ 7YZAHRjATdXIf/85vXP7eR/rS0aNHZPQtBrSugmUxeWPvaOCPewmJOxIW g==; X-CSE-ConnectionGUID: ogDKrAfRTdqaoKVhxnnqDg== X-CSE-MsgGUID: 5WHWkjspRD6EwIzfK4QW6Q== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="86244257" X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="86244257" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:09 -0700 X-CSE-ConnectionGUID: 78mmNRjcQwWp/IN+2fEMVA== X-CSE-MsgGUID: tSqKD+oUSMCGaCKujPcEAw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,204,1779174000"; d="scan'208";a="265323118" Received: from jf.jf.intel.com (HELO 984fee019967.jf.intel.com) ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2026 04:31:09 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, chao.gao@intel.com Subject: [PATCH v1 8/8] x86/virt/tdx: Verify the C member size against the metadata field ID Date: Tue, 4 Aug 2026 04:29:36 -0700 Message-ID: <20260804112941.19894-9-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260804112941.19894-1-chao.gao@intel.com> References: <20260804112941.19894-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" Each TDX global metadata field ID encodes the size of that field. read_sys_metadata_table() stores each value at the width recorded in the table, which TD_SYSINFO_MAP() derives from the destination C member. Nothing checks that the two agree. A table entry naming the wrong field ID, or a struct member declared at the wrong width, would silently truncate the value read from the TDX module. That is a kernel-side bug rather than a TDX module problem. Add macros to extract the encoded size from a field ID, and use them in TD_SYSINFO_MAP() to assert that it matches the member size. Both are compile-time constants, so the check costs nothing at runtime. Note that BUILD_BUG_ON() cannot be used in a structure initializer; use BUILD_BUG_ON_ZERO() instead, which yields 0 and so can be folded into the .size initializer without changing its value. No functional change intended. Assisted-by: Claude:claude-opus-5 Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 9 ++++++++- arch/x86/virt/vmx/tdx/tdx.h | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 4bf21848df62..59099cc15f7a 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -357,11 +357,18 @@ struct tdx_sys_field { u8 size; }; =20 +/* + * The size encoded in the field ID and the size of the destination C + * member must agree; BUILD_BUG_ON_ZERO() enforces this at compile time. + */ #define TD_SYSINFO_MAP(_field_id, _struct, _member) \ { \ .field_id =3D MD_FIELD_ID_##_field_id, \ .offset =3D offsetof(struct _struct, _member), \ - .size =3D sizeof_field(struct _struct, _member), \ + .size =3D sizeof_field(struct _struct, _member) + \ + BUILD_BUG_ON_ZERO( \ + sizeof_field(struct _struct, _member) !=3D \ + MD_FIELD_ID_ELE_SIZE(MD_FIELD_ID_##_field_id)), \ } =20 /* diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index 5f567cb6c07a..c612b1cf7c14 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -109,6 +109,21 @@ #define MD_FIELD_ID_CPUID_CONFIG_LEAVES 0x9900000300000400ULL #define MD_FIELD_ID_CPUID_CONFIG_VALUES 0x9900000300000500ULL =20 +/* + * Sub-field definitions of MD_FIELD_ID. + * + * See "MD_FIELD_ID (Metadata Field Identifier / Sequence Header) + * Definition" in the Intel TDX Module ABI spec. + * + * - Bit 33:32: ELEMENT_SIZE_CODE -- log2 of a single metadata + * element's size in bytes + */ +#define MD_FIELD_ID_ELE_SIZE_CODE(field_id) \ + (((field_id) & GENMASK_ULL(33, 32)) >> 32) + +#define MD_FIELD_ID_ELE_SIZE(field_id) \ + (1 << MD_FIELD_ID_ELE_SIZE_CODE(field_id)) + /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 --=20 2.52.0