From: Binbin Wu <binbin.wu@linux.intel.com>
To: Sagi Shahar <sagis@google.com>, Sean Christopherson <seanjc@google.com>
Cc: 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>,
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 v9 18/19] KVM: selftests: Add ucall support for TDX
Date: Wed, 27 Aug 2025 15:18:58 +0800 [thread overview]
Message-ID: <18bf858c-e135-4a9b-bda8-a70be3b3720e@linux.intel.com> (raw)
In-Reply-To: <20250821042915.3712925-19-sagis@google.com>
On 8/21/2025 12:29 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);
>
> #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)
> + 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;
My first thought was how did SEV_ES or SNP work for this since they are not
able to get RDI neither.
Then I had a check in sev_smoke_test.c, both guest_sev_es_code() and
guest_snp_code() call GUEST_ASSERT(), which finally calls ucall_assert(), but
in test_sev(), the code doesn't handle ucall for SEV_ES or SNP.
Does it mean GUEST_ASSERT() is currently not working and ignored for SEV_ES
and SNP? Or did I miss anything?
> + default:
> + if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) {
> + struct kvm_regs regs;
>
> - vcpu_regs_get(vcpu, ®s);
> - return (void *)regs.rdi;
> + vcpu_regs_get(vcpu, ®s);
> + return (void *)regs.rdi;
> + }
> + return NULL;
> }
> - return NULL;
> }
next prev parent reply other threads:[~2025-08-27 7:19 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-21 4:28 [PATCH v9 00/19] TDX KVM selftests Sagi Shahar
2025-08-21 4:28 ` [PATCH v9 01/19] KVM: selftests: Include overflow.h instead of redefining is_signed_type() Sagi Shahar
2025-08-21 14:16 ` Sean Christopherson
2025-08-21 14:37 ` Ira Weiny
2025-08-21 14:42 ` Sean Christopherson
2025-08-21 4:28 ` [PATCH v9 02/19] KVM: selftests: Allocate pgd in virt_map() as necessary Sagi Shahar
2025-08-21 14:45 ` Ira Weiny
2025-08-26 2:36 ` Binbin Wu
2025-08-21 4:28 ` [PATCH v9 03/19] KVM: selftests: Expose functions to get default sregs values Sagi Shahar
2025-08-26 2:36 ` Binbin Wu
2025-08-26 14:05 ` Sean Christopherson
2025-08-21 4:28 ` [PATCH v9 04/19] KVM: selftests: Expose function to allocate guest vCPU stack Sagi Shahar
2025-08-21 22:00 ` Ira Weiny
2025-08-21 22:24 ` Sagi Shahar
2025-08-26 5:39 ` Binbin Wu
2025-08-26 16:00 ` Sagi Shahar
2025-08-26 17:16 ` Sean Christopherson
2025-08-21 4:28 ` [PATCH v9 05/19] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Sagi Shahar
2025-08-21 22:05 ` Ira Weiny
2025-08-21 22:30 ` Sagi Shahar
2025-08-26 5:51 ` Binbin Wu
2025-08-26 16:04 ` Sagi Shahar
2025-08-21 4:28 ` [PATCH v9 06/19] KVM: selftests: Expose segment definitons to assembly files Sagi Shahar
2025-08-21 20:04 ` Ira Weiny
2025-08-21 4:29 ` [PATCH v9 07/19] KVM: selftests: Add kbuild definitons Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 08/19] KVM: selftests: Define structs to pass parameters to TDX boot code Sagi Shahar
2025-08-26 6:52 ` Binbin Wu
2025-08-26 16:10 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 09/19] KVM: selftests: Add " Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 10/19] KVM: selftests: Set up TDX boot code region Sagi Shahar
2025-08-25 5:32 ` Yan Zhao
2025-08-26 16:38 ` Sean Christopherson
2025-08-27 1:36 ` Yan Zhao
2025-08-21 4:29 ` [PATCH v9 11/19] KVM: selftests: Set up TDX boot parameters region Sagi Shahar
2025-08-26 8:36 ` Binbin Wu
2025-08-26 16:17 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 12/19] KVM: selftests: Add helper to initialize TDX VM Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 13/19] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Sagi Shahar
2025-08-26 9:22 ` Binbin Wu
2025-09-04 3:57 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 14/19] KVM: selftests: Add helpers to init TDX memory and finalize VM Sagi Shahar
2025-08-25 8:40 ` Yan Zhao
2025-08-25 19:02 ` Sagi Shahar
2025-08-26 1:07 ` Yan Zhao
2025-08-27 2:24 ` Binbin Wu
2025-08-27 2:44 ` Yan Zhao
2025-08-27 3:52 ` Yan Zhao
2025-08-21 4:29 ` [PATCH v9 15/19] KVM: selftests: Hook TDX support to vm and vcpu creation Sagi Shahar
2025-08-26 8:28 ` Chenyi Qiang
2025-08-26 16:12 ` Sagi Shahar
2025-08-26 17:31 ` Sean Christopherson
2025-08-26 20:16 ` Ira Weiny
2025-08-26 20:29 ` Sagi Shahar
2025-08-26 20:30 ` Sagi Shahar
2025-08-26 21:31 ` Sean Christopherson
2025-08-26 21:38 ` Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 16/19] KVM: selftests: Add support for TDX TDCALL from guest Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 17/19] KVM: selftests: Add wrapper for TDX MMIO " Sagi Shahar
2025-08-21 4:29 ` [PATCH v9 18/19] KVM: selftests: Add ucall support for TDX Sagi Shahar
2025-08-27 7:18 ` Binbin Wu [this message]
2025-09-02 15:45 ` Sean Christopherson
2025-09-03 1:07 ` Binbin Wu
2025-08-21 4:29 ` [PATCH v9 19/19] 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=18bf858c-e135-4a9b-bda8-a70be3b3720e@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;
as well as URLs for NNTP newsgroup(s).