kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Sagi Shahar <sagis@google.com>
Cc: Ira Weiny <ira.weiny@intel.com>,
	linux-kselftest@vger.kernel.org,
	 Paolo Bonzini <pbonzini@redhat.com>,
	Shuah Khan <shuah@kernel.org>,
	 Ackerley Tng <ackerleytng@google.com>,
	Ryan Afranji <afranji@google.com>,
	 Andrew Jones <ajones@ventanamicro.com>,
	Isaku Yamahata <isaku.yamahata@intel.com>,
	 Erdem Aktas <erdemaktas@google.com>,
	Rick Edgecombe <rick.p.edgecombe@intel.com>,
	 Roger Wang <runanwang@google.com>,
	Binbin Wu <binbin.wu@linux.intel.com>,
	 Oliver Upton <oliver.upton@linux.dev>,
	"Pratik R. Sampat" <pratikrajesh.sampat@amd.com>,
	 Reinette Chatre <reinette.chatre@intel.com>,
	Chao Gao <chao.gao@intel.com>,
	 Chenyi Qiang <chenyi.qiang@intel.com>,
	linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH v12 20/23] KVM: selftests: Add support for TDX TDCALL from guest
Date: Fri, 31 Oct 2025 16:12:00 +0000	[thread overview]
Message-ID: <aQTf0EXxtsi_4UaB@google.com> (raw)
In-Reply-To: <CAAhR5DHidvrzdkugdL-UNDugYUd9zypbbu1131GexbZpTPzB3g@mail.gmail.com>

On Fri, Oct 31, 2025, Sagi Shahar wrote:
> On Fri, Oct 31, 2025 at 10:15 AM Sean Christopherson <seanjc@google.com> wrote:
> >
> > On Fri, Oct 31, 2025, Ira Weiny wrote:
> > > Sagi Shahar wrote:
> > > > From: Erdem Aktas <erdemaktas@google.com>
> > > >
> > > > Add support for TDX guests to issue TDCALLs to the TDX module.
> > >
> > > Generally it is nice to have more details.  As someone new to TDX I
> > > have to remind myself what a TDCALL is.  And any random kernel developer
> > > reading this in the future will likely have even less clue than me.
> > >
> > > Paraphrased from the spec:
> > >
> > > TDCALL is the instruction used by the guest TD software (in TDX non-root
> > > mode) to invoke guest-side TDX functions.  TDG.VP.VMCALL helps invoke
> > > services from the host VMM.
> > >
> > > Add support for TDX guests to invoke services from the host VMM.
> >
> > Eh, at some point a baseline amount of knowledge is required.  I highly doubt
> > regurgitating the spec is going to make a huge difference
> >
> > I also dislike the above wording, because it doesn't help understand _why_ KVM
> > selftests need to support TDCALL, or _how_ the functionality will be utilized.
> > E.g. strictly speaking, we could write KVM selftests without ever doing a single
> > TDG.VP.VMCALL, because we control both sides (guest and VMM).  And I have a hard
> > time belive name-dropping TDG.VP.VMCALL is going to connect the dots between
> > TDCALL and the "tunneling" scheme defined by the GHCI for requesting emulation
> > of "legacy" functionality".
> >
> > What I would like to know is why selftests are copy-pasting the kernel's scheme
> > for marshalling data to/from the registers used by TDCALL, how selftests are
> > expected to utilize TDCALL, etc.  I'm confident that if someone actually took the
> > time to write a changelog explaining those details, then what TDCALL "is" will
> > be fairly clear, even if the reader doesn't know exactly what it is.
> >
> > E.g. IMO this is ugly and lazy on multiple fronts:
> 
> To give some context to why this was done this way: Part of the reason
> for the selftests is to test the GHCI protocol itself.

The only part of the protocol that we're actually testing is the guest<=>KVM
interaction.  Testing the guest<=>VMM interaction is self-referential, i.e. we're
validating that we implemented the guest and VMM sides correctly, which is all
kinds of silly.

