63 lines
2.5 KiB
Diff
63 lines
2.5 KiB
Diff
From 2b2dfff3e383c99d0f759a8c12659d1a0ce50e8e Mon Sep 17 00:00:00 2001
|
|
From: Isaku Yamahata <isaku.yamahata@intel.com>
|
|
Date: Thu, 29 Feb 2024 01:36:55 -0500
|
|
Subject: [PATCH 036/100] kvm/tdx: Ignore memory conversion to shared of
|
|
unassigned region
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 245: SEV-SNP support
|
|
RH-Jira: RHEL-39544
|
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
RH-Acked-by: Bandan Das <bdas@redhat.com>
|
|
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
|
RH-Commit: [36/91] 84515b9dcfc2e07b272bb2477acf6430e9d33f28 (bonzini/rhel-qemu-kvm)
|
|
|
|
TDX requires vMMIO region to be shared. For KVM, MMIO region is the region
|
|
which kvm memslot isn't assigned to (except in-kernel emulation).
|
|
qemu has the memory region for vMMIO at each device level.
|
|
|
|
While OVMF issues MapGPA(to-shared) conservatively on 32bit PCI MMIO
|
|
region, qemu doesn't find corresponding vMMIO region because it's before
|
|
PCI device allocation and memory_region_find() finds the device region, not
|
|
PCI bus region. It's safe to ignore MapGPA(to-shared) because when guest
|
|
accesses those region they use GPA with shared bit set for vMMIO. Ignore
|
|
memory conversion request of non-assigned region to shared and return
|
|
success. Otherwise OVMF is confused and panics there.
|
|
|
|
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
|
|
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
|
Message-ID: <20240229063726.610065-35-xiaoyao.li@intel.com>
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit 565f4768bb9cf840b2f8cca41483bb91aa3196a3)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
accel/kvm/kvm-all.c | 12 ++++++++++++
|
|
1 file changed, 12 insertions(+)
|
|
|
|
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
|
index 6efaff90a7..f6268855b4 100644
|
|
--- a/accel/kvm/kvm-all.c
|
|
+++ b/accel/kvm/kvm-all.c
|
|
@@ -2923,6 +2923,18 @@ int kvm_convert_memory(hwaddr start, hwaddr size, bool to_private)
|
|
section = memory_region_find(get_system_memory(), start, size);
|
|
mr = section.mr;
|
|
if (!mr) {
|
|
+ /*
|
|
+ * Ignore converting non-assigned region to shared.
|
|
+ *
|
|
+ * TDX requires vMMIO region to be shared to inject #VE to guest.
|
|
+ * OVMF issues conservatively MapGPA(shared) on 32bit PCI MMIO region,
|
|
+ * and vIO-APIC 0xFEC00000 4K page.
|
|
+ * OVMF assigns 32bit PCI MMIO region to
|
|
+ * [top of low memory: typically 2GB=0xC000000, 0xFC00000)
|
|
+ */
|
|
+ if (!to_private) {
|
|
+ return 0;
|
|
+ }
|
|
return -1;
|
|
}
|
|
|
|
--
|
|
2.39.3
|
|
|