kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Chao Gao <chao.gao@intel.com>
To: Rick Edgecombe <rick.p.edgecombe@intel.com>
Cc: <seanjc@google.com>, <pbonzini@redhat.com>, <kvm@vger.kernel.org>,
	<kai.huang@intel.com>, <isaku.yamahata@gmail.com>,
	<tony.lindgren@linux.intel.com>, <xiaoyao.li@intel.com>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 10/25] KVM: TDX: Initialize KVM supported capabilities when module setup
Date: Tue, 13 Aug 2024 11:25:37 +0800	[thread overview]
Message-ID: <ZrrSMaAxyqMBcp8a@chao-email> (raw)
In-Reply-To: <20240812224820.34826-11-rick.p.edgecombe@intel.com>

On Mon, Aug 12, 2024 at 03:48:05PM -0700, Rick Edgecombe wrote:
>From: Xiaoyao Li <xiaoyao.li@intel.com>
>
>While TDX module reports a set of capabilities/features that it
>supports, what KVM currently supports might be a subset of them.
>E.g., DEBUG and PERFMON are supported by TDX module but currently not
>supported by KVM.
>
>Introduce a new struct kvm_tdx_caps to store KVM's capabilities of TDX.
>supported_attrs and suppported_xfam are validated against fixed0/1
>values enumerated by TDX module. Configurable CPUID bits derive from TDX
>module plus applying KVM's capabilities (KVM_GET_SUPPORTED_CPUID),
>i.e., mask off the bits that are configurable in the view of TDX module
>but not supported by KVM yet.
>
>KVM_TDX_CPUID_NO_SUBLEAF is the concept from TDX module, switch it to 0
>and use KVM_CPUID_FLAG_SIGNIFCANT_INDEX, which are the concept of KVM.

If we convert KVM_TDX_CPUID_NO_SUBLEAF to 0 when reporting capabilities to
QEMU, QEMU cannot distinguish a CPUID subleaf 0 from a CPUID w/o subleaf.
Does it matter to QEMU?

>
>Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
>Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
>---
>uAPI breakout v1:
> - Change setup_kvm_tdx_caps() to use the exported 'struct tdx_sysinfo'
>   pointer.
> - Change how to copy 'kvm_tdx_cpuid_config' since 'struct tdx_sysinfo'
>   doesn't have 'kvm_tdx_cpuid_config'.
> - Updates for uAPI changes
>---
> arch/x86/include/uapi/asm/kvm.h |  2 -
> arch/x86/kvm/vmx/tdx.c          | 81 +++++++++++++++++++++++++++++++++
> 2 files changed, 81 insertions(+), 2 deletions(-)
>
>diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
>index 47caf508cca7..c9eb2e2f5559 100644
>--- a/arch/x86/include/uapi/asm/kvm.h
>+++ b/arch/x86/include/uapi/asm/kvm.h
>@@ -952,8 +952,6 @@ struct kvm_tdx_cmd {
> 	__u64 hw_error;
> };
> 
>-#define KVM_TDX_CPUID_NO_SUBLEAF	((__u32)-1)
>-

This definition can be dropped from the previous patch because it isn't
used there.

> struct kvm_tdx_cpuid_config {
> 	__u32 leaf;
> 	__u32 sub_leaf;
>diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
>index 90b44ebaf864..d89973e554f6 100644
>--- a/arch/x86/kvm/vmx/tdx.c
>+++ b/arch/x86/kvm/vmx/tdx.c
>@@ -31,6 +31,19 @@ static void __used tdx_guest_keyid_free(int keyid)
> 	ida_free(&tdx_guest_keyid_pool, keyid);
> }
> 
>+#define KVM_TDX_CPUID_NO_SUBLEAF	((__u32)-1)
>+
>+struct kvm_tdx_caps {
>+	u64 supported_attrs;
>+	u64 supported_xfam;
>+
>+	u16 num_cpuid_config;
>+	/* This must the last member. */
>+	DECLARE_FLEX_ARRAY(struct kvm_tdx_cpuid_config, cpuid_configs);
>+};
>+
>+static struct kvm_tdx_caps *kvm_tdx_caps;
>+
> static int tdx_get_capabilities(struct kvm_tdx_cmd *cmd)
> {
> 	const struct tdx_sysinfo_td_conf *td_conf = &tdx_sysinfo->td_conf;
>@@ -131,6 +144,68 @@ int tdx_vm_ioctl(struct kvm *kvm, void __user *argp)
> 	return r;
> }
> 
>+#define KVM_SUPPORTED_TD_ATTRS (TDX_TD_ATTR_SEPT_VE_DISABLE)
>+
>+static int __init setup_kvm_tdx_caps(void)
>+{
>+	const struct tdx_sysinfo_td_conf *td_conf = &tdx_sysinfo->td_conf;
>+	u64 kvm_supported;
>+	int i;
>+
>+	kvm_tdx_caps = kzalloc(sizeof(*kvm_tdx_caps) +
>+			       sizeof(struct kvm_tdx_cpuid_config) * td_conf->num_cpuid_config,

struct_size()

>+			       GFP_KERNEL);
>+	if (!kvm_tdx_caps)
>+		return -ENOMEM;
>+
>+	kvm_supported = KVM_SUPPORTED_TD_ATTRS;
>+	if ((kvm_supported & td_conf->attributes_fixed1) != td_conf->attributes_fixed1)
>+		goto err;
>+
>+	kvm_tdx_caps->supported_attrs = kvm_supported & td_conf->attributes_fixed0;
>+
>+	kvm_supported = kvm_caps.supported_xcr0 | kvm_caps.supported_xss;
>+
>+	/*
>+	 * PT and CET can be exposed to TD guest regardless of KVM's XSS, PT
>+	 * and, CET support.
>+	 */
>+	kvm_supported |= XFEATURE_MASK_PT | XFEATURE_MASK_CET_USER |
>+			 XFEATURE_MASK_CET_KERNEL;

I prefer to add PT/CET bits in separate patches because PT/CET related MSRs may
need save/restore. Putting them in separate patches can give us the chance to
explain this in detail.

>+	if ((kvm_supported & td_conf->xfam_fixed1) != td_conf->xfam_fixed1)
>+		goto err;
>+
>+	kvm_tdx_caps->supported_xfam = kvm_supported & td_conf->xfam_fixed0;
>+
>+	kvm_tdx_caps->num_cpuid_config = td_conf->num_cpuid_config;
>+	for (i = 0; i < td_conf->num_cpuid_config; i++) {
>+		struct kvm_tdx_cpuid_config source = {
>+			.leaf = (u32)td_conf->cpuid_config_leaves[i],
>+			.sub_leaf = td_conf->cpuid_config_leaves[i] >> 32,
>+			.eax = (u32)td_conf->cpuid_config_values[i].eax_ebx,
>+			.ebx = td_conf->cpuid_config_values[i].eax_ebx >> 32,
>+			.ecx = (u32)td_conf->cpuid_config_values[i].ecx_edx,
>+			.edx = td_conf->cpuid_config_values[i].ecx_edx >> 32,
>+		};
>+		struct kvm_tdx_cpuid_config *dest =
>+			&kvm_tdx_caps->cpuid_configs[i];
>+
>+		memcpy(dest, &source, sizeof(struct kvm_tdx_cpuid_config));

this memcpy() looks superfluous. does this work?

		kvm_tdx_caps->cpuid_configs[i] = {
			.leaf = (u32)td_conf->cpuid_config_leaves[i],
			.sub_leaf = td_conf->cpuid_config_leaves[i] >> 32,
			.eax = (u32)td_conf->cpuid_config_values[i].eax_ebx,
			.ebx = td_conf->cpuid_config_values[i].eax_ebx >> 32,
			.ecx = (u32)td_conf->cpuid_config_values[i].ecx_edx,
			.edx = td_conf->cpuid_config_values[i].ecx_edx >> 32,
		};

>+		if (dest->sub_leaf == KVM_TDX_CPUID_NO_SUBLEAF)
>+			dest->sub_leaf = 0;
>+	}
>+
>+	return 0;
>+err:
>+	kfree(kvm_tdx_caps);
>+	return -EIO;
>+}

  reply	other threads:[~2024-08-13  3:25 UTC|newest]

Thread overview: 191+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-12 22:47 [PATCH 00/25] TDX vCPU/VM creation Rick Edgecombe
2024-08-12 22:47 ` [PATCH 01/25] KVM: TDX: Add placeholders for TDX VM/vCPU structures Rick Edgecombe
2024-09-10 16:00   ` Paolo Bonzini
2024-08-12 22:47 ` [PATCH 02/25] KVM: TDX: Define TDX architectural definitions Rick Edgecombe
2024-08-29 13:25   ` Xiaoyao Li
2024-08-29 19:46     ` Edgecombe, Rick P
2024-08-30  1:29       ` Xiaoyao Li
2024-08-30  4:45         ` Tony Lindgren
2024-09-10 16:21       ` Paolo Bonzini
2024-09-10 17:49         ` Sean Christopherson
2024-08-12 22:47 ` [PATCH 03/25] KVM: TDX: Add TDX "architectural" error codes Rick Edgecombe
2024-08-13  6:08   ` Binbin Wu
2024-08-29  5:24     ` Tony Lindgren
2024-08-30  5:52       ` Tony Lindgren
2024-09-10 16:22         ` Paolo Bonzini
2024-09-11  5:58           ` Tony Lindgren
2024-08-12 22:47 ` [PATCH 04/25] KVM: TDX: Add C wrapper functions for SEAMCALLs to the TDX module Rick Edgecombe
2024-08-12 22:48 ` [PATCH 05/25] KVM: TDX: Add helper functions to print TDX SEAMCALL error Rick Edgecombe
2024-08-13 16:32   ` Isaku Yamahata
2024-08-13 22:34     ` Huang, Kai
2024-08-14  0:31       ` Isaku Yamahata
2024-08-30  5:56         ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 06/25] x86/virt/tdx: Export TDX KeyID information Rick Edgecombe
2024-08-30 18:45   ` Dave Hansen
2024-08-30 19:16     ` Edgecombe, Rick P
2024-08-30 21:18       ` Dave Hansen
2024-09-10 16:26         ` Paolo Bonzini
2024-08-12 22:48 ` [PATCH 07/25] KVM: TDX: Add helper functions to allocate/free TDX private host key id Rick Edgecombe
2024-09-10 16:27   ` Paolo Bonzini
2024-09-10 16:39     ` Edgecombe, Rick P
2024-09-10 16:42       ` Paolo Bonzini
2024-09-10 16:43         ` Edgecombe, Rick P
2024-08-12 22:48 ` [PATCH 08/25] KVM: TDX: Add place holder for TDX VM specific mem_enc_op ioctl Rick Edgecombe
2024-08-13  6:25   ` Binbin Wu
2024-08-13 16:37   ` Isaku Yamahata
2024-08-30  6:00     ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 09/25] KVM: TDX: Get system-wide info about TDX module on initialization Rick Edgecombe
2024-08-13  6:47   ` Binbin Wu
2024-08-30  6:59     ` Tony Lindgren
2024-08-14  6:18   ` Binbin Wu
2024-08-21  0:11     ` Edgecombe, Rick P
2024-08-21  6:14       ` Tony Lindgren
2024-08-15  7:59   ` Xu Yilun
2024-08-30  7:21     ` Tony Lindgren
2024-09-02  1:25       ` Xu Yilun
2024-09-02  5:05         ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 10/25] KVM: TDX: Initialize KVM supported capabilities when module setup Rick Edgecombe
2024-08-13  3:25   ` Chao Gao [this message]
2024-08-13  5:26     ` Huang, Kai
2024-08-30  8:44       ` Tony Lindgren
2024-08-13  7:24     ` Binbin Wu
2024-08-14  0:26       ` Chao Gao
2024-08-14  2:36         ` Binbin Wu
2024-08-30  8:34     ` Tony Lindgren
2024-09-10 16:58       ` Paolo Bonzini
2024-09-11 11:07         ` Tony Lindgren
2024-09-03 16:53     ` Edgecombe, Rick P
2024-08-19  1:33   ` Tao Su
2024-08-29 13:28     ` Xiaoyao Li
2024-08-26 11:04   ` Nikolay Borisov
2024-08-29  4:51     ` Tony Lindgren
2024-09-10 17:15       ` Paolo Bonzini
2024-09-11 11:04         ` Tony Lindgren
2024-10-10  8:25           ` Xiaoyao Li
2024-10-10  9:49             ` Tony Lindgren
2024-09-04 11:58   ` Nikolay Borisov
2024-09-05 13:36     ` Xiaoyao Li
2024-09-12  8:04       ` Nikolay Borisov
2024-09-12  8:37         ` Xiaoyao Li
2024-09-12  8:43           ` Nikolay Borisov
2024-09-12  9:07             ` Xiaoyao Li
2024-09-12 15:12               ` Edgecombe, Rick P
2024-09-12 15:18                 ` Nikolay Borisov
2024-08-12 22:48 ` [PATCH 11/25] KVM: TDX: Report kvm_tdx_caps in KVM_TDX_CAPABILITIES Rick Edgecombe
2024-08-13  3:35   ` Chao Gao
2024-08-19 10:24     ` Nikolay Borisov
2024-08-21  0:06       ` Edgecombe, Rick P
2024-08-12 22:48 ` [PATCH 12/25] KVM: TDX: Allow userspace to configure maximum vCPUs for TDX guests Rick Edgecombe
2024-08-19  1:17   ` Tao Su
2024-08-21  0:12     ` Edgecombe, Rick P
2024-08-30  8:53     ` Tony Lindgren
2024-09-30  2:14   ` Xiaoyao Li
2024-08-12 22:48 ` [PATCH 13/25] KVM: TDX: create/destroy VM structure Rick Edgecombe
2024-08-14  3:08   ` Yuan Yao
2024-08-21  6:13     ` Tony Lindgren
2024-08-16  7:31   ` Xu Yilun
2024-08-30  9:26     ` Tony Lindgren
2024-08-19 15:09   ` Nikolay Borisov
2024-08-21  0:23     ` Edgecombe, Rick P
2024-08-21  5:39       ` Tony Lindgren
2024-08-21 16:52         ` Edgecombe, Rick P
2024-08-30  9:40           ` Tony Lindgren
2024-09-02  9:22     ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 14/25] KVM: TDX: initialize VM with TDX specific parameters Rick Edgecombe
2024-08-19 15:35   ` Nikolay Borisov
2024-08-21  0:01     ` Edgecombe, Rick P
2024-08-29  6:27   ` Yan Zhao
2024-09-02 10:31     ` Tony Lindgren
2024-09-05  6:59       ` Yan Zhao
2024-09-05  9:27         ` Tony Lindgren
2024-09-06  4:05           ` Yan Zhao
2024-09-06  4:32             ` Tony Lindgren
2024-09-06 13:52               ` Wang, Wei W
2024-09-03  2:58   ` Chenyi Qiang
2024-09-03  5:44     ` Tony Lindgren
2024-09-03  8:04       ` Chenyi Qiang
2024-09-05  9:31         ` Tony Lindgren
2024-10-01 20:45           ` Edgecombe, Rick P
2024-10-02 23:39   ` Edgecombe, Rick P
2024-08-12 22:48 ` [PATCH 15/25] KVM: TDX: Make pmu_intel.c ignore guest TD case Rick Edgecombe
2024-09-10 17:23   ` Paolo Bonzini
2024-10-01 10:23     ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 16/25] KVM: TDX: Don't offline the last cpu of one package when there's TDX guest Rick Edgecombe
2024-08-13  8:37   ` Binbin Wu
2024-08-12 22:48 ` [PATCH 17/25] KVM: TDX: create/free TDX vcpu structure Rick Edgecombe
2024-08-13  9:15   ` Binbin Wu
2024-09-02 10:50     ` Tony Lindgren
2024-08-19 16:46   ` Nikolay Borisov
2024-08-29  5:00     ` Tony Lindgren
2024-08-29  6:41   ` Yan Zhao
2024-08-12 22:48 ` [PATCH 18/25] KVM: TDX: Do TDX specific vcpu initialization Rick Edgecombe
2024-08-13  8:00   ` Yuan Yao
2024-08-13 17:21     ` Isaku Yamahata
2024-08-14  1:20       ` Yuan Yao
2024-08-15  0:47         ` Isaku Yamahata
2024-09-03  5:23     ` Tony Lindgren
2024-10-09 15:01     ` Adrian Hunter
2024-10-16 17:42       ` Edgecombe, Rick P
2024-10-18  2:21         ` Xiaoyao Li
2024-10-18 14:20           ` Edgecombe, Rick P
2024-10-21  8:35             ` Xiaoyao Li
2024-10-26  1:12               ` Edgecombe, Rick P
2024-08-28 14:34   ` Edgecombe, Rick P
2024-09-03  5:34     ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 19/25] KVM: X86: Introduce kvm_get_supported_cpuid_internal() Rick Edgecombe
2024-08-12 22:48 ` [PATCH 20/25] KVM: X86: Introduce tdx_get_kvm_supported_cpuid() Rick Edgecombe
2024-08-12 22:48 ` [PATCH 21/25] KVM: x86: Introduce KVM_TDX_GET_CPUID Rick Edgecombe
2024-08-19  2:59   ` Tao Su
2024-09-03  6:21     ` Tony Lindgren
2024-09-10 17:27       ` Paolo Bonzini
2024-08-19  5:02   ` Xu Yilun
2024-09-03  7:19     ` Tony Lindgren
2024-09-10 17:29       ` Paolo Bonzini
2024-09-11 11:11         ` Tony Lindgren
2024-08-26 14:09   ` Nikolay Borisov
2024-08-26 17:46     ` Edgecombe, Rick P
2024-08-27 12:19       ` Nikolay Borisov
2024-08-27 20:40         ` Edgecombe, Rick P
2024-09-30  6:26   ` Xiaoyao Li
2024-09-30 16:22     ` Edgecombe, Rick P
2024-08-12 22:48 ` [PATCH 22/25] KVM: TDX: Use guest physical address to configure EPT level and GPAW Rick Edgecombe
2024-09-10 17:31   ` Paolo Bonzini
2024-10-10  9:13   ` Xiaoyao Li
2024-10-10 10:36     ` Tony Lindgren
2024-08-12 22:48 ` [PATCH 23/25] KVM: x86/mmu: Taking guest pa into consideration when calculate tdp level Rick Edgecombe
2024-09-10 17:33   ` Paolo Bonzini
2024-08-12 22:48 ` [PATCH 24/25] KVM: x86: Filter directly configurable TDX CPUID bits Rick Edgecombe
2024-08-19  5:02   ` Xu Yilun
2024-09-03  7:51     ` Tony Lindgren
2024-09-10 17:36   ` Paolo Bonzini
2024-08-12 22:48 ` [PATCH 25/25] KVM: x86: Add CPUID bits missing from KVM_GET_SUPPORTED_CPUID Rick Edgecombe
2024-08-13 11:34   ` Chao Gao
2024-08-13 15:14     ` Xiaoyao Li
2024-08-14  0:47       ` Chao Gao
2024-08-14  1:16         ` Sean Christopherson
2024-08-14 10:46           ` Chao Gao
2024-08-14 13:35             ` Sean Christopherson
2024-08-14 17:35               ` Edgecombe, Rick P
2024-08-14 21:22                 ` Sean Christopherson
2024-08-13 18:45     ` Edgecombe, Rick P
2024-08-14  1:10       ` Sean Christopherson
2024-08-14 11:36       ` Chao Gao
2024-08-14 17:17         ` Edgecombe, Rick P
2024-09-10 17:52   ` Paolo Bonzini
2024-09-12  7:48     ` Xiaoyao Li
2024-09-12 14:09       ` Paolo Bonzini
2024-09-12 14:45         ` Xiaoyao Li
2024-09-12 14:48           ` Paolo Bonzini
2024-09-12 15:26             ` Xiaoyao Li
2024-09-12 16:42             ` Sean Christopherson
2024-09-12 18:29               ` Paolo Bonzini
2024-09-12 18:41                 ` Sean Christopherson
2024-09-13  3:54                   ` Xiaoyao Li
2024-09-12 18:42                 ` Edgecombe, Rick P
2024-09-13  3:57               ` Xiaoyao Li
2024-09-12 15:07         ` Edgecombe, Rick P
2024-09-12 15:37           ` Paolo Bonzini
2024-09-12 16:38             ` Edgecombe, Rick P
2024-08-15  5:20 ` [PATCH 00/25] TDX vCPU/VM creation Tony Lindgren
2024-08-15 23:46   ` Edgecombe, Rick P
2024-08-16  5:18     ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZrrSMaAxyqMBcp8a@chao-email \
    --to=chao.gao@intel.com \
    --cc=isaku.yamahata@gmail.com \
    --cc=kai.huang@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=seanjc@google.com \
    --cc=tony.lindgren@linux.intel.com \
    --cc=xiaoyao.li@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).