> Some of the selftests will issue calls with purposely invalid arguments to
> ensure KVM handles these cases properly. For example, issuing a port IO calls
> with sizes other than 1,2 or 4 and ensure we get an error on the guest side.

That's fine, great in fact, but that's completely orthogonal to how selftests
implement the literal guest or VMM code.

> The code was intentionally written to be specific to TDX so we can
> test the TDX GHCI spec itself.

That's 100% possible without copy+pasting the kernel, and also 100% possible
while also providing sane, common interaces.

> As I understand it, you want the selftests to operate at a higher
> level and abstract away the specific GHCI details so that the code can
> be shared between TDX and SEV. 

No, I want us to think critically about what we're actually doing, and I want us
to write code that is maintainable and as easy to follow as possible.

> I can refactor the code to abstract away implementation details. However,
> tests that want to exercise the API at a fine-grained level to test different
> arguments will need to define these TDCALLs themselves.

It's not so much about abstracting details as it is about making it easy to write
tests.  Yes, some TDX-specific tests will need to know the gory details.  But in
the grand scheme, those will be a very tiny percentage of all KVM selftests.

E.g. in all likelihood there should be literally _one_ test to validate that KVM
and the TDX-Module honor the guest<=>KVM GHCI contract.  Or maybe one test per
instruction/operation.  Everything else, even tests that are TDX specific, should
not care one whit about the GHCI.

> These calls were placed in a header that can be included in the guest
> code. I can add higher level wrappers that can be used for common
> code.
> 
> >
> > uint64_t tdg_vp_vmcall_ve_request_mmio_write(uint64_t address, uint64_t size,
> >                                             uint64_t data_in)
> > {
> >        struct tdx_tdcall_args args = {
> >                .r10 = TDG_VP_VMCALL,
> >                .r11 = TDG_VP_VMCALL_VE_REQUEST_MMIO,
> >                .r12 = size,
> >                .r13 = MMIO_WRITE,
> >                .r14 = address,
> >                .r15 = data_in,
> >        };
> >
> >        return __tdx_tdcall(&args, 0);
> > }
> >
> > First, these are KVM selftests, there's no need to provide a super fancy namespace
> > because we are "competing" with thousands upon thousands of lines of code from
> > other components and subsystems.
> >
> > Similarly, tdg_vp_vmcall_ve_request_mmio_write() is absurdly verbose.  Referencing
> > #VE in any way is also flat out wrong.
> 
> This name was taken from the GHCI spec: TDG.VP.VMCALL<#VE.RequestMMIO>
> ("Intel TDX Guest-Hypervisor Communication Interface v1.5" section 3.7)

