[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 11/38] arm: implement p2m lookup
At 16:13 +0100 on 13 Jun (1339604016), Ian Campbell wrote: > Yes, that looks nice, although you still need a bit of a quirk for the > third level table bit. Patch below. Much nicer. One more round of nits below if you feel keen; in any case, Acked-by: Tim Deegan <tim@xxxxxxx> > +paddr_t p2m_lookup(struct domain *d, paddr_t paddr) > +{ > + struct p2m_domain *p2m = &d->arch.p2m; > + lpae_t pte, *first = NULL, *second = NULL, *third = NULL; > + paddr_t maddr = INVALID_PADDR; > + > + spin_lock(&p2m->lock); > + > + first = __map_domain_page(p2m->first_level); > + > + pte = first[first_table_offset(paddr)]; > + if ( !pte.p2m.valid || !pte.p2m.table ) > + goto done; > + > + second = map_domain_page(first[first_table_offset(paddr)].p2m.base); second = map_domain_page(pte.p2m.base); ? > + pte = second[second_table_offset(paddr)]; > + if ( !pte.p2m.valid || !pte.p2m.table ) > + goto done; > + > + third = map_domain_page(second[second_table_offset(paddr)].p2m.base); likewise, third = map_domain_page(pte.p2m.base); ? > + pte = third[third_table_offset(paddr)]; > + > + /* This bit must be one in the level 3 entry */ > + if ( !pte.p2m.table ) > + pte.bits = 0; > + > +done: > + if ( pte.p2m.valid ) > + maddr = (pte.bits & PADDR_MASK & PAGE_MASK) | (paddr & ~PAGE_MASK); > + > + if (third) unmap_domain_page(third); > + if (second) unmap_domain_page(second); > + if (first) unmap_domain_page(first); > + > + spin_unlock(&p2m->lock); > + > + return maddr; > +} > + > int guest_physmap_mark_populate_on_demand(struct domain *d, > unsigned long gfn, > unsigned int order) > diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h > index 349923a..1afd5cb 100644 > --- a/xen/include/asm-arm/p2m.h > +++ b/xen/include/asm-arm/p2m.h > @@ -32,6 +32,9 @@ int p2m_alloc_table(struct domain *d); > /* */ > void p2m_load_VTTBR(struct domain *d); > > +/* */ /* Look up the MFN corresponding to a domain's PFN. */ > +paddr_t p2m_lookup(struct domain *d, paddr_t gpfn); > + > /* Setup p2m RAM mapping for domain d from start-end. */ > int p2m_populate_ram(struct domain *d, paddr_t start, paddr_t end); > /* Map MMIO regions in the p2m: start_gaddr and end_gaddr is the range > -- > 1.7.9.1 > > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |