2014-03-14 00:46:35 +01:00
|
|
|
# Commit 3089a6d82bdf3112ccb1dd074ce34a8cbdc4ccd8
|
|
|
|
# Date 2014-03-10 11:04:36 +0100
|
|
|
|
# Author Jan Beulich <jbeulich@suse.com>
|
|
|
|
# Committer Jan Beulich <jbeulich@suse.com>
|
|
|
|
x86/HVM: consolidate passthrough handling in epte_get_entry_emt()
|
|
|
|
|
|
|
|
It is inconsistent to depend on iommu_enabled alone: For a guest
|
|
|
|
without devices passed through to it, it is of no concern whether the
|
|
|
|
IOMMU is enabled.
|
|
|
|
|
|
|
|
There's one rather special case to take care of: VMX code marks the
|
|
|
|
LAPIC access page as MMIO. The added assertion needs to take this into
|
|
|
|
consideration, and the subsequent handling of the direct MMIO case was
|
|
|
|
inconsistent too: That page would have been WB in the absence of an
|
|
|
|
IOMMU, but UC in the presence of it, while in fact the cachabilty of
|
|
|
|
this page is entirely unrelated to an IOMMU being in use.
|
|
|
|
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
|
|
|
Reviewed-by: "Xu, Dongxiao" <dongxiao.xu@intel.com>
|
|
|
|
Acked-by: Keir Fraser <keir@xen.org>
|
|
|
|
|
2014-04-10 08:04:31 +02:00
|
|
|
# Commit 1f8b57779785bf9f55c16312bb1ec679929c314b
|
|
|
|
# Date 2014-03-28 13:43:25 +0100
|
|
|
|
# Author Jan Beulich <jbeulich@suse.com>
|
|
|
|
# Committer Jan Beulich <jbeulich@suse.com>
|
|
|
|
x86/EPT: relax treatment of APIC MFN
|
|
|
|
|
|
|
|
There's no point in this being mapped UC by the guest due to using a
|
|
|
|
respective PAT index - set the ignore-PAT flag to true.
|
|
|
|
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
|
|
|
Reviewed-by: Tim Deegan <tim@xen.org>
|
|
|
|
|
2014-03-14 00:46:35 +01:00
|
|
|
--- a/xen/arch/x86/hvm/mtrr.c
|
|
|
|
+++ b/xen/arch/x86/hvm/mtrr.c
|
2014-04-10 08:04:31 +02:00
|
|
|
@@ -698,14 +698,24 @@ uint8_t epte_get_entry_emt(struct domain
|
2014-03-14 00:46:35 +01:00
|
|
|
if ( hvm_get_mem_pinned_cacheattr(d, gfn, &type) )
|
|
|
|
return type;
|
|
|
|
|
|
|
|
- if ( !iommu_enabled )
|
|
|
|
+ if ( !iommu_enabled ||
|
|
|
|
+ (rangeset_is_empty(d->iomem_caps) &&
|
|
|
|
+ rangeset_is_empty(d->arch.ioport_caps) &&
|
|
|
|
+ !has_arch_pdevs(d)) )
|
|
|
|
{
|
|
|
|
+ ASSERT(!direct_mmio ||
|
|
|
|
+ mfn_x(mfn) == d->arch.hvm_domain.vmx.apic_access_mfn);
|
|
|
|
*ipat = 1;
|
|
|
|
return MTRR_TYPE_WRBACK;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( direct_mmio )
|
|
|
|
- return MTRR_TYPE_UNCACHABLE;
|
2014-04-10 08:04:31 +02:00
|
|
|
+ {
|
|
|
|
+ if ( mfn_x(mfn) != d->arch.hvm_domain.vmx.apic_access_mfn )
|
|
|
|
+ return MTRR_TYPE_UNCACHABLE;
|
|
|
|
+ *ipat = 1;
|
|
|
|
+ return MTRR_TYPE_WRBACK;
|
|
|
|
+ }
|
2014-03-14 00:46:35 +01:00
|
|
|
|
|
|
|
if ( iommu_snoop )
|
|
|
|
{
|
|
|
|
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
|
|
|
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
|
|
|
@@ -2038,9 +2038,9 @@ static int vmx_alloc_vlapic_mapping(stru
|
|
|
|
if ( apic_va == NULL )
|
|
|
|
return -ENOMEM;
|
|
|
|
share_xen_page_with_guest(virt_to_page(apic_va), d, XENSHARE_writable);
|
|
|
|
+ d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va);
|
|
|
|
set_mmio_p2m_entry(d, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE),
|
|
|
|
_mfn(virt_to_mfn(apic_va)));
|
|
|
|
- d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|