From mboxrd@z Thu Jan 1 00:00:00 1970 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 8E7E2363C41 for ; Sun, 15 Mar 2026 13:59:38 +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=1773583180; cv=none; b=XOH70N+6bBJfqFseEgsaLh1BaTR0Vyw31Qtb3bQiXZXqf4XdLvARvXHLj0lqboCdXDBhIHrOnP12v3KF1lXpcw4Q+wKRdRlRr7hpLqthfpJkzsFHYLNwIE5rK8kNyx4iaAKouDmtr1SAmZtEvPy+mqrQP8T+sQNr8nLjIjXujc4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773583180; c=relaxed/simple; bh=PquVRWKidURMSe/ngZj3Ryu6a+9kFEDP3NEylPqMfBc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=kWxIx4UwK8f7rg21PR5iiatD0R/6LEXT1hjT98E79UXjBh85hK7TMA01Coiaq4LU0uVYI9yQt/9TtqwOMxGSb3Dv7QWh2+HYR74/BZsnU3tAGiwPDI4SJaF5lr5OYrERLnFQKgIyW2ecYM3dvUcvdDBrg5jtPLQYnIeVNDz/ylg= 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=KHmGcjN8; 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="KHmGcjN8" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1773583179; x=1805119179; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PquVRWKidURMSe/ngZj3Ryu6a+9kFEDP3NEylPqMfBc=; b=KHmGcjN8EC/DBe61sPoV8wp2FfmyPo/iVSTylVL4YmCpisMZtQz9IiC3 uk3wu2b/+PqxoUAKE9CrE4sLYJigSehi/beqqfGuZocVZpawrMVSXGoHJ vjHzZy43OcblojUMYIpBg0FNZiTG+DvYXR94FkQoy1ZGg+k8L553PBTZI 5xcoNyJGs3w1F9uW4aCRa1/A/RECjMNX+qhlHacdcTo/jI70UR8kk2Ghg 4k5aENGMTnwZwOWHaYx8yYIT0NOv330x0xqEbs9ZpYDKMMrGA4lAHNtdz VM58kVmXhphpWhrm4NXWFyQ92GnNAB+Cnv5rNuik89XP+CiFZ2W51erFP g==; X-CSE-ConnectionGUID: QIpdtN9RQcepc6Y6S0wLSw== X-CSE-MsgGUID: nVSCDGJxSR243ZwUEz8udg== X-IronPort-AV: E=McAfee;i="6800,10657,11730"; a="74732446" X-IronPort-AV: E=Sophos;i="6.23,122,1770624000"; d="scan'208";a="74732446" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by fmvoesa109.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Mar 2026 06:59:37 -0700 X-CSE-ConnectionGUID: Oe2N3ZBySTOio6XDMSV7gA== X-CSE-MsgGUID: /kw2tk+hQ66iX+zRTZZrmQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,122,1770624000"; d="scan'208";a="226123024" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by orviesa004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Mar 2026 06:59:37 -0700 From: Chao Gao To: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, kvm@vger.kernel.org Cc: binbin.wu@linux.intel.com, dan.j.williams@intel.com, dave.hansen@linux.intel.com, ira.weiny@intel.com, kai.huang@intel.com, kas@kernel.org, nik.borisov@suse.com, paulmck@kernel.org, pbonzini@redhat.com, reinette.chatre@intel.com, rick.p.edgecombe@intel.com, sagis@google.com, seanjc@google.com, tony.lindgren@linux.intel.com, vannapurve@google.com, vishal.l.verma@intel.com, yilun.xu@linux.intel.com, Chao Gao , Farrah Chen , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H. Peter Anvin" Subject: [PATCH v5 05/22] x86/virt/seamldr: Retrieve P-SEAMLDR information Date: Sun, 15 Mar 2026 06:58:25 -0700 Message-ID: <20260315135920.354657-6-chao.gao@intel.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260315135920.354657-1-chao.gao@intel.com> References: <20260315135920.354657-1-chao.gao@intel.com> Precedence: bulk X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P-SEAMLDR returns its information such as version number, in response to the SEAMLDR.INFO SEAMCALL. This information is useful for userspace. For example, the admin can decide which TDX module versions are compatible with the P-SEAMLDR according to the P-SEAMLDR version. Retrieve P-SEAMLDR information in preparation for exposing P-SEAMLDR version and other necessary information to userspace. Export the new kAPI for use by tdx-host.ko. Note that there are two distinct P-SEAMLDR APIs with similar names: SEAMLDR.INFO: Returns a SEAMLDR_INFO structure containing SEAMLDR information such as version and remaining updates. SEAMLDR.SEAMINFO: Returns a SEAMLDR_SEAMINFO structure containing SEAM and system information such as Convertible Memory Regions (CMRs) and number of CPUs and sockets. The former is used here. For details, see "IntelĀ® Trust Domain Extensions - SEAM Loader (SEAMLDR) Interface Specification" revision 343755-003. Signed-off-by: Chao Gao Tested-by: Farrah Chen --- Kai also suggested merging this patch with the first use of the new kAPI, so we don't need to add a comment for slow_virt_to_phys() (as the reason can be seen from the call site). I am fine with it, but the changelog may be a bit lengthy. v5: - add a comment for slow_virt_to_phys() [Kai] v4: - put seamldr_info on stack [Dave] - improve changelogs to explain SEAMLDR.INFO and SEAMLDR.SEAMINFO [Dave] - add P-SEAMLDR spec information in the changelog [Dave] - add proper comments above ABI structure definition [Dave] - add unused ABI structure fields rather than marking them as reserved to better align with the specc [Dave] (I omitted "not used by kernel" tags since there are 5-6 such fields and maintaining these tags would be tedious.) --- arch/x86/include/asm/seamldr.h | 36 +++++++++++++++++++++++++++++++++ arch/x86/virt/vmx/tdx/seamldr.c | 19 ++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 arch/x86/include/asm/seamldr.h diff --git a/arch/x86/include/asm/seamldr.h b/arch/x86/include/asm/seamldr.h new file mode 100644 index 000000000000..c67e5bc910a9 --- /dev/null +++ b/arch/x86/include/asm/seamldr.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_X86_SEAMLDR_H +#define _ASM_X86_SEAMLDR_H + +#include + +/* + * This is called the "SEAMLDR_INFO" data structure and is defined + * in "SEAM Loader (SEAMLDR) Interface Specification". + * + * The SEAMLDR.INFO documentation requires this to be aligned to a + * 256-byte boundary. + */ +struct seamldr_info { + u32 version; + u32 attributes; + u32 vendor_id; + u32 build_date; + u16 build_num; + u16 minor_version; + u16 major_version; + u16 update_version; + u32 acm_x2apicid; + u32 num_remaining_updates; + u8 seam_info[128]; + u8 seam_ready; + u8 seam_debug; + u8 p_seam_ready; + u8 reserved[93]; +} __packed __aligned(256); + +static_assert(sizeof(struct seamldr_info) == 256); + +int seamldr_get_info(struct seamldr_info *seamldr_info); + +#endif /* _ASM_X86_SEAMLDR_H */ diff --git a/arch/x86/virt/vmx/tdx/seamldr.c b/arch/x86/virt/vmx/tdx/seamldr.c index 7ed9be89017c..7c0cbab2c4c0 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c @@ -8,8 +8,13 @@ #include +#include + #include "seamcall_internal.h" +/* P-SEAMLDR SEAMCALL leaf function */ +#define P_SEAMLDR_INFO 0x8000000000000000 + /* * Serialize P-SEAMLDR calls since the hardware only allows a single CPU to * interact with P-SEAMLDR simultaneously. Use raw version as the calls can @@ -17,8 +22,20 @@ */ static DEFINE_RAW_SPINLOCK(seamldr_lock); -static __maybe_unused int seamldr_call(u64 fn, struct tdx_module_args *args) +static int seamldr_call(u64 fn, struct tdx_module_args *args) { guard(raw_spinlock)(&seamldr_lock); return seamcall_prerr(fn, args); } + +int seamldr_get_info(struct seamldr_info *seamldr_info) +{ + /* + * Use slow_virt_to_phys() since @seamldr_info may be allocated on + * the stack. + */ + struct tdx_module_args args = { .rcx = slow_virt_to_phys(seamldr_info) }; + + return seamldr_call(P_SEAMLDR_INFO, &args); +} +EXPORT_SYMBOL_FOR_MODULES(seamldr_get_info, "tdx-host"); -- 2.47.3