From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) (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 9EFFD34572F for ; Fri, 6 Mar 2026 09:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.11 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772789373; cv=none; b=r9hAbqgC7ed+8ht0l5sp6UUnjAbVAnZ/UWNCHhmWM0NnVyRXy0E8sin7JGP9qL2lbS+7R0fhZvt9YLr1Yxh/hdzjkTdEITt8R44NMnx59I8qMVgN20raArf3gReotg3lEeHtFr0KliGyOnjzAC9GadC8zZWcPLR0t5leFTBIAt8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772789373; c=relaxed/simple; bh=0OeK1xoBa1DxJEcANYuVCZsFUuiXBKHgQAuKI/pJmYk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=Gc+KzVr+h50Po8SSMQok/5CPM/6SjFU15iRFNjeDVn5LGnTBX44aIjMX7cOSh1SFZgrWmBXUKAJK5Wxwuq/oJhaLjk1+iuYeY7cFW/YA3zTnXkc4KNaXkTrM20MBsM5S7NBYdHwSDj32j+LyaUpwGFfwchZljT26vaMpnfFJ5fI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=UJc7vcN1; arc=none smtp.client-ip=192.198.163.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="UJc7vcN1" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1772789371; x=1804325371; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=0OeK1xoBa1DxJEcANYuVCZsFUuiXBKHgQAuKI/pJmYk=; b=UJc7vcN1r3YADaq8+H7oSX44qGiPLiWX3XMfVtKAc6nGrq8IYerko+4u jJqrTBE26gUach34aQlEdmUeC4Ui13IsHm3itphKX6OlatLemVnKy4Iqz BhxLYo13NKvOZDR2wuePNGffCYxBjf3j/Y1sASnmub8cWOZVse6Q+KGNI k5nR4Ij0Bvk7ybuvC0wJgJEqgja45ZmCFlQOu1iK+8vNFiIqGGiv1u5q3 X1OmD9ZEenHFSWT6z+PlBdGn4879ZDoXFS2461eT2sdpSkj8OOVFo//mY 2jIqz3DsrpMj+M5N7F9swW9A6+9AGC6bqoDJ8TKzi7UDgNA8vowzNpcOS g==; X-CSE-ConnectionGUID: sa8Rr/INTYaM8EVsZ1mJFQ== X-CSE-MsgGUID: 9mV96vFDSv+Nk5IX8Rs1dQ== X-IronPort-AV: E=McAfee;i="6800,10657,11720"; a="84528387" X-IronPort-AV: E=Sophos;i="6.23,104,1770624000"; d="scan'208";a="84528387" Received: from fmviesa005.fm.intel.com ([10.60.135.145]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Mar 2026 01:29:30 -0800 X-CSE-ConnectionGUID: KXi9/xecR22G/lz6UkdZzw== X-CSE-MsgGUID: rhBRMKOyQIuJ9P9uXnoYnA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,104,1770624000"; d="scan'208";a="223649577" Received: from binbinwu-mobl.ccr.corp.intel.com (HELO [10.124.240.23]) ([10.124.240.23]) by fmviesa005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Mar 2026 01:29:24 -0800 Message-ID: <5b08961b-0faf-4e01-b0dd-f1f472697a18@linux.intel.com> Date: Fri, 6 Mar 2026 17:29:22 +0800 Precedence: bulk X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 06/24] coco/tdx-host: Expose P-SEAMLDR information via sysfs To: Chao Gao Cc: linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org, reinette.chatre@intel.com, ira.weiny@intel.com, kai.huang@intel.com, dan.j.williams@intel.com, yilun.xu@linux.intel.com, sagis@google.com, vannapurve@google.com, paulmck@kernel.org, nik.borisov@suse.com, zhenzhong.duan@intel.com, seanjc@google.com, rick.p.edgecombe@intel.com, kas@kernel.org, dave.hansen@linux.intel.com, vishal.l.verma@intel.com, tony.lindgren@linux.intel.com, Farrah Chen References: <20260212143606.534586-1-chao.gao@intel.com> <20260212143606.534586-7-chao.gao@intel.com> Content-Language: en-US From: Binbin Wu In-Reply-To: <20260212143606.534586-7-chao.gao@intel.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 2/12/2026 10:35 PM, Chao Gao wrote: > 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. > > Signed-off-by: Chao Gao > Reviewed-by: Tony Lindgren > Tested-by: Farrah Chen Reviewed-by: Binbin Wu Some nits below. > --- > v4: > - Make seamldr attribute permission "0400" [Dave] > - Don't include implementation details in OS ABI docs [Dave] > - Tag tdx_host_group as static [Kai] > > v3: > - use #ifdef rather than .is_visible() to control P-SEAMLDR sysfs > visibility [Yilun] > --- > .../ABI/testing/sysfs-devices-faux-tdx-host | 23 +++++++ > drivers/virt/coco/tdx-host/tdx-host.c | 63 ++++++++++++++++++- > 2 files changed, 85 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ABI/testing/sysfs-devices-faux-tdx-host b/Documentation/ABI/testing/sysfs-devices-faux-tdx-host > index 901abbae2e61..88a9c0b2bdfe 100644 > --- a/Documentation/ABI/testing/sysfs-devices-faux-tdx-host > +++ b/Documentation/ABI/testing/sysfs-devices-faux-tdx-host > @@ -4,3 +4,26 @@ Description: (RO) Report the version of the loaded TDX Module. The TDX Module > version is formatted as x.y.z, where "x" is the major version, > "y" is the minor version and "z" is the update version. Versions > are used for bug reporting, TDX Module updates and etc. > + > +What: /sys/devices/faux/tdx_host/seamldr/version > +Contact: linux-coco@lists.linux.dev > +Description: (RO) Report the version of the loaded SEAM loader. The SEAM > + loader version is formatted as x.y.z, where "x" is the major > + version, "y" is the minor version and "z" is the update version. > + Versions are used for bug reporting and compatibility checks. > + > +What: /sys/devices/faux/tdx_host/seamldr/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 which has been loaded. This log has ^ that > + a finite size which limits the number of TDX Module updates ^ , > + which can be performed. ^ that > + > + 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, Revision 343755-003, Chapter 3.3 > + "SEAMLDR_INFO" and Chapter 4.2 "SEAMLDR.INSTALL" for more > + information. > diff --git a/drivers/virt/coco/tdx-host/tdx-host.c b/drivers/virt/coco/tdx-host/tdx-host.c > index 0424933b2560..fd6ffb4f2ff1 100644 > --- a/drivers/virt/coco/tdx-host/tdx-host.c > +++ b/drivers/virt/coco/tdx-host/tdx-host.c > @@ -11,6 +11,7 @@ > #include > > #include > +#include > #include > > static const struct x86_cpu_id tdx_host_ids[] = { > @@ -40,7 +41,67 @@ static struct attribute *tdx_host_attrs[] = { > &dev_attr_version.attr, > NULL, > }; > -ATTRIBUTE_GROUPS(tdx_host); > + > +static struct attribute_group tdx_host_group = { > + .attrs = tdx_host_attrs, > +}; > + > +static ssize_t seamldr_version_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct seamldr_info info; > + int ret; > + > + ret = seamldr_get_info(&info); > + if (ret) > + return ret; > + > + return sysfs_emit(buf, "%u.%u.%02u\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 = seamldr_get_info(&info); > + if (ret) > + return ret; > + > + return sysfs_emit(buf, "%u\n", info.num_remaining_updates); > +} > + > +/* > + * Open-code DEVICE_ATTR_ADMIN_RO to specify a different 'show' function > + * for P-SEAMLDR version as version_show() is used for TDX Module version. > + * > + * admin-only readable as reading these attributes calls into P-SEAMLDR, ^ Admin-only > + * which may have potential performance and system impact. > + */ > +static struct device_attribute dev_attr_seamldr_version = > + __ATTR(version, 0400, seamldr_version_show, NULL); > +static DEVICE_ATTR_ADMIN_RO(num_remaining_updates); > + > +static struct attribute *seamldr_attrs[] = { > + &dev_attr_seamldr_version.attr, > + &dev_attr_num_remaining_updates.attr, > + NULL, > +}; > + > +static struct attribute_group seamldr_group = { > + .name = "seamldr", > + .attrs = seamldr_attrs, > +}; > + > +static const struct attribute_group *tdx_host_groups[] = { > + &tdx_host_group, > + &seamldr_group, > + NULL, > +}; > > static struct faux_device *fdev; >