|
[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 |