[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 7/9] xen: arm: handle variable p2m levels in apply_p2m_changes
On Wed, Jul 30, 2014 at 7:17 PM, Ian Campbell <ian.campbell@xxxxxxxxxx> wrote: > As with prervious changes this involves conversion from a linear series of > lookups into a loop over the levels. > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > --- > xen/arch/arm/p2m.c | 178 > +++++++++++++++++++++++++--------------------------- > 1 file changed, 84 insertions(+), 94 deletions(-) > > diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c > index 557663f..e9938ae 100644 > --- a/xen/arch/arm/p2m.c > +++ b/xen/arch/arm/p2m.c > @@ -15,7 +15,6 @@ > > /* First level P2M is 2 consecutive pages */ > #define P2M_ROOT_ORDER 1 > -#define P2M_ROOT_ENTRIES (LPAE_ENTRIES<<P2M_ROOT_ORDER) > #define P2M_ROOT_PAGES (1<<P2M_ROOT_ORDER) > > static bool_t p2m_valid(lpae_t pte) > @@ -115,31 +114,6 @@ void flush_tlb_domain(struct domain *d) > p2m_load_VTTBR(current->domain); > } > > -static int p2m_first_level_index(paddr_t addr) > -{ > - /* > - * 1st pages are concatenated so zeroeth offset gives us the > - * index of the 1st page > - */ > - return zeroeth_table_offset(addr); > -} > - > -/* > - * Map whichever of the first pages contain addr. The caller should > - * then use first_table_offset as an index. > - */ > -static lpae_t *p2m_map_first(struct p2m_domain *p2m, paddr_t addr) > -{ > - struct page_info *page; > - > - if ( first_linear_offset(addr) >= P2M_ROOT_ENTRIES ) > - return NULL; > - > - page = p2m->root + p2m_first_level_index(addr); > - > - return __map_domain_page(page); > -} > - > /* > * Lookup the MFN corresponding to a domain's PFN. > * > @@ -707,14 +681,13 @@ static int apply_p2m_changes(struct domain *d, > int mattr, > p2m_type_t t) > { > - int rc, ret; > + int level, rc, ret; > struct p2m_domain *p2m = &d->arch.p2m; > - lpae_t *first = NULL, *second = NULL, *third = NULL; > + lpae_t *mappings[4] = { NULL, }; > paddr_t addr; > - unsigned long cur_first_page = ~0, > - cur_first_offset = ~0, > - cur_second_offset = ~0; > - unsigned long count = 0; > + unsigned int cur_root_table = ~0; > + unsigned int cur_offset[4] = { ~0, }; > + unsigned int count = 0; > bool_t flush = false; > bool_t flush_pt; > > @@ -726,9 +699,27 @@ static int apply_p2m_changes(struct domain *d, > > spin_lock(&p2m->lock); > > + if ( P2M_ROOT_PAGES == 1 ) > + { > + /* Static mapping. P2M_ROOT_PAGES > 1 are handled below */ > + mappings[P2M_ROOT_LEVEL] = __map_domain_page(p2m->root); > + { > + rc = -EINVAL; In case of 48-bit platform in pa_range_info[] structure in setup_virt_paging() function, the root-order is set to 0. So for 48-bit platform P2M_ROOT_PAGES = 1 and hence Dom0 mapping always fails with below log (XEN) P2M: 48-bit IPA with 48-bit PA (XEN) P2M: 4 levels with order-0 root, VTCR 0x80053590 (XEN) *** LOADING DOMAIN 0 *** (XEN) Loading kernel from boot module @ 0000000080080000 (XEN) Allocating 1:1 mappings totalling 128MB for dom0: (XEN) Allocated 0x000000f0000000-0x000000f8000000 (128MB/128MB, order 15) (XEN) (XEN) **************************************** (XEN) Panic on CPU 0: (XEN) Failed map pages to DOM0: -22 (XEN) **************************************** (XEN) (XEN) Reboot in five seconds... Regards Vijay _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |