[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] x86/mm: Use mfn_t for new_guest_cr3()
On Wed, Aug 30, 2017 at 1:19 PM, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote: > No functional change (as confirmed by diffing the assembly). > > Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx> > --- > CC: Jan Beulich <JBeulich@xxxxxxxx> > CC: Wei Liu <wei.liu2@xxxxxxxxxx> > > For some reason best known to GCC, there is one single change: > > @@ -145835,7 +145835,7 @@ > ffff82d0802864f8: 85 c0 test %eax,%eax > ffff82d0802864fa: 75 e0 jne ffff82d0802864dc > <new_guest_cr3+0x7c> > ffff82d0802864fc: 4c 8b ad 08 0b 00 00 mov 0xb08(%rbp),%r13 > -ffff82d080286503: 49 39 dd cmp %rbx,%r13 > +ffff82d080286503: 4c 39 eb cmp %r13,%rbx > ffff82d080286506: 0f 84 74 01 00 00 je ffff82d080286680 > <new_guest_cr3+0x220> > ffff82d08028650c: 41 f6 84 24 19 06 00 testb $0x8,0x619(%r12) > ffff82d080286513: 00 08 > > This is from the mfn_eq() alteration, and must be a side effect from using an > inline function. The net result is still correct, as only the zero flag is > checked. > --- > xen/arch/x86/mm.c | 35 ++++++++++++++++++----------------- > xen/arch/x86/pv/emul-priv-op.c | 2 +- > xen/include/asm-x86/mm.h | 2 +- > 3 files changed, 20 insertions(+), 19 deletions(-) > > diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c > index 1f23470..dc07b4f 100644 > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -2772,23 +2772,23 @@ int vcpu_destroy_pagetables(struct vcpu *v) > return rc != -EINTR ? rc : -ERESTART; > } > > -int new_guest_cr3(unsigned long mfn) > +int new_guest_cr3(mfn_t mfn) > { > struct vcpu *curr = current; > struct domain *d = curr->domain; > int rc; > - unsigned long old_base_mfn; > + mfn_t old_base_mfn; > > if ( is_pv_32bit_domain(d) ) > { > - unsigned long gt_mfn = pagetable_get_pfn(curr->arch.guest_table); > - l4_pgentry_t *pl4e = map_domain_page(_mfn(gt_mfn)); > + mfn_t mmfn = pagetable_get_mfn(curr->arch.guest_table); > + l4_pgentry_t *pl4e = map_domain_page(mmfn); > > rc = mod_l4_entry(pl4e, > - l4e_from_pfn(mfn, > + l4e_from_mfn(mfn, > (_PAGE_PRESENT | _PAGE_RW | > _PAGE_USER | _PAGE_ACCESSED)), > - gt_mfn, 0, curr); > + mfn_x(mmfn), 0, curr); > unmap_domain_page(pl4e); > switch ( rc ) > { > @@ -2800,7 +2800,7 @@ int new_guest_cr3(unsigned long mfn) > default: > gdprintk(XENLOG_WARNING, > "Error while installing new compat baseptr %" PRI_mfn > "\n", > - mfn); > + mfn_x(mfn)); > return rc; > } > > @@ -2814,20 +2814,20 @@ int new_guest_cr3(unsigned long mfn) > if ( unlikely(rc) ) > return rc; > > - old_base_mfn = pagetable_get_pfn(curr->arch.guest_table); > + old_base_mfn = pagetable_get_mfn(curr->arch.guest_table); > /* > * This is particularly important when getting restarted after the > * previous attempt got preempted in the put-old-MFN phase. > */ > - if ( old_base_mfn == mfn ) > + if ( mfn_eq(old_base_mfn, mfn) ) > { > write_ptbase(curr); > return 0; > } > > rc = paging_mode_refcounts(d) > - ? (get_page_from_mfn(_mfn(mfn), d) ? 0 : -EINVAL) > - : get_page_and_type_from_mfn(_mfn(mfn), PGT_root_page_table, d, 0, > 1); > + ? (get_page_from_mfn(mfn, d) ? 0 : -EINVAL) > + : get_page_and_type_from_mfn(mfn, PGT_root_page_table, d, 0, 1); > switch ( rc ) > { > case 0: > @@ -2837,22 +2837,23 @@ int new_guest_cr3(unsigned long mfn) > return -ERESTART; > default: > gdprintk(XENLOG_WARNING, > - "Error while installing new baseptr %" PRI_mfn "\n", mfn); > + "Error while installing new baseptr %" PRI_mfn "\n", > + mfn_x(mfn)); > return rc; > } > > invalidate_shadow_ldt(curr, 0); > > if ( !VM_ASSIST(d, m2p_strict) && !paging_mode_refcounts(d) ) > - fill_ro_mpt(_mfn(mfn)); > - curr->arch.guest_table = pagetable_from_pfn(mfn); > + fill_ro_mpt(mfn); > + curr->arch.guest_table = pagetable_from_mfn(mfn); > update_cr3(curr); > > write_ptbase(curr); > > - if ( likely(old_base_mfn != 0) ) > + if ( likely(mfn_x(old_base_mfn) != 0) ) > { > - struct page_info *page = mfn_to_page(_mfn(old_base_mfn)); > + struct page_info *page = mfn_to_page(old_base_mfn); > > if ( paging_mode_refcounts(d) ) > put_page(page); > @@ -3180,7 +3181,7 @@ long do_mmuext_op( > else if ( unlikely(paging_mode_translate(currd)) ) > rc = -EINVAL; > else > - rc = new_guest_cr3(op.arg1.mfn); > + rc = new_guest_cr3(_mfn(op.arg1.mfn)); > break; > > case MMUEXT_NEW_USER_BASEPTR: { > diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c > index af1624a..54a63c2 100644 > --- a/xen/arch/x86/pv/emul-priv-op.c > +++ b/xen/arch/x86/pv/emul-priv-op.c > @@ -774,7 +774,7 @@ static int priv_op_write_cr(unsigned int reg, unsigned > long val, > page = get_page_from_gfn(currd, gfn, NULL, P2M_ALLOC); > if ( !page ) > break; > - rc = new_guest_cr3(mfn_x(page_to_mfn(page))); > + rc = new_guest_cr3(page_to_mfn(page)); > put_page(page); > > switch ( rc ) > diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h > index ec7ce3c..4c03a33 100644 > --- a/xen/include/asm-x86/mm.h > +++ b/xen/include/asm-x86/mm.h > @@ -539,7 +539,7 @@ void audit_domains(void); > > #endif > > -int new_guest_cr3(unsigned long pfn); > +int new_guest_cr3(mfn_t mfn); > void make_cr3(struct vcpu *v, unsigned long mfn); > void update_cr3(struct vcpu *v); > int vcpu_destroy_pagetables(struct vcpu *); > -- > 2.1.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > https://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |