From mboxrd@z Thu Jan 1 00:00:00 1970 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8420FEB64D9 for ; Mon, 19 Jun 2023 12:12:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 033AA8D0002; Mon, 19 Jun 2023 08:12:27 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F26228D0001; Mon, 19 Jun 2023 08:12:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DED928D0002; Mon, 19 Jun 2023 08:12:26 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id CEB518D0001 for ; Mon, 19 Jun 2023 08:12:26 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 85639A0788 for ; Mon, 19 Jun 2023 12:12:26 +0000 (UTC) X-FDA: 80919385092.07.EA4FF31 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf14.hostedemail.com (Postfix) with ESMTP id 2B26F100004 for ; Mon, 19 Jun 2023 12:12:23 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=HTprNq3O; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf14.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1687176744; h=from:from:sender: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:dkim-signature; bh=0uo0QtCKuUFpGsBoXwuYGALdvTF66D10qPcx/5DVjSY=; b=rTpi0W71kgDOhVu4A7LNbv0q9E+T7tWxHnnyBZt3D/+kg/+JHOznHnNJbye2uvTgSoQi+a uHzThZnJ2JNKksVVsyPfplvBRkBeE5WqwjPFf1zBcp691m5LKc2T+QcMcwUJTdhV44P1ov PE1jgZQmemyQ9KESvaglhkTlyDm5Pik= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=HTprNq3O; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf14.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1687176744; a=rsa-sha256; cv=none; b=Qn7kgBMD38UvDOSJF8OIKDp+TXv0Rl7a4BMORq1p9jU2PWbRGd0N+OVyJB7Tr7Fp7Bqrwg tP9t614JE7DWYO/EjDcjaXdX0Y075aFvl1VIdbinGLufAawZfI2gySGZtoiRFm42SwceM7 mliQu03lfTpDtP3pWWI0VQK/snuvscQ= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1687176743; h=from:from: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=0uo0QtCKuUFpGsBoXwuYGALdvTF66D10qPcx/5DVjSY=; b=HTprNq3OLbNJ3LUpe8sFrSpDOjosO1uKCK5ws18xYINyTtVOPtu3UbtGILV8GuO69gV9/j w03/yWYyAPQr+G2NYV/Dh+r1L45rBBzeFGW4tH4klNUwlbCkaHazJPrL4MzsHwE/CyuNNC iqGoZSYxm7cogTKYMgJjx1mtMx2n+NM= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-65-ttiPQTYeO4y-Jn3_9UCHtQ-1; Mon, 19 Jun 2023 08:12:21 -0400 X-MC-Unique: ttiPQTYeO4y-Jn3_9UCHtQ-1 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-3f9b19cb170so4307505e9.3 for ; Mon, 19 Jun 2023 05:12:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687176740; x=1689768740; h=content-transfer-encoding:in-reply-to:subject:organization:from :references:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0uo0QtCKuUFpGsBoXwuYGALdvTF66D10qPcx/5DVjSY=; b=K7NdPVcF65RB96bTdrwxixcowsOLq0PKdlktBTlfJxRwTlFLjwMd9eC8cKAXMI9HSl Rdb8TnrI0PJxW5yADnY+rSPj+i/ioMaLy/YqgvKn8RGcXku44wU5eP+LT3pFPbMBP7od 3Lwz2zquDCKHXgdcntF3IzjmpJSN8494Xawi7kxGRezl9QSZDww0xkav/Bt0QwthX0TK 8c6LJXKCy9IzOz1zEqYsNp5J52ouYH76Rn1w7uUTOxNlbYVHGhqCli5siuTqDRgABvsO 1UBY+ZiKUeCrPMeqKzv3tiS0qGNBbaj7ORJrfmNIGNVLTS7MjuxcMzE8tLgJirObT9Gx iZKQ== X-Gm-Message-State: AC+VfDwuOULiHEuee55q6bHr/FDDAaCGAmAETExl3vcwkD63Uz7wyzVV u1UAuH/2vq0mF7EiJ9pVUvu3FtaSIR+mLC2RatSkpYPc2hiIGL62RxGoZIkhmE9SR+I4+Fl/Npn s5cr3AdWPLMY= X-Received: by 2002:a05:600c:2245:b0:3f8:f4f3:82ec with SMTP id a5-20020a05600c224500b003f8f4f382ecmr8193825wmm.8.1687176740647; Mon, 19 Jun 2023 05:12:20 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5ho7rjLz7v0XHN88e1WF6eGHIwJhjU/bODrTSPsN3DIZOtblhpzajH4mevmLqznFAwmKpo5Q== X-Received: by 2002:a05:600c:2245:b0:3f8:f4f3:82ec with SMTP id a5-20020a05600c224500b003f8f4f382ecmr8193793wmm.8.1687176740181; Mon, 19 Jun 2023 05:12:20 -0700 (PDT) Received: from ?IPV6:2003:cb:c72f:7100:cede:6433:a77b:41e9? (p200300cbc72f7100cede6433a77b41e9.dip0.t-ipconnect.de. [2003:cb:c72f:7100:cede:6433:a77b:41e9]) by smtp.gmail.com with ESMTPSA id q19-20020a1cf313000000b003f7361ca753sm10396992wmq.24.2023.06.19.05.12.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 19 Jun 2023 05:12:19 -0700 (PDT) Message-ID: <13174f0e-801c-bdac-5df9-484435de1f8e@redhat.com> Date: Mon, 19 Jun 2023 14:12:18 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 To: Kai Huang , linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: linux-mm@kvack.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, tony.luck@intel.com, peterz@infradead.org, tglx@linutronix.de, seanjc@google.com, pbonzini@redhat.com, dan.j.williams@intel.com, rafael.j.wysocki@intel.com, ying.huang@intel.com, reinette.chatre@intel.com, len.brown@intel.com, ak@linux.intel.com, isaku.yamahata@intel.com, chao.gao@intel.com, sathyanarayanan.kuppuswamy@linux.intel.com, bagasdotme@gmail.com, sagis@google.com, imammedo@redhat.com References: From: David Hildenbrand Organization: Red Hat Subject: Re: [PATCH v11 02/20] x86/virt/tdx: Detect TDX during kernel boot In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 2B26F100004 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: j7zrnd1s9etz8ygpaipy7je5ygpy951f X-HE-Tag: 1687176743-614200 X-HE-Meta: U2FsdGVkX19HRYuOxDkb39Y9J8olvSohoXGlvWAJtd9Z1UmjXES1BGc009dc1LcwzSZo9TV6idrpGR4hE/WkffQVZffhwenQJXKWKPKTEeU97sXe+Emrtprlq7NEcYYW83Pwf6nD1ovVNrEtI+6oSbIUvfI0FSmhujbmvw6bbhLy6YBYHMYjEJq9h/h9zZy0CutOpNm8sfxO1SLYSLKfvnwYvAj2uv9eIWZWEq2Jdwoh2b9U8TXmShzwBw2l9xNEWm0zVq2+5t7p7ZiWQNiPMITfE+qqO29jB8y3vd7y7BjLDv3RQZg+eNrySOSRPosHq9q0MNBfp/H8XsKbRGTIDY9ZmzcNkXWsoWz0a5BuE+3U9zPWS7gU3jZ++I0uC2f1pkfA3Ee5IyruXqfK9kV3z3wr5VJM5wDnwY/ddvf/cAtzVDrl9NdR/2M7YVXBz94hI2dyC4vGiMZAPG5ExKIw9U1xEpGfs/t/r3hfMAg7HHszEYgxUuaBQyt5lt0cHwzq+Nacmi1ZC1t/cb3JwF11/+kdTaglchIgfx+3mqHIirbUxFFhKPPgkul64SNDHfxwxmKXLTG4fIbzQXnW8t3nNSpadPb0d99Gl0+oJ/nQx+pQ6Na+AXvLbGmcQrdVCof1xJcf+J1yyDNZQdmeoAsuZ+LVCsWrHmJtZPTTVxqKQNHm5EaVytfOJ694Tdx2Qh7jY84q7HwjDyFV4F+az0+QwV+gDeKFUYtTyoSv5IAWnTGDfkiEwNFLZcAPxjL81ztkrx4Q92cyN2jT9PRR560AYjpjSx3OIeJUKo3x96oVk9CsM6+Vt7pYNbnwJc8akhqqlop0M1AcxebDhWvCTkZ0uRnOmxWtVavPayud5tkzJxoSmGQpa8Qk6pHfTtilyRp8d4GDYUntGghoxIDbr3rUHLQkKjS6iDAU/olnanmnD2ymYKRvc6wlsCOf2mMcC5V2se1nw3Ela955dVLDvrx QUXevMZa rg9X/yWu6CtI7e0fzffgOHGSBsCosiM4o9hSVWhZlmmYsATreQJtgfhOCmBlR7+WW4ojB0tdyNXXI3JJhOdgWxumHUhhOHrkAmDGqLXvHVixLpP0Z1VTccNfNf6jkv2ZntNgS9O/29T8sMZh2d4N2oav8He+3IEgbGGy1epSSsgz4OrRx1AblonDDPy2d4lXnqY55PQpABPGKX2Nrdc6REHlilfXHUpeAs1+/y3PaFRk2ILkFXa/roIX9xNAF2bfe0RmwXA7WQQDVHbKHvcXI6ikVYcFxfXwnCHv/sZHJUf2qjVsnOjo3XJvyyYLtspQRmiW2LdTe+Iv67DRmhbOPQhRpA3AQoCHEku9XPZSpUkW9oy/CQ+TQfUZHoz9fszjKEuvCUbIq+dN/sOrDxVCB5PHbWP1gCVGHcYY17V17dYwdQsRnkzILTqpFWA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 04.06.23 16:27, Kai Huang wrote: > Intel Trust Domain Extensions (TDX) protects guest VMs from malicious > host and certain physical attacks. A CPU-attested software module > called 'the TDX module' runs inside a new isolated memory range as a > trusted hypervisor to manage and run protected VMs. > > Pre-TDX Intel hardware has support for a memory encryption architecture > called MKTME. The memory encryption hardware underpinning MKTME is also > used for Intel TDX. TDX ends up "stealing" some of the physical address > space from the MKTME architecture for crypto-protection to VMs. The > BIOS is responsible for partitioning the "KeyID" space between legacy > MKTME and TDX. The KeyIDs reserved for TDX are called 'TDX private > KeyIDs' or 'TDX KeyIDs' for short. > > TDX doesn't trust the BIOS. During machine boot, TDX verifies the TDX > private KeyIDs are consistently and correctly programmed by the BIOS > across all CPU packages before it enables TDX on any CPU core. A valid > TDX private KeyID range on BSP indicates TDX has been enabled by the > BIOS, otherwise the BIOS is buggy. > > The TDX module is expected to be loaded by the BIOS when it enables TDX, > but the kernel needs to properly initialize it before it can be used to > create and run any TDX guests. The TDX module will be initialized by > the KVM subsystem when KVM wants to use TDX. > > Add a new early_initcall(tdx_init) to detect the TDX by detecting TDX > private KeyIDs. Also add a function to report whether TDX is enabled by > the BIOS. Similar to AMD SME, kexec() will use it to determine whether > cache flush is needed. > > The TDX module itself requires one TDX KeyID as the 'TDX global KeyID' > to protect its metadata. Each TDX guest also needs a TDX KeyID for its > own protection. Just use the first TDX KeyID as the global KeyID and > leave the rest for TDX guests. If no TDX KeyID is left for TDX guests, > disable TDX as initializing the TDX module alone is useless. > > To start to support TDX, create a new arch/x86/virt/vmx/tdx/tdx.c for > TDX host kernel support. Add a new Kconfig option CONFIG_INTEL_TDX_HOST > to opt-in TDX host kernel support (to distinguish with TDX guest kernel > support). So far only KVM uses TDX. Make the new config option depend > on KVM_INTEL. > > Signed-off-by: Kai Huang > Reviewed-by: Kirill A. Shutemov > --- > > v10 -> v11 (David): > - "host kernel" -> "the host kernel" > - "protected VM" -> "confidential VM". > - Moved setting tdx_global_keyid to the end of tdx_init(). > > v9 -> v10: > - No change. > > v8 -> v9: > - Moved MSR macro from local tdx.h to (Dave). > - Moved reserving the TDX global KeyID from later patch to here. > - Changed 'tdx_keyid_start' and 'nr_tdx_keyids' to > 'tdx_guest_keyid_start' and 'tdx_nr_guest_keyids' to represent KeyIDs > can be used by guest. (Dave) > - Slight changelog update according to above changes. > > v7 -> v8: (address Dave's comments) > - Improved changelog: > - "KVM user" -> "The TDX module will be initialized by KVM when ..." > - Changed "tdx_int" part to "Just say what this patch is doing" > - Fixed the last sentence of "kexec()" paragraph > - detect_tdx() -> record_keyid_partitioning() > - Improved how to calculate tdx_keyid_start. > - tdx_keyid_num -> nr_tdx_keyids. > - Improved dmesg printing. > - Add comment to clear_tdx(). > > v6 -> v7: > - No change. > > v5 -> v6: > - Removed SEAMRR detection to make code simpler. > - Removed the 'default N' in the KVM_TDX_HOST Kconfig (Kirill). > - Changed to use 'obj-y' in arch/x86/virt/vmx/tdx/Makefile (Kirill). > > > --- > arch/x86/Kconfig | 12 +++++ > arch/x86/Makefile | 2 + > arch/x86/include/asm/msr-index.h | 3 ++ > arch/x86/include/asm/tdx.h | 7 +++ > arch/x86/virt/Makefile | 2 + > arch/x86/virt/vmx/Makefile | 2 + > arch/x86/virt/vmx/tdx/Makefile | 2 + > arch/x86/virt/vmx/tdx/tdx.c | 92 ++++++++++++++++++++++++++++++++ > 8 files changed, 122 insertions(+) > create mode 100644 arch/x86/virt/Makefile > create mode 100644 arch/x86/virt/vmx/Makefile > create mode 100644 arch/x86/virt/vmx/tdx/Makefile > create mode 100644 arch/x86/virt/vmx/tdx/tdx.c > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 53bab123a8ee..191587f75810 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -1952,6 +1952,18 @@ config X86_SGX > > If unsure, say N. > > +config INTEL_TDX_HOST > + bool "Intel Trust Domain Extensions (TDX) host support" > + depends on CPU_SUP_INTEL > + depends on X86_64 > + depends on KVM_INTEL > + help > + Intel Trust Domain Extensions (TDX) protects guest VMs from malicious > + host and certain physical attacks. This option enables necessary TDX > + support in the host kernel to run confidential VMs. > + > + If unsure, say N. > + > config EFI > bool "EFI runtime service support" > depends on ACPI > diff --git a/arch/x86/Makefile b/arch/x86/Makefile > index b39975977c03..ec0e71d8fa30 100644 > --- a/arch/x86/Makefile > +++ b/arch/x86/Makefile > @@ -252,6 +252,8 @@ archheaders: > > libs-y += arch/x86/lib/ > > +core-y += arch/x86/virt/ > + > # drivers-y are linked after core-y > drivers-$(CONFIG_MATH_EMULATION) += arch/x86/math-emu/ > drivers-$(CONFIG_PCI) += arch/x86/pci/ > diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h > index 3aedae61af4f..6d8f15b1552c 100644 > --- a/arch/x86/include/asm/msr-index.h > +++ b/arch/x86/include/asm/msr-index.h > @@ -523,6 +523,9 @@ > #define MSR_RELOAD_PMC0 0x000014c1 > #define MSR_RELOAD_FIXED_CTR0 0x00001309 > > +/* KeyID partitioning between MKTME and TDX */ > +#define MSR_IA32_MKTME_KEYID_PARTITIONING 0x00000087 > + > /* > * AMD64 MSRs. Not complete. See the architecture manual for a more > * complete list. > diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h > index 25fd6070dc0b..4dfe2e794411 100644 > --- a/arch/x86/include/asm/tdx.h > +++ b/arch/x86/include/asm/tdx.h > @@ -94,5 +94,12 @@ static inline long tdx_kvm_hypercall(unsigned int nr, unsigned long p1, > return -ENODEV; > } > #endif /* CONFIG_INTEL_TDX_GUEST && CONFIG_KVM_GUEST */ > + > +#ifdef CONFIG_INTEL_TDX_HOST > +bool platform_tdx_enabled(void); > +#else /* !CONFIG_INTEL_TDX_HOST */ > +static inline bool platform_tdx_enabled(void) { return false; } > +#endif /* CONFIG_INTEL_TDX_HOST */ > + > #endif /* !__ASSEMBLY__ */ > #endif /* _ASM_X86_TDX_H */ > diff --git a/arch/x86/virt/Makefile b/arch/x86/virt/Makefile > new file mode 100644 > index 000000000000..1e36502cd738 > --- /dev/null > +++ b/arch/x86/virt/Makefile > @@ -0,0 +1,2 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +obj-y += vmx/ > diff --git a/arch/x86/virt/vmx/Makefile b/arch/x86/virt/vmx/Makefile > new file mode 100644 > index 000000000000..feebda21d793 > --- /dev/null > +++ b/arch/x86/virt/vmx/Makefile > @@ -0,0 +1,2 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +obj-$(CONFIG_INTEL_TDX_HOST) += tdx/ > diff --git a/arch/x86/virt/vmx/tdx/Makefile b/arch/x86/virt/vmx/tdx/Makefile > new file mode 100644 > index 000000000000..93ca8b73e1f1 > --- /dev/null > +++ b/arch/x86/virt/vmx/tdx/Makefile > @@ -0,0 +1,2 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +obj-y += tdx.o > diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c > new file mode 100644 > index 000000000000..2d91e7120c90 > --- /dev/null > +++ b/arch/x86/virt/vmx/tdx/tdx.c > @@ -0,0 +1,92 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright(c) 2023 Intel Corporation. > + * > + * Intel Trusted Domain Extensions (TDX) support > + */ > + > +#define pr_fmt(fmt) "tdx: " fmt > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +static u32 tdx_global_keyid __ro_after_init; > +static u32 tdx_guest_keyid_start __ro_after_init; > +static u32 tdx_nr_guest_keyids __ro_after_init; > + > +static int __init record_keyid_partitioning(u32 *tdx_keyid_start, > + u32 *nr_tdx_keyids) > +{ > + u32 _nr_mktme_keyids, _tdx_keyid_start, _nr_tdx_keyids; > + int ret; > + > + /* > + * IA32_MKTME_KEYID_PARTIONING: > + * Bit [31:0]: Number of MKTME KeyIDs. > + * Bit [63:32]: Number of TDX private KeyIDs. > + */ > + ret = rdmsr_safe(MSR_IA32_MKTME_KEYID_PARTITIONING, &_nr_mktme_keyids, > + &_nr_tdx_keyids); > + if (ret) > + return -ENODEV; > + > + if (!_nr_tdx_keyids) > + return -ENODEV; > + > + /* TDX KeyIDs start after the last MKTME KeyID. */ > + _tdx_keyid_start = _nr_mktme_keyids + 1; > + > + *tdx_keyid_start = _tdx_keyid_start; > + *nr_tdx_keyids = _nr_tdx_keyids; > + > + return 0; > +} > + > +static int __init tdx_init(void) > +{ > + u32 tdx_keyid_start, nr_tdx_keyids; > + int err; > + > + err = record_keyid_partitioning(&tdx_keyid_start, &nr_tdx_keyids); > + if (err) > + return err; > + > + pr_info("BIOS enabled: private KeyID range [%u, %u)\n", > + tdx_keyid_start, tdx_keyid_start + nr_tdx_keyids); > + > + /* > + * The TDX module itself requires one 'global KeyID' to protect > + * its metadata. If there's only one TDX KeyID, there won't be > + * any left for TDX guests thus there's no point to enable TDX > + * at all. > + */ > + if (nr_tdx_keyids < 2) { > + pr_info("initialization failed: too few private KeyIDs available.\n"); > + goto no_tdx; > + } > + > + /* > + * Just use the first TDX KeyID as the 'global KeyID' and > + * leave the rest for TDX guests. > + */ > + tdx_global_keyid = tdx_keyid_start; > + tdx_guest_keyid_start = ++tdx_keyid_start; > + tdx_nr_guest_keyids = --nr_tdx_keyids; tdx_guest_keyid_start = tdx_keyid_start + 1; tdx_nr_guest_keyids = nr_tdx_keyids - 1; Easier to get, because the modified values are unused. I'd probably avoid the "tdx" terminology in the local variables ("keid_start", "nr_keyids") to give a better hint what the global variables are (tdx_*), but just a personal preference. Apart from that, Reviewed-by: David Hildenbrand -- Cheers, David / dhildenb