From nobody Sun May 24 19:33:52 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (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 70C6C3812DB; Fri, 22 May 2026 17:26:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779470787; cv=none; b=agd0KkBWaClDN4nowQNdLphVetX64VpgrbyEl297we9+Ba8qIGcFXip/7PV8CYTL1ALN0kEBhSaoS+GxbrDLeUm3XKNNPktA1hRPat7CN5yy7UNRrFxME21sUQUpONL7EYS3naPvETnQb55Pa1suKm6zb/zkl+xiaKaab95ToIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779470787; c=relaxed/simple; bh=sWtqW0mNCGSWV3M8s+KSEWYkbHZoCSErKXdjii2Pti8=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=diPfzOEm9KcDO0QMZXdr7ZoaMhhhCgYkQbvAQ8gKB/e6jAyfdf5gjFtbzxEK51K5QDHGVQAJBPOSxBO8TiVgRxev8gJO/Ln3s+xHkWt3KWXGVr0TRRt4AWF33sJrGoZRKcvLRKiPaiRhj/pMifNmQA4H4gMMHwZjNKDlos9nC9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=PpIlNaxH; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=na+jLl0f; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="PpIlNaxH"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="na+jLl0f" Date: Fri, 22 May 2026 17:26:23 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1779470785; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z3RDKQ7UhV0/VTI0N1f+Mdw80eZeYgaiS/UqKCA0ZRo=; b=PpIlNaxH9YyKuwsPEKp9Uac/dpA+Type/1d+WK7y2ttIYZCAZtnsS+DFwB0y5ekca29thU lP9usfG7VrBU+CmwZaynhUpZUye+sg79CA7VfcRZwamMr9hs9wzsrmLFD4nwNtk9GGP+Bs rMFKMsmmtn904FJFt8gNLUIWC069X9i6Y58tkLK+6IxwKZYmXD0HIS0ebXwOJ56lCAtJ+K HWGHUHiGjyZnZu7/c46aOc2r8rxitSXfhgB3lccaWzbg+6STfb60D0oKmc+JZlKxaeBj2R E6FVA0w6cE6hiNTBzjk6GrrYAPNjV2BuR/I2XIngJDFziKZ6QvSPhcUXaAzKyQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1779470785; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z3RDKQ7UhV0/VTI0N1f+Mdw80eZeYgaiS/UqKCA0ZRo=; b=na+jLl0fTueGkh9NoAANdIfnRZGGmi98lBvUd6Rrb8/6gwyOu480wUUlKSzfZgi2PDErCu 3AlEAR52URq4aHBA== From: "tip-bot2 for Chao Gao" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/tdx] coco/tdx-host: Expose P-SEAMLDR information via sysfs Cc: Chao Gao , Dave Hansen , "Kiryl Shutsemau (Meta)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20260520222857.5EB90991@davehans-spike.ostc.intel.com> References: <20260520222857.5EB90991@davehans-spike.ostc.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <177947078370.711.552410476679339409.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the x86/tdx branch of tip: Commit-ID: b094b1684fef88edc23ad7134022c59e4cef0e21 Gitweb: https://git.kernel.org/tip/b094b1684fef88edc23ad7134022c59e4= cef0e21 Author: Chao Gao AuthorDate: Wed, 20 May 2026 15:28:57 -07:00 Committer: Dave Hansen CommitterDate: Wed, 20 May 2026 15:37:09 -07:00 coco/tdx-host: Expose P-SEAMLDR information via sysfs TDX module updates require userspace to select the appropriate module to load. Expose necessary information to facilitate this decision. Two values are needed: - P-SEAMLDR version: for compatibility checks between TDX module and P-SEAMLDR - num_remaining_updates: indicates how many updates can be performed Expose them as tdx-host device attributes visible only when updates are supported. Note that the underlying P-SEAMLDR attributes are available regardless of update support; this only restricts their visibility to userspace. Signed-off-by: Chao Gao Signed-off-by: Dave Hansen Reviewed-by: Kiryl Shutsemau (Meta) Reviewed-by: Dave Hansen Link: https://patch.msgid.link/20260520133909.409394-11-chao.gao@intel.com Link: https://patch.msgid.link/20260520222857.5EB90991@davehans-spike.ostc.= intel.com --- Documentation/ABI/testing/sysfs-devices-faux-tdx-host | 21 +++- arch/x86/include/asm/tdx.h | 6 +- drivers/virt/coco/tdx-host/tdx-host.c | 72 +++++++++- 3 files changed, 98 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-devices-faux-tdx-host b/Docume= ntation/ABI/testing/sysfs-devices-faux-tdx-host index 47d73cb..c9cb273 100644 --- a/Documentation/ABI/testing/sysfs-devices-faux-tdx-host +++ b/Documentation/ABI/testing/sysfs-devices-faux-tdx-host @@ -3,3 +3,24 @@ Contact: linux-coco@lists.linux.dev Description: (RO) Report the version of the loaded TDX module. Formatted as "major.minor.update". Used by TDX module update tooling. Example: "1.2.03". + +What: /sys/devices/faux/tdx_host/seamldr_version +Contact: linux-coco@lists.linux.dev +Description: (RO) Report the version of the loaded P-SEAMLDR. + Formatted as a TDX module version. Used by TDX module + update tooling. + +What: /sys/devices/faux/tdx_host/num_remaining_updates +Contact: linux-coco@lists.linux.dev +Description: (RO) Report the number of remaining updates. TDX maintains a + log about each TDX module that has been loaded. This log has + a finite size, which limits the number of TDX module updates + that can be performed. + + After each successful update, the number reduces by one. Once it + reaches zero, further updates will fail until next reboot. The + number is always zero if the P-SEAMLDR doesn't support updates. + + See Intel Trust Domain Extensions - SEAM Loader (SEAMLDR) + Interface Specification, Chapter "SEAMLDR_INFO" and Chapter + "SEAMLDR.INSTALL" for more information. diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index b7f4396..27376db 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -110,6 +110,12 @@ void tdx_init(void); const char *tdx_dump_mce_info(struct mce *m); const struct tdx_sys_info *tdx_get_sysinfo(void); =20 +static inline bool tdx_supports_runtime_update(const struct tdx_sys_info *= sysinfo) +{ + /* To be enabled when kernel is ready. */ + return false; +} + int tdx_guest_keyid_alloc(void); u32 tdx_get_nr_guest_keyids(void); void tdx_guest_keyid_free(unsigned int keyid); diff --git a/drivers/virt/coco/tdx-host/tdx-host.c b/drivers/virt/coco/tdx-= host/tdx-host.c index ef117a8..2997311 100644 --- a/drivers/virt/coco/tdx-host/tdx-host.c +++ b/drivers/virt/coco/tdx-host/tdx-host.c @@ -11,6 +11,7 @@ #include =20 #include +#include #include =20 static const struct x86_cpu_id tdx_host_ids[] =3D { @@ -40,7 +41,76 @@ static struct attribute *tdx_host_attrs[] =3D { &dev_attr_version.attr, NULL, }; -ATTRIBUTE_GROUPS(tdx_host); + +static const struct attribute_group tdx_host_group =3D { + .attrs =3D tdx_host_attrs, +}; + +static ssize_t seamldr_version_show(struct device *dev, struct device_attr= ibute *attr, + char *buf) +{ + struct seamldr_info info; + int ret; + + ret =3D seamldr_get_info(&info); + if (ret) + return ret; + + return sysfs_emit(buf, TDX_VERSION_FMT "\n", info.major_version, + info.minor_version, + info.update_version); +} + +static ssize_t num_remaining_updates_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct seamldr_info info; + int ret; + + ret =3D seamldr_get_info(&info); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", info.num_remaining_updates); +} + +/* + * These attributes are intended for managing TDX module updates. Reading + * them issues a slow, serialized P-SEAMLDR query, so keep them admin-only. + */ +static DEVICE_ATTR_ADMIN_RO(seamldr_version); +static DEVICE_ATTR_ADMIN_RO(num_remaining_updates); + +static struct attribute *seamldr_attrs[] =3D { + &dev_attr_seamldr_version.attr, + &dev_attr_num_remaining_updates.attr, + NULL, +}; + +static umode_t seamldr_group_visible(struct kobject *kobj, struct attribut= e *attr, int idx) +{ + const struct tdx_sys_info *sysinfo =3D tdx_get_sysinfo(); + + if (!sysinfo) + return 0; + + if (!tdx_supports_runtime_update(sysinfo)) + return 0; + + return attr->mode; +} + +static const struct attribute_group seamldr_group =3D { + .attrs =3D seamldr_attrs, + .is_visible =3D seamldr_group_visible, +}; + +static const struct attribute_group *tdx_host_groups[] =3D { + &tdx_host_group, + &seamldr_group, + NULL, +}; =20 static struct faux_device *fdev; =20