George Dunlap
2008-Oct-21 12:03 UTC
[Xen-devel] [PATCH] Fix guest_physmap_add_entry sanity checking logic
Fix the logic of the p->m and m->p mapping sanity checks and fixup in guest_physmap_add_entry(). Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com> diff -r 3b99705155c1 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Tue Oct 21 11:44:39 2008 +0100 +++ b/xen/arch/x86/mm/p2m.c Tue Oct 21 13:00:31 2008 +0100 @@ -956,18 +956,18 @@ guest_physmap_add_entry(struct domain *d /* First, remove m->p mappings for existing p->m mappings */ for ( i = 0; i < (1UL << page_order); i++ ) { - omfn = gfn_to_mfn(d, gfn, &ot); + omfn = gfn_to_mfn(d, gfn + i, &ot); if ( p2m_is_ram(ot) ) { ASSERT(mfn_valid(omfn)); - set_gpfn_from_mfn(mfn_x(omfn)+i, INVALID_M2P_ENTRY); + set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY); } } /* Then, look for m->p mappings for this range and deal with them */ for ( i = 0; i < (1UL << page_order); i++ ) { - ogfn = mfn_to_gfn(d, _mfn(mfn)); + ogfn = mfn_to_gfn(d, _mfn(mfn+i)); if ( #ifdef __x86_64__ (ogfn != 0x5555555555555555L) @@ -975,20 +975,20 @@ guest_physmap_add_entry(struct domain *d (ogfn != 0x55555555L) #endif && (ogfn != INVALID_M2P_ENTRY) - && (ogfn != gfn) ) + && (ogfn != gfn + i) ) { /* This machine frame is already mapped at another physical * address */ P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n", - mfn, ogfn, gfn); + mfn + i, ogfn, gfn + i); omfn = gfn_to_mfn(d, ogfn, &ot); if ( p2m_is_ram(ot) ) { ASSERT(mfn_valid(omfn)); P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n", ogfn , mfn_x(omfn)); - if ( mfn_x(omfn) == mfn ) - p2m_remove_page(d, ogfn, mfn, 0); + if ( mfn_x(omfn) == (mfn + i) ) + p2m_remove_page(d, ogfn, mfn + i, 0); } } } _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel