[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/EPT: IOMMU snoop capability should not affect memory type selection
commit 6afff051a28bb873f9ad4d8ca678b8f0d1b4f089 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Apr 10 16:06:09 2014 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Apr 10 16:06:09 2014 +0200 x86/EPT: IOMMU snoop capability should not affect memory type selection This capability solely makes a statement on cache coherency guarantees by the IOMMU. It does specifically not imply any further guarantees implied by certain memory types (cachability, ordering). Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 27 +++++++++++---------------- xen/arch/x86/hvm/mtrr.c | 8 +------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 46634cd..ae7a645 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1950,6 +1950,7 @@ static void hvm_update_cr(struct vcpu *v, unsigned int cr, unsigned long value) int hvm_set_cr0(unsigned long value) { struct vcpu *v = current; + struct domain *d = v->domain; unsigned long gfn, old_value = v->arch.hvm_vcpu.guest_cr[0]; struct page_info *page; @@ -1973,8 +1974,8 @@ int hvm_set_cr0(unsigned long value) goto gpf; /* A pvh is not expected to change to real mode. */ - if ( is_pvh_vcpu(v) - && (value & (X86_CR0_PE | X86_CR0_PG)) != (X86_CR0_PG | X86_CR0_PE) ) + if ( is_pvh_domain(d) && + (value & (X86_CR0_PE | X86_CR0_PG)) != (X86_CR0_PG | X86_CR0_PE) ) { printk(XENLOG_G_WARNING "PVH attempting to turn off PE/PG. CR0:%lx\n", value); @@ -1996,16 +1997,16 @@ int hvm_set_cr0(unsigned long value) hvm_update_guest_efer(v); } - if ( !paging_mode_hap(v->domain) ) + if ( !paging_mode_hap(d) ) { /* The guest CR3 must be pointing to the guest physical. */ gfn = v->arch.hvm_vcpu.guest_cr[3]>>PAGE_SHIFT; - page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC); + page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC); if ( !page ) { gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx\n", v->arch.hvm_vcpu.guest_cr[3]); - domain_crash(v->domain); + domain_crash(d); return X86EMUL_UNHANDLEABLE; } @@ -2032,24 +2033,18 @@ int hvm_set_cr0(unsigned long value) hvm_update_guest_efer(v); } - if ( !paging_mode_hap(v->domain) ) + if ( !paging_mode_hap(d) ) { put_page(pagetable_get_page(v->arch.guest_table)); v->arch.guest_table = pagetable_null(); } } - /* - * When cr0.cd setting - * 1. For guest w/o VT-d, and for guest with VT-d but snooped, Xen need not - * do anything, since hardware snoop mechanism has ensured cache coherency; - * 2. For guest with VT-d but non-snooped, cache coherency cannot be - * guaranteed by h/w so need emulate UC memory type to guest. - */ if ( ((value ^ old_value) & X86_CR0_CD) && - has_arch_pdevs(v->domain) && - iommu_enabled && !iommu_snoop && - hvm_funcs.handle_cd ) + iommu_enabled && hvm_funcs.handle_cd && + (!rangeset_is_empty(d->iomem_caps) || + !rangeset_is_empty(d->arch.ioport_caps) || + has_arch_pdevs(d)) ) hvm_funcs.handle_cd(v, value); hvm_update_cr(v, 0, value); diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c index dde70a6..9562726 100644 --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -713,7 +713,7 @@ HVM_REGISTER_SAVE_RESTORE(MTRR, hvm_save_mtrr_msr, hvm_load_mtrr_msr, void memory_type_changed(struct domain *d) { - if ( iommu_enabled && !iommu_snoop && d->vcpu && d->vcpu[0] ) + if ( iommu_enabled && d->vcpu && d->vcpu[0] ) p2m_memory_type_changed(d); } @@ -754,12 +754,6 @@ int epte_get_entry_emt(struct domain *d, unsigned long gfn, mfn_t mfn, return MTRR_TYPE_WRBACK; } - if ( iommu_snoop ) - { - *ipat = 1; - return MTRR_TYPE_WRBACK; - } - gmtrr_mtype = is_hvm_domain(d) && v ? get_mtrr_type(&v->arch.hvm_vcpu.mtrr, gfn << PAGE_SHIFT, order) : -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |