From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 CD76D4F7999; Fri, 18 Sep 2026 13:31:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738303; cv=none; b=EwXLas5LeP5LgosVq7hLRAneGkKSKqRxAq3zE1dMtHwkmn0w/Td9IcZLsAFL2pVIiqOVMqqtK2ticzHO1l4h3yHtz35TQ6DHnxAtCyHI+xn7qO8MYT3WUsvlNO88X9WlH6m2xR/OYOQH7ePEhQMvoeh9pNnXVCrjC8iSmNJTMKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738303; c=relaxed/simple; bh=G4W1Gz9y/omE+2l1vuHu0Bqtn4tce5ZQs8RGWGI79u8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jDHcZWCvcbVdSwJ7sBHRQ6mcWco6QY7+NAeqioG1iPJFSQE3XuOsSgC7YedGNSf/8qZgsvRpPA/2ZzHEPtRo3o45fSyqkR+0YpHeTu3WJNcnFTbiO2IMMFvWsbVOmsvWD5wyxjzJsxkdh4UtO7bY8AsNLW+9pNRR9oLLdwEaGYA= 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=GaPnyJ8L; arc=none smtp.client-ip=192.198.163.7 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="GaPnyJ8L" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738301; x=1821274301; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=G4W1Gz9y/omE+2l1vuHu0Bqtn4tce5ZQs8RGWGI79u8=; b=GaPnyJ8LhqPeZNqwggANzeHv4vOvELMU+cLTHSm3Iso+hIDl0PZZf0eX NYLgHWRKCNpX1NG2fcaPGlrKYowkMFgeyd/1Yu1nhsvYeRCoBTXIUheq8 35K1g8gY8A0WoyQ7an8LcRBPjjCq7b2Ro9ENsUVnPqdV9fF1AuiH342Q5 83g1yKYox1/5TChT1th/4A/92Pl9Qx+bQKvhl0TFPHoxHCuwkgHkpL9WW 4nqIyo6XAZ8vnSsJ/+Zumj/vD9On4P6B4WdrJ/KmhqNqtnvOgcJghJsE4 Tc1jLRVM0mcjMWAOsbQ3mySFN/O4OsXXt2XCS/3IsxKz3ONI8T3sscfPV A==; X-CSE-ConnectionGUID: wyVzc+cSQOK4HZqElXOKyw== X-CSE-MsgGUID: kjjx4lXuQhyaFhy5kqH+vQ== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776102" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776102" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:39 -0700 X-CSE-ConnectionGUID: iw3MmNclQ3GjhIToxMwrdw== X-CSE-MsgGUID: 2AbmezB2TmOQJ18eM4OnEg== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:38 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 01/10] x86/virt/tdx: Add a helper to read a table of metadata fields Date: Fri, 18 Sep 2026 06:29:20 -0700 Message-ID: <20260918132946.76533-2-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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. 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 name, a structure type and a member name. Add __read_sys_metadata_table() to read every field in a table. Annotate the 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. Signed-off-by: Chao Gao Link: https://lore.kernel.org/kvm/1e7bcbad-eb26-44b7-97ca-88ab53467212@inte= l.com/ # [1] --- arch/x86/virt/vmx/tdx/tdx.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 063574ed8625..5cd9c6eb98c2 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -395,6 +395,42 @@ 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; + int 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 TDX_SYSINFO_MAP(_field, _type, _member) \ +{ \ + .field_id =3D TDX_MD_FIELD_ID_##_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 Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 5CC3B4F7CD5; Fri, 18 Sep 2026 13:31:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738306; cv=none; b=qSmLLjsdjJ+YhYVh7Xui/CiX6IvbYeAbnQbqRO711FNI7l7UBn3QI0oZHvMrtlqFTJYMNRXkl6KS9HcKC1bRFUP1uKp333kFzHwFYrwdO+8D6gzVerT5Hnx+iVZQoIikAKzjuUrQRwW28yY+1T5Me8yJe9xuFPoS1NP6LeU2ju8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738306; c=relaxed/simple; bh=O3wItZforq4puw9Y7zK8QE7JChTIKNAxjV9FcIEkohE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZYDmHGng6RRpXvsbOQ6UWkMk69k+0rZr5jVt8n5PdUK3Fq2CS/5Ssr46vTR9hyA6XjzFFadOeYCHO4m9R6bqU9VAEAIgIULi5UwEG1bnPfbGNkwAsUlpUPLICpH/YafGpiUIyieNBrfI/N69sR3uqjLtuyjy7XdCnJS0Qcboaso= 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=JfcCq0cg; arc=none smtp.client-ip=192.198.163.7 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="JfcCq0cg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738302; x=1821274302; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=O3wItZforq4puw9Y7zK8QE7JChTIKNAxjV9FcIEkohE=; b=JfcCq0cg8urYLYHJbQqHiaEMuWBCxnhLiz3BJB9etkapHvPmFYs/NFCI xWdYRAbzHWBBzdAmtddku20j9HjPVS0gWsM7QhVgCPHD+jhJW7YrZKIn+ hW/vWz3Ah5ni9rWoSCpQO/3XRJ61qToJZLoajtSBcInbH1FVoeOB66nMI xWbXdvvQKiWR4Sy2zqj8qljRcINNWFqn/+DyHp20Pl1V59breL7u3Cy/f OAFRrYCrKUE51I2SIKIBvvX4q61K+2MLviaDFia6/mUA1/hV2TqQMi1Ml RWGj52tw3lQ9M/ZCEAkReeZ5/pb08TCOUOqtf7y6Gyu4pvrkUP9eb1GDE w==; X-CSE-ConnectionGUID: WzJu75mdQEijAtG1ipe9Yg== X-CSE-MsgGUID: XfdQFcN4Q3mZMIJiEzi0sg== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776110" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776110" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:40 -0700 X-CSE-ConnectionGUID: 81Ti00v6TrCuTxtAp6i+gw== X-CSE-MsgGUID: gjmPZXpfQxSd9Sn1cFpW5A== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:39 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 02/10] x86/virt/tdx: Convert the version metadata reader Date: Fri, 18 Sep 2026 06:29:21 -0700 Message-ID: <20260918132946.76533-3-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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. Also add read_sys_metadata_table() macro to derive the number of entries with ARRAY_SIZE() so that callers don't need to pass it separately. AI was used under supervision to review code and workshop logs. It suggests adding read_sys_metadata_table() macro. Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 21 +++++++++++++++++++-- arch/x86/virt/vmx/tdx/tdx.h | 10 ++++++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 15 --------------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 5cd9c6eb98c2..0c8b571f5186 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; @@ -431,6 +431,23 @@ 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(MINOR_VERSION, minor_version), + TDX_SYSINFO_MAP_VERSION(MAJOR_VERSION, major_version), + TDX_SYSINFO_MAP_VERSION(UPDATE_VERSION, update_version), +}; + +#define read_sys_metadata_table(_table, _data) \ + __read_sys_metadata_table(_table, ARRAY_SIZE(_table), _data) + +static int get_tdx_sys_info_version(struct tdx_sys_info_version *version) +{ + return read_sys_metadata_table(version_mappings, version); +} + #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 a886c54decaa..44124f399703 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -60,6 +60,16 @@ */ #define TDX_VERSION_SHIFT 16 =20 +/* + * TDX global metadata field IDs. + * + * See "global_metadata.pdf" in Intel TDX Module ABI Definitions. + */ +/* Class "TDX Module Version" */ +#define TDX_MD_FIELD_ID_MINOR_VERSION 0x0800000100000003ULL +#define TDX_MD_FIELD_ID_MAJOR_VERSION 0x0800000100000004ULL +#define TDX_MD_FIELD_ID_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..9510bf5f6e7d 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; --=20 2.52.0 From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 D511E4F93BC; Fri, 18 Sep 2026 13:31:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738310; cv=none; b=ZvpIl1gzBmXB7K6ofPiexNYN+rCZOaY0IpghXzlwJSroVYFDplNO1n4IFMJbREMaebWayW7dv4Dm2e0OgndtGrFWZAAcNPj4RiJ2gqcBdEsbc1KFcHxTkw4NDzD2TqwnCX5pbOfJCn9TM1iL8/ZB7Tf38Q1As0Ct3qfVRxuZnHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738310; c=relaxed/simple; bh=EqfvilIIE2pdrjBJmm3xhJF1bcC03ahcTeTplAfklD4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jadHwOmvade2iRfsHqplyblYzadSBVvfK7YBq9JYld97hOcTLIINGh5W54pYgzTs4ajs/D1KCidD7l3aCoR+ChV0AsJ08q5lvy5oNClX27+8awP0ZnORv7uhh4YH09YPHD3KZjnd0CQo5IJZzd94cqCdQAYrFQd5RG7YGnICOnE= 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=LhvN9oWf; arc=none smtp.client-ip=192.198.163.7 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="LhvN9oWf" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738304; x=1821274304; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=EqfvilIIE2pdrjBJmm3xhJF1bcC03ahcTeTplAfklD4=; b=LhvN9oWfxJcCa/MXJ/aUi7grqoRtqrTmGwJoPomAnV5LAbl0e8ZqHjMR 7pAaQaiL7fsfnvI9ffqSCQy9XEDan/a/B9wYCHRpmw1vEhthlCJSBylUX lugDng9Se+VQk08N6eYLZz46xCCeMPKLAkT89gVxv4aSGRWYacxHyHcaW AHsJ5z1Rmpu/mMMfXiZe8BhLje+ckjYROHB6e4NV8/8bSbuY3DMezT7uE RRLjZGvVfZ6hggOrd0N1dcGuEtt6JxXRw7UiO6aJ07MPCguJB9zXh/YgH +J3r1cTm1SM5MyD9O4YsekmHPSfQOMhKEa/BUb1D532vDXlhkt58a6Czi A==; X-CSE-ConnectionGUID: vzgi5ApUThOzWoWhmlYaCw== X-CSE-MsgGUID: EATjtLclQ56DVOfoOeEChA== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776119" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776119" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:41 -0700 X-CSE-ConnectionGUID: 9maZjgg8QpaqY3TB+XiLgw== X-CSE-MsgGUID: /7SGrj6jS3CI0qXbiWq9bg== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:40 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 03/10] x86/virt/tdx: Convert the features metadata reader Date: Fri, 18 Sep 2026 06:29:22 -0700 Message-ID: <20260918132946.76533-4-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 --- arch/x86/virt/vmx/tdx/tdx.c | 12 ++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 3 +++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 11 ----------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 0c8b571f5186..59e2396fea39 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -448,6 +448,18 @@ static int get_tdx_sys_info_version(struct tdx_sys_inf= o_version *version) return read_sys_metadata_table(version_mappings, 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_FEATURES0, tdx_features0), +}; + +static __init int get_tdx_sys_info_features(struct tdx_sys_info_features *= features) +{ + return read_sys_metadata_table(feature_mappings, 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.h b/arch/x86/virt/vmx/tdx/tdx.h index 44124f399703..582b6ff9a0bb 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -70,6 +70,9 @@ #define TDX_MD_FIELD_ID_MAJOR_VERSION 0x0800000100000004ULL #define TDX_MD_FIELD_ID_UPDATE_VERSION 0x0800000100000005ULL =20 +/* Class "TDX Module Info" */ +#define TDX_MD_FIELD_ID_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 9510bf5f6e7d..615f4d23c5d8 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; --=20 2.52.0 From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 3ACA54F93BD; Fri, 18 Sep 2026 13:31:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738309; cv=none; b=jHX7R/ZOiubzT41BMe2Oo2w5jktgJglTHkFpEeLp3O5VK/vTTHv3yIHoiliCTY8YQZZmfFQv1Lu4JRE1MkT8jibZ7TTWtSACl+aICIJD0KMNsQ8Aqlj7dy/8porg5GKXTYsF7X8IKf0PGMlwPNGgE03Urce4wWv3YKjgyyGeZKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738309; c=relaxed/simple; bh=kLCUBKUyKSBmyX86DoO24PXOVX3ZEud/eaxMU6SLFXA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kl0EWDDxXQz5RxlcGxNuMdO3BobxrIKiqWgBP0hSZejN63koHi8fq7ey/PZ8bRvTJ+mhQrhiwjWVbIJubP4a/C1IWS1rnf6KAi6cacEIzRh4AcZ7OX2FoZ89ayRrMH7RgdGeutC4hNOiliUWcJJ6tfwz110bdREhrzBfMHUhafg= 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=NuyOz7sh; arc=none smtp.client-ip=192.198.163.7 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="NuyOz7sh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738306; x=1821274306; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=kLCUBKUyKSBmyX86DoO24PXOVX3ZEud/eaxMU6SLFXA=; b=NuyOz7shSl01gPM384abxw0ALXqRv+xwvCOkyz2ChG9CbkAGvN6RMFDE NnJN7fM+LvelNg2g+Tse855Y8IHrJSmFk0i2E7r9qsZxoFUf31WSCLELr gCKThKwQ4AUtDzMxChMP8pZsCSoeNtYyWeUVXo64U8GPJyP0iRC4qsDCs jJgDT0FijpqrI6KTbA6czxZ2GcK2AisA31axzOQKnNOMAadyBrk4Hqwrc zGWRRaPYOV9pD8GWQzPJSpDwoBnxNoG4mQGI1XDfSJ9Jllia+oyATrlP/ QG65odFFob9xgHfLXFXX5FOr9MvhV8gZNM7JuyJHAfZ2clVio0ijb1Pe0 w==; X-CSE-ConnectionGUID: pQ9qMgp+SpqfOt+LbtJ/vA== X-CSE-MsgGUID: q9atIebmSvK2yacwta2Png== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776129" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776129" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:42 -0700 X-CSE-ConnectionGUID: FzWkJb1ITuG8OWjidp+m7g== X-CSE-MsgGUID: wox0qpMfSGejwwb/7Crt0Q== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:41 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 04/10] x86/virt/tdx: Convert the tdmr metadata reader Date: Fri, 18 Sep 2026 06:29:23 -0700 Message-ID: <20260918132946.76533-5-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 --- arch/x86/virt/vmx/tdx/tdx.c | 25 +++++++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 8 ++++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 31 --------------------- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 59e2396fea39..72aed3fc2b25 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -460,6 +460,31 @@ static __init int get_tdx_sys_info_features(struct tdx= _sys_info_features *featur return read_sys_metadata_table(feature_mappings, features); } =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(MAX_TDMRS, max_tdmrs), + TDX_SYSINFO_MAP_TDMR(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), + TDX_SYSINFO_MAP_TDMR(PAMT_4K_ENTRY_SIZE, pamt_4k_entry_size), + TDX_SYSINFO_MAP_TDMR(PAMT_2M_ENTRY_SIZE, pamt_2m_entry_size), + TDX_SYSINFO_MAP_TDMR(PAMT_1G_ENTRY_SIZE, pamt_1g_entry_size), +}; + +static __init int get_tdx_sys_info_tdmr(struct tdx_sys_info_tdmr *tdmr) +{ + return read_sys_metadata_table(tdmr_mappings, tdmr); +} + +static const struct field_mapping dpamt_mappings[] __initconst =3D { + TDX_SYSINFO_MAP_TDMR(PAMT_PAGE_BITMAP_ENTRY_BITS, pamt_page_bitmap_entry_= bits), +}; + +static __init int get_tdx_sys_info_tdmr_dpamt(struct tdx_sys_info_tdmr *td= mr) +{ + return read_sys_metadata_table(dpamt_mappings, tdmr); +} + #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 582b6ff9a0bb..9a8c32b180e1 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -73,6 +73,14 @@ /* Class "TDX Module Info" */ #define TDX_MD_FIELD_ID_TDX_FEATURES0 0x0A00000300000008ULL =20 +/* Class "TDMR Info" */ +#define TDX_MD_FIELD_ID_MAX_TDMRS 0x9100000100000008ULL +#define TDX_MD_FIELD_ID_MAX_RESERVED_PER_TDMR 0x9100000100000009ULL +#define TDX_MD_FIELD_ID_PAMT_4K_ENTRY_SIZE 0x9100000100000010ULL +#define TDX_MD_FIELD_ID_PAMT_2M_ENTRY_SIZE 0x9100000100000011ULL +#define TDX_MD_FIELD_ID_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL +#define TDX_MD_FIELD_ID_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 615f4d23c5d8..f0673dc28cb9 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; --=20 2.52.0 From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 E33FB4E780B; Fri, 18 Sep 2026 13:31:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738310; cv=none; b=tD09Mpz4RAiPMkQ9FAkbFwr1pW4TjuTpUB5AiWOJ9wdg6r9bR8slVFf264wYebVUaAs8E630E/jkEqGNMLjqWMUiGhyFlW4JhQuoORphRn1XmcqLquu6YU/mQY2JORbXkmFXkActRrxblP6tJY6GZk4Zj/TVjrXyMKVrim7FsJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738310; c=relaxed/simple; bh=lwNcoRlEiSRlNsPcBxB0DPO2KA+mLDpPqz3kB+WRv7I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZcS/ZL6GRtHZr+DQpt/XZoDqpK0ryOrXUyWHclGZWTkAeD3BL0jsc2XoErHktH5QfwWLJVqAQ+jZG0b1Y70oFweWl4GL091bi2ygUkKr0PETBX8SEf+kSWUhPWH8C2WiYTBTNtmcyHbcZyGwGim3TeScS6P0FtW4jb17sWa25O0= 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=GDhQCyv+; arc=none smtp.client-ip=192.198.163.7 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="GDhQCyv+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738307; x=1821274307; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=lwNcoRlEiSRlNsPcBxB0DPO2KA+mLDpPqz3kB+WRv7I=; b=GDhQCyv+/HeqsTymMQL/qN8zPQqWt8hbXIB6yOzB+a3KIoueAdyWHLhz 7kU5OAwNwp1/KobYxIyiNd+Iz3wgcd5kAkeXEqlPY8ItMGUHeyAae9YQj p3ck1fVOLto7C6SW4vuat4lpAA4yndVuqOpT+eo2nTnsU784jSkAhHv7m B6VPK2lFjXy1L/lvWpNhcPQWQxApcnH3Iwtmam/WC70bl4Kcr/HWUext/ DMsZXlSY2RE5kIhmnGjyskxDxAlU4n45gN2HOuL0GPHJbGkcjLZwRSWlb +kkzn+u/bKTWOHzB6ZZDD+w/spGzTQlMhfSv2JNfp0fL3NASyQD28cSRO Q==; X-CSE-ConnectionGUID: 8FajEZATQHaEPMJtEu65pA== X-CSE-MsgGUID: GZA74DNtQ2uJQ7chLqlNHw== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776140" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776140" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:43 -0700 X-CSE-ConnectionGUID: sfycbZzARhWTe1VZjUe4Bg== X-CSE-MsgGUID: UMVOYPXpQDuNoTdPl7JQng== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:42 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 05/10] x86/virt/tdx: Convert the td_ctrl metadata reader Date: Fri, 18 Sep 2026 06:29:24 -0700 Message-ID: <20260918132946.76533-6-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 --- arch/x86/virt/vmx/tdx/tdx.c | 14 ++++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 5 +++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 15 --------------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 72aed3fc2b25..7b6b1ee075a3 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -485,6 +485,20 @@ static __init int get_tdx_sys_info_tdmr_dpamt(struct t= dx_sys_info_tdmr *tdmr) return read_sys_metadata_table(dpamt_mappings, tdmr); } =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(TDR_BASE_SIZE, tdr_base_size), + TDX_SYSINFO_MAP_TD_CTRL(TDCS_BASE_SIZE, tdcs_base_size), + TDX_SYSINFO_MAP_TD_CTRL(TDVPS_BASE_SIZE, tdvps_base_size), +}; + +static __init int get_tdx_sys_info_td_ctrl(struct tdx_sys_info_td_ctrl *td= _ctrl) +{ + return read_sys_metadata_table(td_ctrl_mappings, td_ctrl); +} + #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 9a8c32b180e1..f33eb7dc7b45 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -81,6 +81,11 @@ #define TDX_MD_FIELD_ID_PAMT_1G_ENTRY_SIZE 0x9100000100000012ULL #define TDX_MD_FIELD_ID_PAMT_PAGE_BITMAP_ENTRY_BITS 0x9100000000000013ULL =20 +/* Class "TD Control Structures" */ +#define TDX_MD_FIELD_ID_TDR_BASE_SIZE 0x9800000100000000ULL +#define TDX_MD_FIELD_ID_TDCS_BASE_SIZE 0x9800000100000100ULL +#define TDX_MD_FIELD_ID_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 f0673dc28cb9..c6b375771265 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; --=20 2.52.0 From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 7794C4F85A2; Fri, 18 Sep 2026 13:31:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738312; cv=none; b=HiTI+7RrsqV/RStbwhbKon8fwkYwnmyI818JM7cYSBB1nixD1G5gxTivrBiUrIM4JcMvbvkneT3ruMuH88L4uDFbo4MiWGynfSpHhLOSI30vu+xkr20SyYyZZV92IgfayAjP4VCw3l18nIeibXsYeRUGuOoTiWi7Mn530qlmVrk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738312; c=relaxed/simple; bh=PdZL1Zy8dZu9x5LoWVtoq9Gzh9/cpI1qgHt6JEDiWX8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sRkxz2lE2fuiRglaoQT/CcDAC4oIK28OuWxjJ6NuiIKXnJSd9/prIqjcQy41x/W/Oocepps4eaNY2ejWqECVtvjynTH9FytvFm0zJdqaQgNvxn4dt9DOHYc+ps+rtYKp/EAjJM7mkf3b69SozqsWAxEd1zz8yEEBQqKQFZ/tYWQ= 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=SaMrzRQ8; arc=none smtp.client-ip=192.198.163.7 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="SaMrzRQ8" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738310; x=1821274310; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PdZL1Zy8dZu9x5LoWVtoq9Gzh9/cpI1qgHt6JEDiWX8=; b=SaMrzRQ8A9Utmm9x6l39i1G6UG6OJ5o2arlVReNVFjMO7CcQbtOMImgh F9uSahP66VQHxmkUkVZAeECTforApAdhkBkJ43TzUFyRuy6Z3bH6DaaSP Mu0w+YuRBwITvqyIE6yHLWEUiCW32oIsBz8ffbsZPIHUZ7DHnQLIY4QwI t+OQLvhtJna9sgYprqpzdaWApKKO3/cTV51mQofZjp2Yey07ejGQjQ7Ji k9Vclg/UnJRx6kywKYy4g0gXILVUwoGbXYWDylp29YDKEYH5Qk1Y8Wa2m b1guBirWOKn+ojZZsr9aGruSmfuXuShrqmLFMTmGouiVTNREdV+/YXETC w==; X-CSE-ConnectionGUID: 61z2BhTpS9++JPxox1vxgQ== X-CSE-MsgGUID: HzyJ3Xc7Q72hjKO+G+VIXQ== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776149" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776149" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:44 -0700 X-CSE-ConnectionGUID: 8YcLB14GQi+GMgSN+e1+Qg== X-CSE-MsgGUID: yw9jYRpyTHqrJYqWr+Ghdg== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:43 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 06/10] x86/virt/tdx: Convert the handoff metadata reader Date: Fri, 18 Sep 2026 06:29:25 -0700 Message-ID: <20260918132946.76533-7-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 --- arch/x86/virt/vmx/tdx/tdx.c | 12 ++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 3 +++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 13 ------------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 7b6b1ee075a3..2bd7a2c9432b 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -499,6 +499,18 @@ static __init int get_tdx_sys_info_td_ctrl(struct tdx_= sys_info_td_ctrl *td_ctrl) return read_sys_metadata_table(td_ctrl_mappings, td_ctrl); } =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(MODULE_HV, module_hv), +}; + +static int get_tdx_sys_info_handoff(struct tdx_sys_info_handoff *handoff) +{ + return read_sys_metadata_table(handoff_mappings, handoff); +} + #include "tdx_global_metadata.c" =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 f33eb7dc7b45..6f99e4cdcc19 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -86,6 +86,9 @@ #define TDX_MD_FIELD_ID_TDCS_BASE_SIZE 0x9800000100000100ULL #define TDX_MD_FIELD_ID_TDVPS_BASE_SIZE 0x9800000100000200ULL =20 +/* Class "TDX Module Handoff" */ +#define TDX_MD_FIELD_ID_MODULE_HV 0x8900000100000000ULL + /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 diff --git a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c b/arch/x86/virt/vm= x/tdx/tdx_global_metadata.c index c6b375771265..36bbf42dead9 100644 --- a/arch/x86/virt/vmx/tdx/tdx_global_metadata.c +++ b/arch/x86/virt/vmx/tdx/tdx_global_metadata.c @@ -40,19 +40,6 @@ static __init int get_tdx_sys_info_td_conf(struct tdx_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 Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 8BA004FC346; Fri, 18 Sep 2026 13:31:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738314; cv=none; b=dBEYnNF0WUKxPb5EOoylwb4gYWcOa6RAQtCeB1vwQGTu2S5FCoRr8eIsh2tzclsJkJvVSl1+Dp0sLqLH0eduwc0IUL2OAh5Pk+V9P9ANkCUina8KupaYE3sKkZE3jmxLZQZU5Wd/tPl48pSxUc0ZU9clgMZvaEHxw2Gk1qNbBp0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738314; c=relaxed/simple; bh=pZvjqoF+nZH/LY0DumeSYv6a5C7rzqey4Y4CNxlYuDw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qXFmJMM8Lby41KToWWszpxkGsjZwxpZNBjVQg9epk4lnnhx9cbbJp53IcLKUgyzwaMVhfy9TmINCE/Rks8lQyp0rHQH4IDq2aokQoA47GGnByWepGyV5pbW3dhhL7YgpVJEEvxgSX45G0gBf/eCOc6YmJkWYd7lj3Mxc5/5lGLA= 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=LdnOUYaU; arc=none smtp.client-ip=192.198.163.7 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="LdnOUYaU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738311; x=1821274311; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=pZvjqoF+nZH/LY0DumeSYv6a5C7rzqey4Y4CNxlYuDw=; b=LdnOUYaUeKRtYyJMd7P8/E+6UZl6IkD0jfEThGNCeJTrLY2hUo0msA63 q4aLAY7uWkP9yJofEd94411Jp9ljmJB2bjs9bwpZly8uZHwGmkGGyKZWe C/pQyG58b75OmRsgEH4j+cpPMj1I7kEktPR9563ITva7SNjKqzlRCe+Ej I902ctrgbJZubXxnQjPdAMc3VzNuW8QMlewlOqtB9z8z/vVtwvBeCu0T4 MAoDBTU20jahXpqrKXFPaGhikzqv+Ce4w+blrO6FIXr88tnjqejOMkO38 gFPkycFjbSu2HZeB7UNv4U7oZaB+Yr0GJ175ox4fH+ziTC9PIL+4YYYwS w==; X-CSE-ConnectionGUID: 1h6hrqhFRrWvgijeuVy5Aw== X-CSE-MsgGUID: SVZQCkHXQUW/JCmHra2Bvg== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776156" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776156" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:45 -0700 X-CSE-ConnectionGUID: rvj0ysnXTZqLOnaW3AhpVg== X-CSE-MsgGUID: BRfPrKs0Ta+AtQS0Re0jFg== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:44 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 07/10] x86/virt/tdx: Convert the td_conf metadata reader Date: Fri, 18 Sep 2026 06:29:26 -0700 Message-ID: <20260918132946.76533-8-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 --- arch/x86/virt/vmx/tdx/tdx.c | 51 +++++++++++++++++++++ arch/x86/virt/vmx/tdx/tdx.h | 10 ++++ arch/x86/virt/vmx/tdx/tdx_global_metadata.c | 33 ------------- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 2bd7a2c9432b..571c3bb50532 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -511,6 +511,57 @@ static int get_tdx_sys_info_handoff(struct tdx_sys_inf= o_handoff *handoff) return read_sys_metadata_table(handoff_mappings, handoff); } =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(ATTRIBUTES_FIXED0, attributes_fixed0), + TDX_SYSINFO_MAP_TD_CONF(ATTRIBUTES_FIXED1, attributes_fixed1), + TDX_SYSINFO_MAP_TD_CONF(XFAM_FIXED0, xfam_fixed0), + TDX_SYSINFO_MAP_TD_CONF(XFAM_FIXED1, xfam_fixed1), + TDX_SYSINFO_MAP_TD_CONF(NUM_CPUID_CONFIG, num_cpuid_config), + TDX_SYSINFO_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_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_MD_FIELD_ID_CPUID_CONFIG_* 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_MD_FIELD_ID_CPUID_CONFIG_LEAVES + i, + &td_conf->cpuid_config_leaves[i]); + if (ret) + return ret; + + for (j =3D 0; j < 2; j++) { + ret =3D read_sys_metadata_field( + TDX_MD_FIELD_ID_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 6f99e4cdcc19..407aded3137a 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -86,6 +86,16 @@ #define TDX_MD_FIELD_ID_TDCS_BASE_SIZE 0x9800000100000100ULL #define TDX_MD_FIELD_ID_TDVPS_BASE_SIZE 0x9800000100000200ULL =20 +/* Class "TD Configurability" */ +#define TDX_MD_FIELD_ID_ATTRIBUTES_FIXED0 0x1900000300000000ULL +#define TDX_MD_FIELD_ID_ATTRIBUTES_FIXED1 0x1900000300000001ULL +#define TDX_MD_FIELD_ID_XFAM_FIXED0 0x1900000300000002ULL +#define TDX_MD_FIELD_ID_XFAM_FIXED1 0x1900000300000003ULL +#define TDX_MD_FIELD_ID_NUM_CPUID_CONFIG 0x9900000100000004ULL +#define TDX_MD_FIELD_ID_MAX_VCPUS_PER_TD 0x9900000100000008ULL +#define TDX_MD_FIELD_ID_CPUID_CONFIG_LEAVES 0x9900000300000400ULL +#define TDX_MD_FIELD_ID_CPUID_CONFIG_VALUES 0x9900000300000500ULL + /* Class "TDX Module Handoff" */ #define TDX_MD_FIELD_ID_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 36bbf42dead9..779c26e68f02 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 Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 893954FC8F8; Fri, 18 Sep 2026 13:31:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738315; cv=none; b=W+BZX1RWtVBpsIswOmYp29AWi5scTogKwE6ZEJTHmpzcjODFimhmcLj30+0oxXKOfZVYRNh7p1yj5Qjb1Y4T2dROKBQmmuf56/YFHxpwcQh5U8xqg62UJgZQjcJHGm/jfLvG7jTgjBUZbco1XB0dZU8Vb8LL8yxMsygbS4ywwmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738315; c=relaxed/simple; bh=mMGCeH//SNrx1fHXEwq75XhJmx2UaZvdS2pGuD3H8lE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q5CvPc9wKjKOIVAP+H0bRkA6VudOUQ7zQZmpG6njwQ/kaVnxvefN73C1aMKpHsBgZEpyiwGOzlrZkw6m8xpdhEPjbppwDEFgI+Y1bDLOsYBtVmoKXwEKR9ZfhaYAssa5GUyEnD3/0hmuRkGfj5t34rOMZIO+YQbViKS9DpzOjVQ= 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=N4vpbGSM; arc=none smtp.client-ip=192.198.163.7 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="N4vpbGSM" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738313; x=1821274313; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mMGCeH//SNrx1fHXEwq75XhJmx2UaZvdS2pGuD3H8lE=; b=N4vpbGSM0OLcXe/ZnKYOIw8aVG5gFyJH1VesV8DOc6x3N5SWbtv1RpCn YQSRmbhcjWbUJTbCXukE8kcXm5RWFbY2E4p12IwMbtTX2DmAMD0HMvsom GyLM+52xoMVkX8wn53serAw2CDAaHZlpDBuF+LBRtg8kpkayX3rfUf/a2 TqBnk6nRBAZWAtQnnNRfOOk0stiM7UTQOtS6q0uxrI3N9hHdQ2LuSVLla Kx4ncWbBcS2fFcf7LRitqEse8E+ZGh5/5Gfe58CPjrHgsQcO8wVrJthPm 2lUKokckrbGOFw1Zi8og3PDndfjyApqjFJbQELk9+eIZKlc0993vqcRSe g==; X-CSE-ConnectionGUID: TLHdbFvuQt+3kIyh+oA7oQ== X-CSE-MsgGUID: g5vvXq0fRH+YqjDXCfQgnA== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776164" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776164" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:46 -0700 X-CSE-ConnectionGUID: wmHZ6n1BSwCgsVw9Xgnkbw== X-CSE-MsgGUID: Sqcab6TgQ6+L/aSRxQVnXQ== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:45 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 08/10] x86/virt/tdx: Remove tdx_global_metadata.c Date: Fri, 18 Sep 2026 06:29:27 -0700 Message-ID: <20260918132946.76533-9-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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 571c3bb50532..9f9f2ef80f55 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -562,7 +562,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 ?: 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); + + /* + * 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 get_tdx_sys_info_tdmr_dpamt(&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 779c26e68f02..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 ?: 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); - - /* - * 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 get_tdx_sys_info_tdmr_dpamt(&sysinfo->tdmr); - - return ret; -} --=20 2.52.0 From nobody Fri Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 0066F4FD29D; Fri, 18 Sep 2026 13:31:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738317; cv=none; b=G0mORQgCd97K8L27G9lHyCgeAGImxVXWkqBlAoEJn70oAuTU6ONTULDvOD8sy/Y1iEXH4s9K3iSPczA/0K6Lz5pJ56TalNwuOLb/cYrMroOEyueiXqNb0wq+aEcqyYBd4Lh+J9znsAFPyceG4161jtGne+tTGtmvkkPPAdFu7q8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738317; c=relaxed/simple; bh=fKmfnpJ5kVfOzdLTI5grolxxwlUvkZawqEiCJanMfzo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kZgDHe9bNxvT6WUGo5qwzS69KWffSJNdaASidp6eWTCjlnCGIgGGwSCtznmAGmshaI8UcjKT2ewdCCrBlPpEsvz38aZXb2NFfqsGwtyXZKUOXyvQSZQwe9q8nz24q3g4gTU80hzf2C1n1x+m0pfSuy7w+HCrsRfJnQdNyh4LZQM= 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=KCl6lnGb; arc=none smtp.client-ip=192.198.163.7 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="KCl6lnGb" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738313; x=1821274313; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=fKmfnpJ5kVfOzdLTI5grolxxwlUvkZawqEiCJanMfzo=; b=KCl6lnGbmbm/hl4OyRSplkSSl+PxJ1uqmP1F79klMFC/y2zaveUXJFgb mG6aBcxF4Mw0HZ6e4z8dsa8ZMnt2wPMLLYtrqMXn7zSJ05kPrb52/Tpj5 OPBqRvhrTyrJyfeul6C7C+b1FLgCSpZMq/bF7Xss9oMQcizfqmlUtJtgp /HnYvBaMdwmb0/drxR/lTguzSkgnK8ZWY+reJTOVyFe9W3Ob+Y2ftSpgQ JkjklFRsgpv2hTT/tfo1vGkl+j4IoLK4rpJp81yTQh1uP8BcYxlLj+aIH c4XI7Uyj2LaocmBrfCxsNhPmvF9q24tOBGCBofJYRSs3toonRyOISGJG+ w==; X-CSE-ConnectionGUID: Lp5hDSlgSNKGW8+WEofJpw== X-CSE-MsgGUID: nMufvkT0SQS842k/l3xv9w== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776172" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776172" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:46 -0700 X-CSE-ConnectionGUID: zbHHxWCuRx+WBVmX7P34lg== X-CSE-MsgGUID: rngrD0LATMy6ccLzJ2AwCw== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:46 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 09/10] x86/virt/tdx: Use early returns in get_tdx_sys_info() Date: Fri, 18 Sep 2026 06:29:28 -0700 Message-ID: <20260918132946.76533-10-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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. AI was used under supervision to review code and workshop logs. Signed-off-by: Chao Gao --- arch/x86/virt/vmx/tdx/tdx.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 9f9f2ef80f55..9d5a3296d3c0 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -564,19 +564,33 @@ 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; + + 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; + + ret =3D get_tdx_sys_info_td_conf(&sysinfo->td_conf); + if (ret) + return ret; =20 /* * The kernel supports using TDX without DPAMT, so @@ -584,10 +598,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 get_tdx_sys_info_tdmr_dpamt(&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 Sep 25 00:02:31 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) (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 24CC14FDA4B; Fri, 18 Sep 2026 13:31:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738318; cv=none; b=Xv4YxgVR0UqEiV9A1D2jgaPfM1rleuRNTGYCj2SYgVXH/iRZ6dLWBl68t0/hLYzkmI8skL2AwhLQMjbwSb7nFMjiSGMiBMATmmle0eUr7ZpfQPImF7r/kWBnGACpWyetTmp/xTIKBfhynIUg1Wc/pTqZNUcWiZD5Cz8muBRL93Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738318; c=relaxed/simple; bh=MNmxRyRUy3Nzhgb9gzZzsOfr9IqYajZHJ+kbSSWtbJQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ptkq1TGoplQfoD7XofOI6YSbY1mEVYxU8K4/FjBva4y0XVngXJfUrannAPtfH+TpNBxWkWuv4PSrZBhTWmVyUHf1Jv1cKEQlz0aMhBD40AAwC22zbi3ZXd7mnXQW8qat9AFyCz0Q9cufPwl/vZCxCqwHjDCHwW48teegadURNKA= 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=PCu3p9SC; arc=none smtp.client-ip=192.198.163.7 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="PCu3p9SC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1789738315; x=1821274315; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MNmxRyRUy3Nzhgb9gzZzsOfr9IqYajZHJ+kbSSWtbJQ=; b=PCu3p9SCncEhyS7+6fdvfms6d1hNY3w2hZ0E1FKAF0eUPmhovSIttb17 AP6Axgtr/TCvvqZ5/un0qmo8Qp9Qw8562Oy8sSg1cOsCt8h5wpawWDWoA 13bG8h57/NG+VAcc/VMzOUta0CMlAyvi3yVgK0rEFo0VucVUnNcL/DxlD 46tZ1O7DnFmTt8WePElZa82N8E6uUXsGU2Sur143tTShe1CNYXMf6KynS zpCsfP8vjd7w8XFcKXjl3Pw2uSBxgO7pUuAtOgkk8Gemsw7872yI3+4qG TvnWcsTeoNFUQYBDKp5VMOjQMoGmg/1vGdP1o6WA11FOt/gFRhOPL5weR w==; X-CSE-ConnectionGUID: XLITr3cLQJuhPbzOiBNLHA== X-CSE-MsgGUID: 0IbP5kyWQrycozzL0zP5DA== X-IronPort-AV: E=McAfee;i="6800,10657,11908"; a="115776185" X-IronPort-AV: E=Sophos;i="6.27,109,1787036400"; d="scan'208";a="115776185" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:47 -0700 X-CSE-ConnectionGUID: dTQIsb7tSBm24NV2/yGdSg== X-CSE-MsgGUID: 8B4hV1w3RLizDNzg9vbkAA== X-ExtLoop1: 1 Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Sep 2026 06:31:47 -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 , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Kiryl Shutsemau , Rick Edgecombe Subject: [RFC PATCH v2 10/10] x86/virt/tdx: Verify structure member sizes against metadata field IDs Date: Fri, 18 Sep 2026 06:29:29 -0700 Message-ID: <20260918132946.76533-11-chao.gao@intel.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260918132946.76533-1-chao.gao@intel.com> References: <20260918132946.76533-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" A metadata field ID encodes the size of a single element. TDX_SYSINFO_MAP() instead derives the copy size from the destination member, and nothing verifies that the two sizes agree. A wrongly typed member is a kernel bug: declaring a u32 for an 8-byte metadata field would silently store only its low 4 bytes. Add macros to extract the element size encoded in a field ID and verify it against the destination member size at build time. 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. AI was used under supervision to review code and workshop logs. It suggested extracting TDX_MD_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 --- arch/x86/virt/vmx/tdx/tdx.c | 12 +++++++++++- arch/x86/virt/vmx/tdx/tdx.h | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 9d5a3296d3c0..6dc328561009 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -424,11 +424,21 @@ static int __read_sys_metadata_table(const struct fie= ld_mapping *mappings, return 0; } =20 +/* + * The size encoded in the field ID and the size of the destination C + * member must agree. + */ +#define TDX_MD_FIELD_SIZE_CHECK(_field, _type, _member) \ + BUILD_BUG_ON_ZERO(sizeof_field(_type, _member) !=3D \ + TDX_MD_FIELD_ELE_SIZE(TDX_MD_FIELD_ID_##_field)) + #define TDX_SYSINFO_MAP(_field, _type, _member) \ { \ .field_id =3D TDX_MD_FIELD_ID_##_field, \ .offset =3D offsetof(_type, _member), \ - .size =3D sizeof_field(_type, _member), \ + .size =3D sizeof_field(_type, _member) + \ + TDX_MD_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 407aded3137a..17fdb682410e 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -99,6 +99,21 @@ /* Class "TDX Module Handoff" */ #define TDX_MD_FIELD_ID_MODULE_HV 0x8900000100000000ULL =20 +/* + * Sub-field definitions of TDX global metadata field IDs. + * + * See "Metadata Field Identifier" in the Intel TDX Module ABI + * Specification. + * + * - Bit 33:32: ELEMENT_SIZE_CODE -- log2 of a single metadata + * element's size in bytes + */ +#define TDX_MD_FIELD_ELE_SIZE_CODE(field_id) \ + (((field_id) & GENMASK_ULL(33, 32)) >> 32) + +#define TDX_MD_FIELD_ELE_SIZE(field_id) \ + (1 << TDX_MD_FIELD_ELE_SIZE_CODE(field_id)) + /* TDX page types */ #define PT_NDA 0x0 #define PT_RSVD 0x1 --=20 2.52.0