From nobody Tue Dec 16 16:41:05 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC6A6C4167B for ; Fri, 8 Dec 2023 17:17:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1574382AbjLHRRZ (ORCPT ); Fri, 8 Dec 2023 12:17:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46280 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233788AbjLHRRQ (ORCPT ); Fri, 8 Dec 2023 12:17:16 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73F9711D; Fri, 8 Dec 2023 09:17:22 -0800 (PST) Date: Fri, 08 Dec 2023 17:17:20 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1702055841; 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; bh=Pa9fzJ/ZtUWmQ4aU5PKAI7vyFrBsSSEyOZIXYm7TOqo=; b=CGf6etnabUaAX0K+Joj/BNcNV31YWXKiBx2bO4LCDsxA1Zr9f70L64wzi52Nn6NoBtksy5 8nsbBih7XibMn7PaVnN93nafULgSeP4vRfJDfFJyb3tq0ZnhkKs5j0yZxbj3Xb9hd2O+rR LzKieGZSslg880acozhxuW9pcanDK33tQiA37fVvz1D7KPzYrKFcEc9seMqDNNlJuB/tBq 0etEtpfBqH/2kSg5+DEXkcz3VbrpxdoVRwrWbmuV4P2EoJf7Yp72d2E6fNS/Gv+Oly8cFw +wm1G93JITz74vbDAzLFUVCxkHbGmHXgnMYsh1rk+5EvZTBjwhDVJR2jXndcbQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1702055841; 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; bh=Pa9fzJ/ZtUWmQ4aU5PKAI7vyFrBsSSEyOZIXYm7TOqo=; b=ZCwhItm+pQruF81n2RqIWWF2fgPYkdj2plnCz3Ip2mXSrzriy4qNGzx9bRHjpMO96EQ2hL oXPs6/G/eU33RWCQ== From: "tip-bot2 for Kai Huang" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/tdx] x86/virt/tdx: Initialize all TDMRs Cc: Kai Huang , Dave Hansen , Isaku Yamahata , "Kirill A. Shutemov" , Yuan Yao , x86@kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Message-ID: <170205584043.398.16635105990694346142.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/tdx branch of tip: Commit-ID: 0b2bc38131f02d6fd38695f191bbd8c6109ecffc Gitweb: https://git.kernel.org/tip/0b2bc38131f02d6fd38695f191bbd8c61= 09ecffc Author: Kai Huang AuthorDate: Fri, 08 Dec 2023 09:07:35 -08:00 Committer: Dave Hansen CommitterDate: Fri, 08 Dec 2023 09:12:45 -08:00 x86/virt/tdx: Initialize all TDMRs After the global KeyID has been configured on all packages, initialize all TDMRs to make all TDX-usable memory regions that are passed to the TDX module become usable. This is the last step of initializing the TDX module. Initializing TDMRs can be time consuming on large memory systems as it involves initializing all metadata entries for all pages that can be used by TDX guests. Initializing different TDMRs can be parallelized. For now to keep it simple, just initialize all TDMRs one by one. It can be enhanced in the future. Signed-off-by: Kai Huang Signed-off-by: Dave Hansen Reviewed-by: Isaku Yamahata Reviewed-by: Kirill A. Shutemov Reviewed-by: Yuan Yao Reviewed-by: Dave Hansen Link: https://lore.kernel.org/all/20231208170740.53979-15-dave.hansen%40int= el.com --- arch/x86/virt/vmx/tdx/tdx.c | 61 ++++++++++++++++++++++++++++++------ arch/x86/virt/vmx/tdx/tdx.h | 1 +- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index d2e4180..48fb1b3 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -1034,6 +1034,56 @@ static int config_global_keyid(void) return ret; } =20 +static int init_tdmr(struct tdmr_info *tdmr) +{ + u64 next; + + /* + * Initializing a TDMR can be time consuming. To avoid long + * SEAMCALLs, the TDX module may only initialize a part of the + * TDMR in each call. + */ + do { + struct tdx_module_args args =3D { + .rcx =3D tdmr->base, + }; + int ret; + + ret =3D seamcall_prerr_ret(TDH_SYS_TDMR_INIT, &args); + if (ret) + return ret; + /* + * RDX contains 'next-to-initialize' address if + * TDH.SYS.TDMR.INIT did not fully complete and + * should be retried. + */ + next =3D args.rdx; + cond_resched(); + /* Keep making SEAMCALLs until the TDMR is done */ + } while (next < tdmr->base + tdmr->size); + + return 0; +} + +static int init_tdmrs(struct tdmr_info_list *tdmr_list) +{ + int i; + + /* + * This operation is costly. It can be parallelized, + * but keep it simple for now. + */ + for (i =3D 0; i < tdmr_list->nr_consumed_tdmrs; i++) { + int ret; + + ret =3D init_tdmr(tdmr_entry(tdmr_list, i)); + if (ret) + return ret; + } + + return 0; +} + static int init_tdx_module(void) { struct tdx_tdmr_sysinfo tdmr_sysinfo; @@ -1079,15 +1129,8 @@ static int init_tdx_module(void) if (ret) goto err_reset_pamts; =20 - /* - * TODO: - * - * - Configure the global KeyID on all packages. - * - Initialize all TDMRs. - * - * Return error before all steps are done. - */ - ret =3D -EINVAL; + /* Initialize TDMRs to complete the TDX module initialization */ + ret =3D init_tdmrs(&tdx_tdmr_list); if (ret) goto err_reset_pamts; =20 diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index dd35baf..c0610f0 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -18,6 +18,7 @@ #define TDH_SYS_INIT 33 #define TDH_SYS_RD 34 #define TDH_SYS_LP_INIT 35 +#define TDH_SYS_TDMR_INIT 36 #define TDH_SYS_CONFIG 45 =20 /*