From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 3F74835C1B7 for ; Thu, 12 Feb 2026 14:36:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770906978; cv=none; b=XrSmM2FHEI4InEzqTXGE9xBjVkGs7B/d8FoIQ8PfRBZPcjDw52wCozpB3OreZc+xKe4Uj1PXyjxhs3CYUoHW6Z1H2cUbXE/yccKC88ncn4hL1fPR/Pskp5wHajp6b07EyGErzMhDlEwjLtlYlxPOTtmT2QQo2VsDFSpcNxr3rn4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770906978; c=relaxed/simple; bh=TVBKfeA7bJXJ8+DCH03hjvCM1PJseVe5z0PE4+HoCe0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Ltv8nSC/l5Zesgy8C64i6kDLM+pq6BleclVxVDVYQnWPJOyMhn/f/zWCXNPYP8ya/ftE5kHFNkIZTJayIW8hiMK/lBFbS+rGDKBSW28uaToiaiJOg/ODxow7739plI5jmQPSyEIoGJHSIo5MW9HZ4Xh4pS0Qp92b2kHUdAF+2WM= 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=dmuo+trm; arc=none smtp.client-ip=192.198.163.8 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="dmuo+trm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1770906976; x=1802442976; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=TVBKfeA7bJXJ8+DCH03hjvCM1PJseVe5z0PE4+HoCe0=; b=dmuo+trm0nqZO3lOkZ9VodgDrI1JO90s1FpbdML9nBqj6n7lqnvIT4q5 xKQVvMM+PRLKx3UmFkoMWr5+I2Y76Q9QnYQXm0vkAXeVbkNMlrtJigMm6 0+7JMQ66HL+hLJF6Kho86SzakckE4qyGKnpWbZ58dHaOBJAjsrapamxVg EsZ5TNNQyYcczZKTQGlz/tevuvKIQ+Hza6Dfu/IE2z0q+FqfABi2o0p03 nVKURkNEHCgNHBqpoEi9NB54ydj1Vq98lTJLELJlQ9H8czLdT/YNECPQZ FfCI4EybxoWssKUw2cWEFMZXNEf9e1+1gjPEmo7Je5CWTei5cHNrhLRDM A==; X-CSE-ConnectionGUID: nii0rc9ZTJ6nebuO2T1wUw== X-CSE-MsgGUID: GQNGaIeLQtmsAgM2GZOn8Q== X-IronPort-AV: E=McAfee;i="6800,10657,11699"; a="89662777" X-IronPort-AV: E=Sophos;i="6.21,286,1763452800"; d="scan'208";a="89662777" Received: from fmviesa006.fm.intel.com ([10.60.135.146]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Feb 2026 06:36:16 -0800 X-CSE-ConnectionGUID: T4lpa21WQQms4YsWqAwhUw== X-CSE-MsgGUID: aHoiO5EkSgakfb92FPMmHQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.21,286,1763452800"; d="scan'208";a="211428217" Received: from 984fee019967.jf.intel.com ([10.23.153.244]) by fmviesa006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Feb 2026 06:36:15 -0800 From: Chao Gao To: linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org Cc: 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, binbin.wu@linux.intel.com, tony.lindgren@linux.intel.com, Chao Gao , Farrah Chen , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" Subject: [PATCH v4 05/24] x86/virt/seamldr: Retrieve P-SEAMLDR information Date: Thu, 12 Feb 2026 06:35:08 -0800 Message-ID: <20260212143606.534586-6-chao.gao@intel.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260212143606.534586-1-chao.gao@intel.com> References: <20260212143606.534586-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 --- v4: - put seamldr_info on stack [Dave] - improve changelogs to explain SEAMLDR.INFO and SEAMLDR.SEAMINFO [Dave] - add 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 | 15 +++++++++++++- 2 files changed, 50 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..954d850e34e3 --- /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 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 fb59b3e2aa37..d17db3c0151e 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c @@ -8,15 +8,20 @@ #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. */ 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) { /* * Serialize P-SEAMLDR calls and disable interrupts as the calls @@ -25,3 +30,11 @@ static __maybe_unused int seamldr_call(u64 fn, struct tdx_module_args *args) guard(raw_spinlock_irqsave)(&seamldr_lock); return seamcall_prerr(fn, args); } + +int seamldr_get_info(struct seamldr_info *seamldr_info) +{ + 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