public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Binbin Wu <binbin.wu@linux.intel.com>
To: Sagi Shahar <sagis@google.com>
Cc: linux-kselftest@vger.kernel.org,
	Paolo Bonzini <pbonzini@redhat.com>,
	Shuah Khan <shuah@kernel.org>,
	Sean Christopherson <seanjc@google.com>,
	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>,
	Oliver Upton <oliver.upton@linux.dev>,
	"Pratik R. Sampat" <pratikrajesh.sampat@amd.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	Ira Weiny <ira.weiny@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 v10 20/21] KVM: selftests: Add ucall support for TDX
Date: Wed, 10 Sep 2025 15:46:02 +0800	[thread overview]
Message-ID: <46946d39-c980-42a5-9f67-1642fa7f0beb@linux.intel.com> (raw)
In-Reply-To: <20250904065453.639610-21-sagis@google.com>



On 9/4/2025 2:54 PM, Sagi Shahar wrote:
> From: Ackerley Tng <ackerleytng@google.com>
>
> ucalls for non-Coco VMs work by having the guest write to the rdi
> register, then perform an io instruction to exit to the host. The host
> then reads rdi using kvm_get_regs().
>
> CPU registers can't be read using kvm_get_regs() for TDX, so TDX
> guests use MMIO to pass the struct ucall's hva to the host. MMIO was
> chosen because it is one of the simplest (hence unlikely to fail)
> mechanisms that support passing 8 bytes from guest to host.
>
> Signed-off-by: Ackerley Tng <ackerleytng@google.com>
> Co-developed-by: Sagi Shahar <sagis@google.com>
> Signed-off-by: Sagi Shahar <sagis@google.com>
> ---
>   .../testing/selftests/kvm/include/x86/ucall.h |  4 +-
>   tools/testing/selftests/kvm/lib/x86/ucall.c   | 45 ++++++++++++++++---
>   2 files changed, 41 insertions(+), 8 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/include/x86/ucall.h b/tools/testing/selftests/kvm/include/x86/ucall.h
> index d3825dcc3cd9..0494a4a21557 100644
> --- a/tools/testing/selftests/kvm/include/x86/ucall.h
> +++ b/tools/testing/selftests/kvm/include/x86/ucall.h
> @@ -6,8 +6,6 @@
>   
>   #define UCALL_EXIT_REASON       KVM_EXIT_IO
>   
> -static inline void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
> -{
> -}
> +void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa);

It has been declared in ucall_common.h,  this should be removed here?

