[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.