From nobody Sun Feb 8 18:28:39 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 626686BB28 for ; Tue, 26 Mar 2024 10:23:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448632; cv=none; b=C72nQpQRV3IP2L6owYBDm50fvjCtR9q3v+camSA5GMDBr8ISABH396awXuK97qgrzTV+eIMlHyOnxnCPm8SLBezAhsm5R1+MO+kljsNrlQUYqcRVx7q+VX6qRzmnwskGChlEDFZ2+k71TeAPVPA6kiiMU1uOSVHVBp9WEfLHV40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448632; c=relaxed/simple; bh=oDcmPTmUa3+5vWVp7KasH47l5t7W1RJvL2Omm6CJWHs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tFvNLLaGikrXp2z2BEATuWzhRqrJLvHSs7BCXmx/iapI+1CSVSAdvX0cSB2l52lbaN0O4zrdCv6jCsgZHnE9xAOpRuBN5ER/ZJITzNgXdlPuX5zVvvV1Tfa0m2rALifAFfwdRUeZl1rwBwRFWeXrFftaEFaV0C7CARbOojv+2mo= 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=c04hqpIO; arc=none smtp.client-ip=192.198.163.15 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="c04hqpIO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711448631; x=1742984631; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=oDcmPTmUa3+5vWVp7KasH47l5t7W1RJvL2Omm6CJWHs=; b=c04hqpIOHbVR4d/1YYtfdBnoWQ9O42E0tVzkZamKAhq9Sb8mysdH+0Gg OEYNKj+Ks6IutcMoO8aOMCT2lSXeK5wW7YLA61ahppdNQskVkBLYzpd/X Z1nxRHeqL8SnodZwlrJfhGNDQKacplqjyC1sDVixSoKzWqWwa3+N7PigO lgxn9AtAGWeJDki6SM/Qz/VOiI+US93f1SAwYtwRrPqLVzY5Rlxlaf2r5 HODB4M5WUKUCH6oU/oXLdgcx5Fs/s46Z3OpGKRSyqiT4tMS5jlgbzzNc2 lph0GmDhd9NNVHXVNq6mnLQAEMm2ejBqN5rxcYy/hE/WEGgxQKD2VHoUJ Q==; X-CSE-ConnectionGUID: zvhRZq+TRyq4yj1qdfTRcw== X-CSE-MsgGUID: YGQwqbM3Rq6ejVjsr0uXLw== X-IronPort-AV: E=McAfee;i="6600,9927,11024"; a="6678717" X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="6678717" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:51 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="39029362" Received: from pyong-mobl2.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.209.75.208]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:48 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, isaku.yamahata@intel.com, jgross@suse.com, binbin.wu@linux.intel.com, kai.huang@intel.com Subject: [PATCH v2 1/5] x86/virt/tdx: Rename _offset to _member for TD_SYSINFO_MAP() macro Date: Tue, 26 Mar 2024 23:23:28 +1300 Message-ID: X-Mailer: git-send-email 2.43.2 In-Reply-To: References: 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" TD_SYSINFO_MAP() macro actually takes the member of the 'struct tdx_tdmr_sysinfo' as the second argument and uses the offsetof() to calculate the offset for that member. Rename the macro argument _offset to _member to reflect this. Signed-off-by: Kai Huang Reviewed-by: Kirill A. Shutemov Reviewed-by: Binbin Wu --- arch/x86/virt/vmx/tdx/tdx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 4d6826a76f78..2aee64d2f27f 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -297,9 +297,9 @@ struct field_mapping { int offset; }; =20 -#define TD_SYSINFO_MAP(_field_id, _offset) \ +#define TD_SYSINFO_MAP(_field_id, _member) \ { .field_id =3D MD_FIELD_ID_##_field_id, \ - .offset =3D offsetof(struct tdx_tdmr_sysinfo, _offset) } + .offset =3D offsetof(struct tdx_tdmr_sysinfo, _member) } =20 /* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */ static const struct field_mapping fields[] =3D { --=20 2.43.2 From nobody Sun Feb 8 18:28:39 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 4652C6E616 for ; Tue, 26 Mar 2024 10:23:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448636; cv=none; b=EXZV44g2SVt368I6+l+SgQS+f7oXRf+Jhu2Hj6Ifx0NRDaBekhVLz/deV2DTJhAEBSmG9aNbKWsLvr81nuLCpTJ1vNbipkoDdxdZ1nphA+UuxnUCkBWryH6XGJu/1WmMA89+dos0bfHLnMEkg2h3Zh1hyXFV3hyt9teWENHiNXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448636; c=relaxed/simple; bh=51JNBBGZzWTv/aoufz0WmxORKDck5dLGXWqspgSfLHA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nIRyAIElDB3RqOuaR0Xz/f+qLaiDrSGZ9b3Y1bFSl33T67JLxABH2L1sxVE0u7cdt7rkRQuByagI6qd0VkALNPDulIcKn2tM0d4wH3FEdqADeJ4X6G9Bon0fN7Z0NEB6oWNNVUe9yCYLErGM2rrSLI8sWpvgRWzDaruSLd4A7zg= 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=EPykkJJy; arc=none smtp.client-ip=192.198.163.15 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="EPykkJJy" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711448635; x=1742984635; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=51JNBBGZzWTv/aoufz0WmxORKDck5dLGXWqspgSfLHA=; b=EPykkJJy3KPZzDg4/XC4mENrJJHG9spH8wVGHAIkPRn7Lw+pZthXJnjS UTKcSJNGFkd5AweQynXRXmpF5aRbHLV1WsKUpPBuvVLxZ9zGuJBlTn76l UrPEfPqffY9l/giuWLmcH9EaxdZWi/WufJ7oWpArxTGyLYX5Cqwo30R0H vtRzVZMA+m64foh6JrKVvimh0+g2ACuhz6X/XO2EUUEeHT3OsIE4zOWUm gYfo80Q9F626spZjZrceV42CSLnOZa+PDO7J8fLSpjiRiQWzpHER0wGtX twb5UTKq3ZoZIdbz26lw1N3wwD0yX6ypyrg8o0Mxl61bkd3eayG+AP79E w==; X-CSE-ConnectionGUID: tvk0VDYoTPuvW4VHShPfgw== X-CSE-MsgGUID: L8WkJ/ItTTOO6g3nYCg9/Q== X-IronPort-AV: E=McAfee;i="6600,9927,11024"; a="6678735" X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="6678735" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="39029377" Received: from pyong-mobl2.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.209.75.208]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:52 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, isaku.yamahata@intel.com, jgross@suse.com, binbin.wu@linux.intel.com, kai.huang@intel.com Subject: [PATCH v2 2/5] x86/virt/tdx: Move TDMR metadata fields map table to local variable Date: Tue, 26 Mar 2024 23:23:29 +1300 Message-ID: <8720e0316a713c06d314e7c85fac5b1c501ef4cd.1711447449.git.kai.huang@intel.com> X-Mailer: git-send-email 2.43.2 In-Reply-To: References: 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 kernel reads all TDMR related global metadata fields based on a table which maps the metadata fields to the corresponding members of 'struct tdx_tdmr_sysinfo'. Currently this table is a static variable. But this table is only used by the function which reads these metadata fields and becomes useless after reading is done. Change the table to function local variable. This also saves the storage of the table from the kernel image. Signed-off-by: Kai Huang Reviewed-by: Kirill A. Shutemov Reviewed-by: Binbin Wu --- arch/x86/virt/vmx/tdx/tdx.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 2aee64d2f27f..cdcb3332bc5d 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -301,17 +301,16 @@ struct field_mapping { { .field_id =3D MD_FIELD_ID_##_field_id, \ .offset =3D offsetof(struct tdx_tdmr_sysinfo, _member) } =20 -/* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */ -static const struct field_mapping fields[] =3D { - TD_SYSINFO_MAP(MAX_TDMRS, max_tdmrs), - TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), - TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]), - TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]), - TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]), -}; - static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo *tdmr_sysinfo) { + /* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */ + const struct field_mapping fields[] =3D { + TD_SYSINFO_MAP(MAX_TDMRS, max_tdmrs), + TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), + TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]), + TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]), + TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]), + }; int ret; int i; =20 --=20 2.43.2 From nobody Sun Feb 8 18:28:39 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 29EA0679F3 for ; Tue, 26 Mar 2024 10:23:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448640; cv=none; b=kDesUFV2tBymB3q0b84i6fRPItxCdZSS5smYqQli93x8wVxkdBHLzz1LPdLRr/Z+qqHydkOz9Dv7wtpOZZJn9oWhGWfxcIeYP6VRQueJiFdJ63h566O6+iPmRWF9GNomuvpi1TC6EQ1qX2bMa/hy7pbuyuLBH0XUTBjK2TKlJS0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448640; c=relaxed/simple; bh=VOfiTsARqXildYZYXwqKq2uHeJt8ZUUANmWAlLL/yeo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jfz3egS09pkWEUAE3sX1lAPdbt9RS8qUNaPbP5O7S31Zo/J5wa1+OUiPpy3H2PYNVK3peFP1ajIxonxpjgrQ59Rnw1sOkG3enJ+e6zXmf8uq8ECeuy62b4JzGlsuwWyVOa+QGv//qZB0EJL20YaO3SDH1O/TFi3Bi9sZh09scyQ= 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=a3dbxA+X; arc=none smtp.client-ip=192.198.163.15 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="a3dbxA+X" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711448639; x=1742984639; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VOfiTsARqXildYZYXwqKq2uHeJt8ZUUANmWAlLL/yeo=; b=a3dbxA+XpILIZPTBCknemRIOu/QFRRxA9p93OCq0D3cI3x8m1/iMBeXJ F1z8beirsVa69Sgnj+7Ud0m1dUIbLvRah5CoJxeFuTWTp1n5waGuWbGZC azWn1pLHYUZdEenH5O0FNlDmxEkz9wroiqXCTFBEClgkQw59wjXg95T+R 2Ts7W9MRWhzMPG+CbjXjzNJHuxc5+OEOcbVb2gJZA27aJstcHkgXSXaRg Ql7vFUGqcBK03LFY+VKuAfRwLhFTAhlQhCGTjR8R6ozD8Y6kPntw+WNtN 5XNTpBNm6ZFPQn1okI0pAQc9qu+xNXJdsXYznR7/LReERXSkvDc5h1rro Q==; X-CSE-ConnectionGUID: V+XeYC9kQ1eoVUhPji5iEA== X-CSE-MsgGUID: KIwPzEoXRlmWt+36CAHUDw== X-IronPort-AV: E=McAfee;i="6600,9927,11024"; a="6678753" X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="6678753" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="39029392" Received: from pyong-mobl2.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.209.75.208]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:23:56 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, isaku.yamahata@intel.com, jgross@suse.com, binbin.wu@linux.intel.com, kai.huang@intel.com Subject: [PATCH v2 3/5] x86/virt/tdx: Unbind global metadata read with 'struct tdx_tdmr_sysinfo' Date: Tue, 26 Mar 2024 23:23:30 +1300 Message-ID: <523bf31a242c022ced57e41e0d0eb58174a9bb71.1711447449.git.kai.huang@intel.com> X-Mailer: git-send-email 2.43.2 In-Reply-To: References: 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" For now the kernel only reads TDMR related global metadata fields for module initialization, and the metadata read code only works with the 'struct tdx_tdmr_sysinfo'. KVM will need to read a bunch of non-TDMR related metadata to create and run TDX guests. It's essential to provide a generic metadata read infrastructure which is not bound to any specific structure. To start providing such infrastructure, unbound the metadata read with the 'struct tdx_tdmr_sysinfo'. Signed-off-by: Kai Huang Reviewed-by: Kirill A. Shutemov Reviewed-by: Binbin Wu --- arch/x86/virt/vmx/tdx/tdx.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index cdcb3332bc5d..eb208da4ff63 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -273,9 +273,9 @@ static int read_sys_metadata_field(u64 field_id, u64 *d= ata) =20 static int read_sys_metadata_field16(u64 field_id, int offset, - struct tdx_tdmr_sysinfo *ts) + void *stbuf) { - u16 *ts_member =3D ((void *)ts) + offset; + u16 *st_member =3D stbuf + offset; u64 tmp; int ret; =20 @@ -287,7 +287,7 @@ static int read_sys_metadata_field16(u64 field_id, if (ret) return ret; =20 - *ts_member =3D tmp; + *st_member =3D tmp; =20 return 0; } @@ -297,19 +297,22 @@ struct field_mapping { int offset; }; =20 -#define TD_SYSINFO_MAP(_field_id, _member) \ - { .field_id =3D MD_FIELD_ID_##_field_id, \ - .offset =3D offsetof(struct tdx_tdmr_sysinfo, _member) } +#define TD_SYSINFO_MAP(_field_id, _struct, _member) \ + { .field_id =3D MD_FIELD_ID_##_field_id, \ + .offset =3D offsetof(_struct, _member) } + +#define TD_SYSINFO_MAP_TDMR_INFO(_field_id, _member) \ + TD_SYSINFO_MAP(_field_id, struct tdx_tdmr_sysinfo, _member) =20 static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo *tdmr_sysinfo) { /* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */ const struct field_mapping fields[] =3D { - TD_SYSINFO_MAP(MAX_TDMRS, max_tdmrs), - TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), - TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]), - TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]), - TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]), + TD_SYSINFO_MAP_TDMR_INFO(MAX_TDMRS, max_tdmrs), + TD_SYSINFO_MAP_TDMR_INFO(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), + TD_SYSINFO_MAP_TDMR_INFO(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4= K]), + TD_SYSINFO_MAP_TDMR_INFO(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2= M]), + TD_SYSINFO_MAP_TDMR_INFO(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1= G]), }; int ret; int i; --=20 2.43.2 From nobody Sun Feb 8 18:28:39 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 2A08A71727 for ; Tue, 26 Mar 2024 10:24:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448644; cv=none; b=sDZLKFEEySO9VCHvYThil+oaWnY7NXeTqsfrpejCT43L+vwOZ8Rx/GerY6RTZK44/kh+GincWpFCPZ8a/TDOmQH9CmWTnyo0U4UcF8cCT5G0vo+bCzGpC5ZUyq/5Qt2tQdpu4Pqv7h1pbCbsUa0mKh/yAAPCqfamW0upnUCibLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448644; c=relaxed/simple; bh=0eBX029BCiLTue40MgYy0Z6NggPwsRuK/phCsbkLIbo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TeH1Cj2JKonOThzpa8zniO2WezntYFuBtdASIyMKJ+ZOOlY+5a1+Km06/CdNxax48w91lIPxaYPUX9uVfFN6Q1nIjtijEEFk2QqR6EkhRmnfKxaSqpAowk+VQuGmJ0fyVveowdBjAlov4jplbKY9Ez0Hv3lnrYS2VJ+oCcCFqBs= 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=h08lFlKR; arc=none smtp.client-ip=192.198.163.15 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="h08lFlKR" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711448643; x=1742984643; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0eBX029BCiLTue40MgYy0Z6NggPwsRuK/phCsbkLIbo=; b=h08lFlKRg/2SF86g6i9Ji6K90wqWEb6Dy9XOYfJRCsBp0+0w6sibiKGA UpK6o5ittE5K+8EPKVu6LzIUvTf6wIaYpxsVZv1W9PFJf8iRS6Kr4bk0V Q62g5xVF6NHjwxlvNjMDWXs3dtTDQ4VqW4w2iU69QgSnz0o7UML0VvXRQ rX/TU4LN5nOm0CGGozYjkaaeaJDT2JreoecOY7hQkZpz22MBYQ39G4gwF JwG8+p94nlG+0j2vQpxycPwWf5vgJ7ATziogEFp9/KYBNDxPUiXXwQ8oG fFhej0dZyyip2dg+PgvuwTsfGRcuNwqZMUIgikk1rZ8LyMNaqJHjWVomU A==; X-CSE-ConnectionGUID: oo+Pj7oVQOeyR+Pfc8werA== X-CSE-MsgGUID: jPsG+tF0T52r5Qkjf/w1ww== X-IronPort-AV: E=McAfee;i="6600,9927,11024"; a="6678780" X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="6678780" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:24:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="39029406" Received: from pyong-mobl2.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.209.75.208]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:24:00 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, isaku.yamahata@intel.com, jgross@suse.com, binbin.wu@linux.intel.com, kai.huang@intel.com Subject: [PATCH v2 4/5] x86/virt/tdx: Support global metadata read for all element sizes Date: Tue, 26 Mar 2024 23:23:31 +1300 Message-ID: X-Mailer: git-send-email 2.43.2 In-Reply-To: References: 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" For now the kernel only reads TDMR related global metadata fields for module initialization. All these fields are 16-bits, and the kernel only supports reading 16-bits fields. KVM will need to read a bunch of non-TDMR related metadata to create and run TDX guests. It's essential to provide a generic metadata read infrastructure which supports reading all 8/16/32/64 bits element sizes. Extend the metadata read to support reading all these element sizes. Signed-off-by: Kai Huang Reviewed-by: Kirill A. Shutemov --- arch/x86/virt/vmx/tdx/tdx.c | 59 +++++++++++++++++++++++++------------ arch/x86/virt/vmx/tdx/tdx.h | 2 -- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index eb208da4ff63..4ee4b8cf377c 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -271,23 +271,35 @@ static int read_sys_metadata_field(u64 field_id, u64 = *data) return 0; } =20 -static int read_sys_metadata_field16(u64 field_id, - int offset, - void *stbuf) +/* Return the metadata field element size in bytes */ +static int get_metadata_field_bytes(u64 field_id) { - u16 *st_member =3D stbuf + offset; + /* + * TDX supports 8/16/32/64 bits metadata field element sizes. + * TDX module determines the metadata element size based on the + * "element size code" encoded in the field ID (see the comment + * of MD_FIELD_ID_ELE_SIZE_CODE macro for specific encodings). + */ + return 1 << MD_FIELD_ID_ELE_SIZE_CODE(field_id); +} + +static int stbuf_read_sys_metadata_field(u64 field_id, + int offset, + int bytes, + void *stbuf) +{ + void *st_member =3D stbuf + offset; u64 tmp; int ret; =20 - if (WARN_ON_ONCE(MD_FIELD_ID_ELE_SIZE_CODE(field_id) !=3D - MD_FIELD_ID_ELE_SIZE_16BIT)) + if (WARN_ON_ONCE(get_metadata_field_bytes(field_id) !=3D bytes)) return -EINVAL; =20 ret =3D read_sys_metadata_field(field_id, &tmp); if (ret) return ret; =20 - *st_member =3D tmp; + memcpy(st_member, &tmp, bytes); =20 return 0; } @@ -295,11 +307,30 @@ static int read_sys_metadata_field16(u64 field_id, struct field_mapping { u64 field_id; int offset; + int size; }; =20 #define TD_SYSINFO_MAP(_field_id, _struct, _member) \ { .field_id =3D MD_FIELD_ID_##_field_id, \ - .offset =3D offsetof(_struct, _member) } + .offset =3D offsetof(_struct, _member), \ + .size =3D sizeof(typeof(((_struct *)0)->_member)) } + +static int read_sys_metadata(const struct field_mapping *fields, int nr_fi= elds, + void *stbuf) +{ + int i, ret; + + for (i =3D 0; i < nr_fields; i++) { + ret =3D stbuf_read_sys_metadata_field(fields[i].field_id, + fields[i].offset, + fields[i].size, + stbuf); + if (ret) + return ret; + } + + return 0; +} =20 #define TD_SYSINFO_MAP_TDMR_INFO(_field_id, _member) \ TD_SYSINFO_MAP(_field_id, struct tdx_tdmr_sysinfo, _member) @@ -314,19 +345,9 @@ static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinf= o *tdmr_sysinfo) TD_SYSINFO_MAP_TDMR_INFO(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2= M]), TD_SYSINFO_MAP_TDMR_INFO(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1= G]), }; - int ret; - int i; =20 /* Populate 'tdmr_sysinfo' fields using the mapping structure above: */ - for (i =3D 0; i < ARRAY_SIZE(fields); i++) { - ret =3D read_sys_metadata_field16(fields[i].field_id, - fields[i].offset, - tdmr_sysinfo); - if (ret) - return ret; - } - - return 0; + return read_sys_metadata(fields, ARRAY_SIZE(fields), tdmr_sysinfo); } =20 /* Calculate the actual TDMR size */ diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index b701f69485d3..4c32c8bf156a 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -53,8 +53,6 @@ #define MD_FIELD_ID_ELE_SIZE_CODE(_field_id) \ (((_field_id) & GENMASK_ULL(33, 32)) >> 32) =20 -#define MD_FIELD_ID_ELE_SIZE_16BIT 1 - struct tdmr_reserved_area { u64 offset; u64 size; --=20 2.43.2 From nobody Sun Feb 8 18:28:39 2026 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.15]) (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 150806BFCB for ; Tue, 26 Mar 2024 10:24:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448648; cv=none; b=TlJQ4Q6IESjt3x27mewtXmy9YxoFLMSntk5uVKfzS0yB7iszB3HLgs8kDMroJV0ZfjMQ0Cv47+gWd5y9j0TzoPTYBY5bw/dVg5cumM+mDnDRYspF9/pie5ynHxdi9ubRS91jWuVvYXKJ3rPlvaOUeXwQMWSWo7YTKGOyABtV49Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711448648; c=relaxed/simple; bh=0fN7gsqYsnGc6ao955RNcoGm8yBWFIYv/ncU5MgaFNM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jFaeUqzV6kIdO3x8OLkuyZjfxknSLz5CQTFuJX0HThqiOqFA6LDcWXrIEuKzuGJcaHGVdlZDesDl0D2GE7gkUSeJJ3unlIFMJq6WCQkvrjx462ra2xlpgCSMia8YTdHWmwOHpYoEsRRlUDuMvU8NCLpBmRtRjciTI1+vfgvGqUM= 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=kgSPhqRs; arc=none smtp.client-ip=192.198.163.15 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="kgSPhqRs" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711448647; x=1742984647; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0fN7gsqYsnGc6ao955RNcoGm8yBWFIYv/ncU5MgaFNM=; b=kgSPhqRseXGda87W+bnxPA+ntG7A/McFa/lEpNLoBtBeuGBB5+e17YT7 HKITdg+O8GobNemaN16XToLrKSl6/fFnY/PrUjo9C3MD8aQZ1GdN0y7fx O6BnstsgSoDjG1reaPcgg640kQd/0VhAFS+5jUAF0Bhh519n5mRIf1oXs aTVfGhQPpKv4JeYEIno9ezhWJ/zBgNBM2H6xkkzNp3uRhb3zf1y3+Fj/Q ltsdf23mad2pH59dXWBWNoLJsfurGf2ghVOWgsEDOk/qw9DBzITxc7u6M oxAVnRBVnI12PvL8CBGzYalQMxXd1xT4cgRUrmkvLnMA0eQjEz8f3zkpZ Q==; X-CSE-ConnectionGUID: CF0pCFjaQ4ekEm7EQ2DeHg== X-CSE-MsgGUID: FMMUS7LURdSds3+Ps12czQ== X-IronPort-AV: E=McAfee;i="6600,9927,11024"; a="6678792" X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="6678792" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:24:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,156,1708416000"; d="scan'208";a="39029428" Received: from pyong-mobl2.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.209.75.208]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 03:24:04 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, isaku.yamahata@intel.com, jgross@suse.com, binbin.wu@linux.intel.com, kai.huang@intel.com Subject: [PATCH v2 5/5] x86/virt/tdx: Export global metadata read infrastructure Date: Tue, 26 Mar 2024 23:23:32 +1300 Message-ID: <20d6035063f00825b3f4e1f2b6c9abc20c73f177.1711447449.git.kai.huang@intel.com> X-Mailer: git-send-email 2.43.2 In-Reply-To: References: 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" KVM will need to read a bunch of non-TDMR related metadata to create and run TDX guests. Export the metadata read infrastructure for KVM to use. Specifically, export two helpers: 1) The helper which reads multiple metadata fields to a buffer of a structure based on the "field ID -> structure member" mapping table. 2) The low level helper which just reads a given field ID. The two helpers cover cases when the user wants to cache a bunch of metadata fields to a certain structure and when the user just wants to query a specific metadata field on demand. They are enough for KVM to use (and also should be enough for other potential users). Signed-off-by: Kai Huang Reviewed-by: Kirill A. Shutemov Reviewed-by: Binbin Wu --- arch/x86/include/asm/tdx.h | 22 ++++++++++++++++++++++ arch/x86/virt/vmx/tdx/tdx.c | 25 ++++++++----------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index eba178996d84..709b9483f9e4 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -116,6 +116,28 @@ static inline u64 sc_retry(sc_func_t func, u64 fn, int tdx_cpu_enable(void); int tdx_enable(void); const char *tdx_dump_mce_info(struct mce *m); + +struct tdx_metadata_field_mapping { + u64 field_id; + int offset; + int size; +}; + +#define TD_SYSINFO_MAP(_field_id, _struct, _member) \ + { .field_id =3D MD_FIELD_ID_##_field_id, \ + .offset =3D offsetof(_struct, _member), \ + .size =3D sizeof(typeof(((_struct *)0)->_member)) } + +/* + * Read multiple global metadata fields to a buffer of a structure + * based on the "field ID -> structure member" mapping table. + */ +int tdx_sys_metadata_read(const struct tdx_metadata_field_mapping *fields, + int nr_fields, void *stbuf); + +/* Read a single global metadata field */ +int tdx_sys_metadata_field_read(u64 field_id, u64 *data); + #else static inline void tdx_init(void) { } static inline int tdx_cpu_enable(void) { return -ENODEV; } diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 4ee4b8cf377c..dc21310776ab 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -251,7 +251,7 @@ static int build_tdx_memlist(struct list_head *tmb_list) return ret; } =20 -static int read_sys_metadata_field(u64 field_id, u64 *data) +int tdx_sys_metadata_field_read(u64 field_id, u64 *data) { struct tdx_module_args args =3D {}; int ret; @@ -270,6 +270,7 @@ static int read_sys_metadata_field(u64 field_id, u64 *d= ata) =20 return 0; } +EXPORT_SYMBOL_GPL(tdx_sys_metadata_field_read); =20 /* Return the metadata field element size in bytes */ static int get_metadata_field_bytes(u64 field_id) @@ -295,7 +296,7 @@ static int stbuf_read_sys_metadata_field(u64 field_id, if (WARN_ON_ONCE(get_metadata_field_bytes(field_id) !=3D bytes)) return -EINVAL; =20 - ret =3D read_sys_metadata_field(field_id, &tmp); + ret =3D tdx_sys_metadata_field_read(field_id, &tmp); if (ret) return ret; =20 @@ -304,19 +305,8 @@ static int stbuf_read_sys_metadata_field(u64 field_id, return 0; } =20 -struct field_mapping { - u64 field_id; - int offset; - int size; -}; - -#define TD_SYSINFO_MAP(_field_id, _struct, _member) \ - { .field_id =3D MD_FIELD_ID_##_field_id, \ - .offset =3D offsetof(_struct, _member), \ - .size =3D sizeof(typeof(((_struct *)0)->_member)) } - -static int read_sys_metadata(const struct field_mapping *fields, int nr_fi= elds, - void *stbuf) +int tdx_sys_metadata_read(const struct tdx_metadata_field_mapping *fields, + int nr_fields, void *stbuf) { int i, ret; =20 @@ -331,6 +321,7 @@ static int read_sys_metadata(const struct field_mapping= *fields, int nr_fields, =20 return 0; } +EXPORT_SYMBOL_GPL(tdx_sys_metadata_read); =20 #define TD_SYSINFO_MAP_TDMR_INFO(_field_id, _member) \ TD_SYSINFO_MAP(_field_id, struct tdx_tdmr_sysinfo, _member) @@ -338,7 +329,7 @@ static int read_sys_metadata(const struct field_mapping= *fields, int nr_fields, static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo *tdmr_sysinfo) { /* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */ - const struct field_mapping fields[] =3D { + const struct tdx_metadata_field_mapping fields[] =3D { TD_SYSINFO_MAP_TDMR_INFO(MAX_TDMRS, max_tdmrs), TD_SYSINFO_MAP_TDMR_INFO(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr), TD_SYSINFO_MAP_TDMR_INFO(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4= K]), @@ -347,7 +338,7 @@ static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo= *tdmr_sysinfo) }; =20 /* Populate 'tdmr_sysinfo' fields using the mapping structure above: */ - return read_sys_metadata(fields, ARRAY_SIZE(fields), tdmr_sysinfo); + return tdx_sys_metadata_read(fields, ARRAY_SIZE(fields), tdmr_sysinfo); } =20 /* Calculate the actual TDMR size */ --=20 2.43.2