>   
>   #endif
> diff --git a/tools/testing/selftests/kvm/lib/x86/ucall.c b/tools/testing/selftests/kvm/lib/x86/ucall.c
> index 1265cecc7dd1..0ad24baaa3c4 100644
> --- a/tools/testing/selftests/kvm/lib/x86/ucall.c
> +++ b/tools/testing/selftests/kvm/lib/x86/ucall.c
> @@ -5,11 +5,34 @@
>    * Copyright (C) 2018, Red Hat, Inc.
>    */
>   #include "kvm_util.h"
> +#include "tdx/tdx.h"
>   
>   #define UCALL_PIO_PORT ((uint16_t)0x1000)
>   
> +static uint8_t vm_type;
> +static vm_paddr_t host_ucall_mmio_gpa;
> +static vm_paddr_t ucall_mmio_gpa;
> +
> +void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
> +{
> +	vm_type = vm->type;
> +	sync_global_to_guest(vm, vm_type);
> +
> +	host_ucall_mmio_gpa = ucall_mmio_gpa = mmio_gpa;
> +
> +	if (vm_type == KVM_X86_TDX_VM)
Nit: is_tdx_vm(vm)

Also, maybe it can skip the initialization of mmio info for non TDX case to tell
that the info is only used by TDX?

> +		ucall_mmio_gpa |= vm->arch.s_bit;
> +
> +	sync_global_to_guest(vm, ucall_mmio_gpa);
> +}
> +
>   void ucall_arch_do_ucall(vm_vaddr_t uc)
>   {
> +	if (vm_type == KVM_X86_TDX_VM) {
> +		tdg_vp_vmcall_ve_request_mmio_write(ucall_mmio_gpa, 8, uc);
> +		return;
> +	}
> +
>   	/*
>   	 * FIXME: Revert this hack (the entire commit that added it) once nVMX
>   	 * preserves L2 GPRs across a nested VM-Exit.  If a ucall from L2, e.g.
> @@ -46,11 +69,23 @@ void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)
>   {
>   	struct kvm_run *run = vcpu->run;
>   
> -	if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) {
> -		struct kvm_regs regs;
> +	switch (vm_type) {
> +	case KVM_X86_TDX_VM:
> +		if (vcpu->run->exit_reason == KVM_EXIT_MMIO &&
> +		    vcpu->run->mmio.phys_addr == host_ucall_mmio_gpa &&
> +		    vcpu->run->mmio.len == 8 && vcpu->run->mmio.is_write) {
> +			uint64_t data = *(uint64_t *)vcpu->run->mmio.data;
> +
> +			return (void *)data;
> +		}
> +		return NULL;
> +	default:
> +		if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) {
> +			struct kvm_regs regs;
>   
> -		vcpu_regs_get(vcpu, &regs);
> -		return (void *)regs.rdi;
> +			vcpu_regs_get(vcpu, &regs);
> +			return (void *)regs.rdi;
> +		}
> +		return NULL;
>   	}
> -	return NULL;
>   }


  reply	other threads:[~2025-09-10  7:46 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-04  6:54 [PATCH v10 00/21] TDX KVM selftests Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 01/21] KVM: selftests: Allocate pgd in virt_map() as necessary Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 02/21] KVM: selftests: Expose functions to get default sregs values Sagi Shahar
2025-09-04  9:23   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 03/21] KVM: selftests: Expose function to allocate guest vCPU stack Sagi Shahar
2025-09-04  9:27   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 04/21] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Sagi Shahar
2025-09-05  5:19   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 05/21] KVM: selftests: Expose segment definitons to assembly files Sagi Shahar
2025-09-05  5:24   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 06/21] KVM: selftests: Add kbuild definitons Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 07/21] KVM: selftests: Define structs to pass parameters to TDX boot code Sagi Shahar
2025-09-08  7:19   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 08/21] KVM: selftests: Add " Sagi Shahar
2025-09-08  7:33   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 09/21] KVM: selftests: Set up TDX boot code region Sagi Shahar
2025-09-08  7:39   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 10/21] KVM: selftests: Set up TDX boot parameters region Sagi Shahar
2025-09-08  8:07   ` Binbin Wu
2025-09-25 17:13     ` Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 11/21] KVM: selftests: Add helper to initialize TDX VM Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 12/21] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Sagi Shahar
2025-09-08  9:22   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 13/21] KVM: selftests: Add helpers to init TDX memory and finalize VM Sagi Shahar
2025-09-10  6:49   ` Binbin Wu
2025-09-04  6:54 ` [PATCH v10 14/21] KVM: selftests: Call TDX init when creating a new TDX vm Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 15/21] KVM: selftests: Setup memory regions for TDX on vm creation Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 16/21] KVM: selftests: Call KVM_TDX_INIT_VCPU when creating a new TDX vcpu Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 17/21] KVM: selftests: Set entry point for TDX guest code Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 18/21] KVM: selftests: Add support for TDX TDCALL from guest Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 19/21] KVM: selftests: Add wrapper for TDX MMIO " Sagi Shahar
2025-09-04  6:54 ` [PATCH v10 20/21] KVM: selftests: Add ucall support for TDX Sagi Shahar
2025-09-10  7:46   ` Binbin Wu [this message]
2025-09-04  6:54 ` [PATCH v10 21/21] 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=46946d39-c980-42a5-9f67-1642fa7f0beb@linux.intel.com \
    --to=binbin.wu@linux.intel.com \
    --cc=ackerleytng@google.com \
    --cc=afranji@google.com \
    --cc=ajones@ventanamicro.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=seanjc@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