I know, and I'm saying throw away the GHCI except for when it's absolutely necessary
to care what the GHCI says.

  reply	other threads:[~2025-10-31 16:12 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-28 21:20 [PATCH v12 00/23] TDX KVM selftests Sagi Shahar
2025-10-28 21:20 ` [PATCH v12 01/23] KVM: selftests: Add macros so simplify creating VM shapes for non-default types Sagi Shahar
2025-10-29  1:13   ` Ira Weiny
2025-10-29  6:57   ` Binbin Wu
2025-10-31  3:42   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 02/23] KVM: selftests: Allocate pgd in virt_map() as necessary Sagi Shahar
2025-10-31  3:51   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 03/23] KVM: selftests: Expose functions to get default sregs values Sagi Shahar
2025-10-29  1:40   ` Ira Weiny
2025-10-31  3:43   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 04/23] KVM: selftests: Expose function to allocate guest vCPU stack Sagi Shahar
2025-10-29 13:24   ` Ira Weiny
2025-10-31  3:52   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 05/23] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Sagi Shahar
2025-10-29 15:22   ` Ira Weiny
2025-10-31  3:53   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 06/23] KVM: selftests: Expose segment definitons to assembly files Sagi Shahar
2025-10-31  3:54   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 07/23] KVM: selftests: Add kbuild definitons Sagi Shahar
2025-10-29  7:43   ` Binbin Wu
2025-10-29 15:46     ` Ira Weiny
2025-10-29 15:55   ` Ira Weiny
2025-10-31  3:56   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 08/23] KVM: selftests: Define structs to pass parameters to TDX boot code Sagi Shahar
2025-10-29 16:37   ` Reinette Chatre
2025-10-30 14:20     ` Sean Christopherson
2025-10-31  4:01   ` Reinette Chatre
2025-11-26 22:32   ` Ira Weiny
2025-12-01 20:28     ` Ira Weiny
2025-10-28 21:20 ` [PATCH v12 09/23] KVM: selftests: Add " Sagi Shahar
2025-10-28 21:20 ` [PATCH v12 10/23] KVM: selftests: Set up TDX boot code region Sagi Shahar
2025-10-28 21:20 ` [PATCH v12 11/23] KVM: selftests: Set up TDX boot parameters region Sagi Shahar
2025-10-29  8:52   ` Binbin Wu
2025-10-29 21:01   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 12/23] KVM: selftests: Add helper to initialize TDX VM Sagi Shahar
2025-10-29 21:16   ` Ira Weiny
2025-10-29 23:01     ` Reinette Chatre
2025-10-30  1:25   ` Binbin Wu
2025-10-31  4:06   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 13/23] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Sagi Shahar
2025-10-29 21:19   ` Ira Weiny
2025-10-30  1:35   ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 14/23] KVM: selftests: Add helpers to init TDX memory and finalize VM Sagi Shahar
2025-10-29 21:27   ` Ira Weiny
2025-10-30  2:32   ` Binbin Wu
2025-10-31 15:58   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 15/23] KVM: selftests: Call TDX init when creating a new TDX vm Sagi Shahar
2025-10-30 22:20   ` Ira Weiny
2025-10-31 16:03   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 16/23] KVM: selftests: Setup memory regions for TDX on vm creation Sagi Shahar
2025-10-29 13:18   ` Ira Weiny
2025-10-30  6:01     ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 17/23] KVM: selftests: Call KVM_TDX_INIT_VCPU when creating a new TDX vcpu Sagi Shahar
2025-10-30  6:15   ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 18/23] KVM: selftests: Set entry point for TDX guest code Sagi Shahar
2025-10-31 16:03   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 19/23] KVM: selftests: Finalize TD memory as part of kvm_arch_vm_finalize_vcpus Sagi Shahar
2025-10-31 13:10   ` Ira Weiny
2025-10-31 16:05   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 20/23] KVM: selftests: Add support for TDX TDCALL from guest Sagi Shahar
2025-10-31 14:11   ` Ira Weiny
2025-10-31 15:15     ` Sean Christopherson
2025-10-31 15:58       ` Sagi Shahar
2025-10-31 16:12         ` Sean Christopherson [this message]
2025-10-31 16:01       ` Sean Christopherson
2025-10-28 21:20 ` [PATCH v12 21/23] KVM: selftests: Add wrapper for TDX MMIO " Sagi Shahar
2025-10-31 14:21   ` Ira Weiny
2025-10-28 21:20 ` [PATCH v12 22/23] KVM: selftests: Add ucall support for TDX Sagi Shahar
2025-10-31 14:38   ` Ira Weiny
2025-10-31 15:55   ` Sean Christopherson
2025-10-28 21:20 ` [PATCH v12 23/23] KVM: selftests: Add TDX lifecycle test Sagi Shahar

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=aQTf0EXxtsi_4UaB@google.com \
    --to=seanjc@google.com \
    --cc=ackerleytng@google.com \
    --cc=afranji@google.com \
    --cc=ajones@ventanamicro.com \
    --cc=binbin.wu@linux.intel.com \
    --cc=chao.gao@intel.com \
    --cc=chenyi.qiang@intel.com \
    --cc=erdemaktas@google.com \
    --cc=ira.weiny@intel.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=oliver.upton@linux.dev \
    --cc=pbonzini@redhat.com \
    --cc=pratikrajesh.sampat@amd.com \
    --cc=reinette.chatre@intel.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=runanwang@google.com \
    --cc=sagis@google.com \
    --cc=shuah@kernel.org \
    /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).