@@ -134,6 +134,9 @@ static struct kvm_msr_list *kvm_feature_msrs;
static int vm_type;
+void kvm_encrypted_guest_set_memory_region_debug_ops(void *handle,
+ MemoryRegion *mr);
+
int kvm_set_vm_type(MachineState *ms, int kvm_type)
{
if (kvm_type == KVM_X86_LEGACY_VM ||
@@ -2228,6 +2231,10 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
return ret;
}
+ if (kvm_tdx_enabled())
+ kvm_setup_memory_region_debug_ops(s,
+ kvm_encrypted_guest_set_memory_region_debug_ops);
+
if (!kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
error_report("kvm: KVM_CAP_IRQ_ROUTING not supported by KVM");
return -ENOTSUP;
@@ -4917,3 +4924,62 @@ bool kvm_arch_cpu_check_are_resettable(void)
{
return !sev_es_enabled();
}
+
+static int kvm_encrypted_guest_read_memory(uint8_t *dest,
+ const uint8_t *hva_src, hwaddr gpa_src,
+ uint32_t len, MemTxAttrs attrs)
+{
+ struct kvm_rw_memory rw;
+
+ /*
+ TODO:
+ Can we check SEV/TDX state to decide use
+ gpa_dest or hva_dest here ?
+
+ Also how shall we handle the kvm_vm_ioctl failure case ?
+ Some user like cpu_physical_memory_{read,write}() doesn't handle such
+ failure, because for non-encrypted guest these functions may do memory
+ reading/wrting with memcpy() dirctly before.
+ May memset() the buffer to a bad pattern (all 0x0 or 0xff)
+ for indicating this ?
+ */
+ rw.addr = gpa_src;
+ rw.buf = dest;
+ rw.len = len;
+
+ return kvm_vm_ioctl(kvm_state, KVM_MEMORY_ENCRYPT_READ_MEMORY, &rw);
+}
+
+static int kvm_encrypted_guest_write_memory(uint8_t *hva_dest, hwaddr gpa_dest,
+ const uint8_t *src,
+ uint32_t len, MemTxAttrs attrs)
+{
+ struct kvm_rw_memory rw;
+
+ /*
+ TODO:
+ Can we check SEV/TDX state to decide use
+ gpa_dest or hva_dest here ?
+
+ Also how shall we handle the kvm_vm_ioctl failure case ?
+ Some user like cpu_physical_memory_{read,write}() doesn't handle such
+ failure, because for non-encrypted guest these functions may do memory
+ reading/wrting with memcpy() dirctly before.
+ */
+ rw.addr = gpa_dest;
+ rw.buf = (void*)src;
+ rw.len = len;
+
+ return kvm_vm_ioctl(kvm_state, KVM_MEMORY_ENCRYPT_WRITE_MEMORY, &rw);
+}
+
+static MemoryRegionRAMReadWriteOps kvm_encrypted_guest_mr_debug_ops = {
+ .read = kvm_encrypted_guest_read_memory,
+ .write = kvm_encrypted_guest_write_memory,
+};
+
+void kvm_encrypted_guest_set_memory_region_debug_ops(void *handle,
+ MemoryRegion *mr)
+{
+ memory_region_set_ram_debug_ops(mr, &kvm_encrypted_guest_mr_debug_ops);
+}