public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
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 v10 20/21] KVM: selftests: Add ucall support for TDX
Date: Wed,  3 Sep 2025 23:54:50 -0700	[thread overview]
Message-ID: <20250904065453.639610-21-sagis@google.com> (raw)
In-Reply-To: <20250904065453.639610-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, &regs);
-		return (void *)regs.rdi;
+			vcpu_regs_get(vcpu, &regs);
+			return (void *)regs.rdi;
+		}
+		return NULL;
 	}
-	return NULL;
 }
-- 
2.51.0.338.gd7d06c2dae-goog


  parent reply	other threads:[~2025-09-04  6:55 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 ` Sagi Shahar [this message]
2025-09-10  7:46   ` [PATCH v10 20/21] KVM: selftests: Add ucall support for TDX Binbin Wu
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=20250904065453.639610-21-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