x86/CPUID: unconditionally set XEN_HVM_CPUID_IOMMU_MAPPINGS

This is a revert of f5cfa09856 plus a rework of the comment that
accompanies the setting of the flag so we don't forget why it needs to
be unconditionally set: it's indicating whether the version of Xen has
the original issue fixed and IOMMU entries are created for
grant/foreign maps.

If the flag is only exposed when the IOMMU is enabled the guest could
resort to use bounce buffers when running backends as it would assume
the underlying Xen version still has the bug present and thus
grant/foreign maps cannot be used with devices.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2021-01-19 16:04:06 +01:00
1 parent 0f4fd0de75
commit b7f462872a
1 file changed
+10 -4
+10 -4
View File
@@ -1049,11 +1049,17 @@ void cpuid_hypervisor_leaves(const struct vcpu *v, uint32_t leaf,
res->a |= XEN_HVM_CPUID_X2APIC_VIRT;
/*
* Indicate that memory mapped from other domains (either grants or
* foreign pages) has valid IOMMU entries.
* 1) Xen 4.10 and older was broken WRT grant maps requesting a DMA
* mapping, and forgot to honour the guest's request.
* 2) 4.11 (and presumably backports) fixed the bug, so the map
* hypercall actually did what the guest asked.
* 3) To work around the bug, guests must bounce buffer all DMA that
* would otherwise use a grant map, because it doesn't know whether the
* DMA is originating from an emulated or a real device.
* 4) This flag tells guests it is safe not to bounce-buffer all DMA to
* work around the bug.
*/
if ( is_iommu_enabled(d) )
res->a |= XEN_HVM_CPUID_IOMMU_MAPPINGS;
res->a |= XEN_HVM_CPUID_IOMMU_MAPPINGS;
/* Indicate presence of vcpu id and set it in ebx */
res->a |= XEN_HVM_CPUID_VCPU_ID_PRESENT;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.