diff -r 229d00b41a49 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Wed May 13 15:40:37 2009 +0100 +++ b/xen/arch/x86/mm.c Wed May 13 15:54:34 2009 +0100 @@ -644,8 +644,8 @@ int -get_page_from_l1e( - l1_pgentry_t l1e, struct domain *d) +get_page_from_l1e_for( + l1_pgentry_t l1e, struct domain *d, struct domain *target) { unsigned long mfn = l1e_get_pfn(l1e); struct page_info *page = mfn_to_page(mfn); @@ -696,7 +696,7 @@ * qemu-dm helper process in dom0 to map the domain's memory without * messing up the count of "real" writable mappings.) */ okay = (((l1f & _PAGE_RW) && - !(unlikely(paging_mode_external(d) && (d != curr->domain)))) + !(unlikely((d != target) && paging_mode_external(d)))) ? get_page_and_type(page, d, PGT_writable_page) : get_page(page, d)); if ( !okay ) @@ -716,7 +716,7 @@ { if ( (l1f & _PAGE_RW) && !(unlikely(paging_mode_external(d) && - (d != curr->domain))) ) + (d != target))) ) put_page_type(page); put_page(page); MEM_LOG("Attempt to change cache attributes of Xen heap page"); @@ -1493,7 +1493,7 @@ return rc; } - if ( unlikely(!get_page_from_l1e(nl1e, FOREIGNDOM)) ) + if ( unlikely(!get_page_from_l1e_for(nl1e, FOREIGNDOM, d)) ) return page_unlock(l1pg), 0; adjust_guest_l1e(nl1e, d); diff -r 229d00b41a49 xen/arch/x86/mm/shadow/multi.c --- a/xen/arch/x86/mm/shadow/multi.c Wed May 13 15:40:37 2009 +0100 +++ b/xen/arch/x86/mm/shadow/multi.c Wed May 13 15:54:34 2009 +0100 @@ -811,7 +811,7 @@ (d != owner) && IS_PRIV_FOR(d, owner)) { - res = get_page_from_l1e(sl1e, owner); + res = get_page_from_l1e_for(sl1e, owner, d); SHADOW_PRINTK("privileged domain %d installs map of mfn %05lx " "which is owned by domain %d: %s\n", d->domain_id, mfn_x(mfn), owner->domain_id, diff -r 229d00b41a49 xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Wed May 13 15:40:37 2009 +0100 +++ b/xen/include/asm-x86/mm.h Wed May 13 15:54:34 2009 +0100 @@ -165,8 +165,16 @@ int get_page(struct page_info *page, struct domain *domain); void put_page_type(struct page_info *page); int get_page_type(struct page_info *page, unsigned long type); -int get_page_from_l1e(l1_pgentry_t l1e, struct domain *d); +int get_page_from_l1e_for(l1_pgentry_t l1e, struct domain *d, + struct domain *target); void put_page_from_l1e(l1_pgentry_t l1e, struct domain *d); + + +static inline int get_page_from_l1e(l1_pgentry_t l1e, struct domain *d) +{ + return get_page_from_l1e_for(l1e, d, d); +} + static inline void put_page_and_type(struct page_info *page) {