From: Ian Campbell Date: Wed, 9 Jul 2014 12:07:43 +0000 (+0100) Subject: xen: arm: handle superpage mappings in p2m_lookup X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4692 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7b814e01c6411973ed8394fb75d8b0706928e95c;p=xen.git xen: arm: handle superpage mappings in p2m_lookup Currently none are actually created, but they will be shortly. Signed-off-by: Ian Campbell Acked-by: Julien Grall --- diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index ea05b6d7ae..8a6d295ee8 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -123,6 +123,7 @@ paddr_t p2m_lookup(struct domain *d, paddr_t paddr, p2m_type_t *t) struct p2m_domain *p2m = &d->arch.p2m; lpae_t pte, *first = NULL, *second = NULL, *third = NULL; paddr_t maddr = INVALID_PADDR; + paddr_t mask; p2m_type_t _t; /* Allow t to be NULL */ @@ -136,15 +137,21 @@ paddr_t p2m_lookup(struct domain *d, paddr_t paddr, p2m_type_t *t) if ( !first ) goto err; + mask = FIRST_MASK; pte = first[first_table_offset(paddr)]; if ( !pte.p2m.valid || !pte.p2m.table ) goto done; + mask = SECOND_MASK; second = map_domain_page(pte.p2m.base); pte = second[second_table_offset(paddr)]; if ( !pte.p2m.valid || !pte.p2m.table ) goto done; + mask = THIRD_MASK; + + BUILD_BUG_ON(THIRD_MASK != PAGE_MASK); + third = map_domain_page(pte.p2m.base); pte = third[third_table_offset(paddr)]; @@ -156,7 +163,7 @@ done: if ( pte.p2m.valid ) { ASSERT(pte.p2m.type != p2m_invalid); - maddr = (pte.bits & PADDR_MASK & PAGE_MASK) | (paddr & ~PAGE_MASK); + maddr = (pte.bits & PADDR_MASK & mask) | (paddr & ~mask); *t = pte.p2m.type; }