From: Sagi Shahar <sagis@google.com>
To: 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>,
Sagi Shahar <sagis@google.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>,
Ira Weiny <ira.weiny@intel.com>, Chao Gao <chao.gao@intel.com>,
Chenyi Qiang <chenyi.qiang@intel.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH v9 18/19] KVM: selftests: Add ucall support for TDX
Date: Wed, 20 Aug 2025 21:29:11 -0700 [thread overview]
Message-ID: <20250821042915.3712925-19-sagis@google.com> (raw)
In-Reply-To: <20250821042915.3712925-1-sagis@google.com>
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;
+ 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;
}
--
2.51.0.rc1.193.gad69d77794-goog
next prev parent reply other threads:[~2025-08-21 4:29 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 ` Sagi Shahar [this message]
2025-08-27 7:18 ` [PATCH v9 18/19] KVM: selftests: Add ucall support for TDX Binbin Wu
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=20250821042915.3712925-19-sagis@google.com \
--to=sagis@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=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).