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.
[snip]
index 1265cecc7dd1..fae6f37b0bcd 100644 --- a/tools/testing/selftests/kvm/lib/x86/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86/ucall.c @@ -5,11 +5,35 @@
- Copyright (C) 2018, Red Hat, Inc.
*/ #include "kvm_util.h" +#include "tdx/tdx.h" +#include "tdx/tdx_util.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);
- if (is_tdx_vm(vm)) {
host_ucall_mmio_gpa = ucall_mmio_gpa = mmio_gpa;ucall_mmio_gpa |= vm->arch.s_bit;- }
- sync_global_to_guest(vm, ucall_mmio_gpa);
Is this needed for non-tdx VMs?
Ira
[snip]