All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@linaro.org>
To: Ian Campbell <ian.campbell@citrix.com>, xen-devel@lists.xen.org
Cc: tim@xen.org, vijay.kilari@gmail.com, stefano.stabellini@eu.citrix.com
Subject: Re: [PATCH RFC 3/9] xen: arm: handle concatenated root tables in dump_pt_walk
Date: Wed, 30 Jul 2014 17:58:11 +0100	[thread overview]
Message-ID: <53D92423.3000509@linaro.org> (raw)
In-Reply-To: <c9754e1a775ab757183662ad4cbf8c6ccf8f0ad5.1406728037.git.ian.campbell@citrix.com>

Hi Ian,

On 07/30/2014 02:47 PM, Ian Campbell wrote:
> ARM allows for the concatenation of pages at the root of a p2m (but not a
> regular page table) in order to support a larger IPA space than the number of
> levels in the P2M would normally support. We use this to support 40-bit guest
> addresses.
> 
> Previously we were unable to dump IPAs which were outside the first page of the
> root. To fix this we adjust dump_pt_walk to take the machine address of the
> page table root instead of expecting the caller to have mapper it. This allows
> the walker code to select the correct page to map.
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> ---
>  xen/arch/arm/mm.c          |   45 +++++++++++++++++++++++++++++++-------------
>  xen/arch/arm/p2m.c         |   13 +++----------
>  xen/include/asm-arm/page.h |   15 +++++++++++++--
>  3 files changed, 48 insertions(+), 25 deletions(-)
> 
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index fa6a729..4ff783a 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -167,50 +167,69 @@ static inline void check_memory_layout_alignment_constraints(void) {
>  #endif
>  }
>  
> -void dump_pt_walk(lpae_t *root, paddr_t addr, int root_level)
> +void dump_pt_walk(paddr_t ttbr, paddr_t addr, int root_level, int nr_root_tables)

I should have said that yon the previous patch...

Both root_level and nr_root_tables can't be negative. I would use
unsigned int here.

>  {
>      static const char *level_strs[4] = { "0TH", "1ST", "2ND", "3RD" };
> +    const unsigned long root_pfn = paddr_to_pfn(ttbr);
>      const unsigned int offsets[4] = {
>          zeroeth_table_offset(addr),
>          first_table_offset(addr),
>          second_table_offset(addr),
>          third_table_offset(addr)
>      };
> -    lpae_t pte, *mappings[4] = { 0, };
> -    int level;
> +    lpae_t pte, *mapping;
> +    int level, root_table;

unsigned int here too.

>  #ifdef CONFIG_ARM_32
>      BUG_ON(root_level < 1);
>  #endif
>  
> -    mappings[root_level] = root;
> +    if ( nr_root_tables > 1 )
> +    {
> +        /*
> +         * Concatenated root-level tables. The table number will be
> +         * the offset at the previous level. It is not possible to
> +         * concetenate a level-0 root.

concatenate

> +         */
> +        BUG_ON(root_level == 0);
> +        root_table = offsets[root_level - 1];
> +        printk("Using concatenated root table %d\n", root_table);
> +        if ( root_table >= nr_root_tables )
> +        {
> +            printk("Invalid root table offset\n");
> +            return;
> +        }
> +    }
> +    else
> +        root_table = 0;
> +
> +    mapping = map_domain_page(root_pfn + root_table);
>  
>      for ( level = root_level; level < 4; level++ )
>      {
>          if ( offsets[level] > LPAE_ENTRIES )
>              break;
>  
> -        if ( !mappings[level] )
> +        if ( !mapping )
>          {
>              printk("%s: Failed to map PT page\n", level_strs[level]);
>              break;
>          }
>  
> -        pte = mappings[level][offsets[level]];
> +        pte = mapping[offsets[level]];
>  
>          printk("%s[0x%x] = 0x%"PRIpaddr"\n",
>                 level_strs[level], offsets[level], pte.bits);
> +

Spurious change, maybe it belong to the previous patch?

[..]


>  /* Map a 4k page in a fixmap entry */
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index 64efdce..6839acf 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -16,6 +16,7 @@
>  /* 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)
>  {
> @@ -52,22 +53,14 @@ void p2m_dump_info(struct domain *d)
>  void dump_p2m_lookup(struct domain *d, paddr_t addr)
>  {
>      struct p2m_domain *p2m = &d->arch.p2m;
> -    lpae_t *first;
>  
>      printk("dom%d IPA 0x%"PRIpaddr"\n", d->domain_id, addr);
>  
> -    if ( first_linear_offset(addr) > LPAE_ENTRIES )
> -    {
> -        printk("Cannot dump addresses in second of first level pages...\n");
> -        return;
> -    }
> -
>      printk("P2M @ %p mfn:0x%lx\n",
>             p2m->root, page_to_mfn(p2m->root));
>  
> -    first = __map_domain_page(p2m->root);
> -    dump_pt_walk(first, addr, P2M_ROOT_LEVEL);
> -    unmap_domain_page(first);
> +    dump_pt_walk(page_to_maddr(p2m->root), addr,

You can directly use p2m->vttbr and avoid to call page_to_maddr.

Regards,

-- 
Julien Grall

  reply	other threads:[~2014-07-30 16:58 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-30 13:44 [PATCH RFC 0/9] xen: arm: support for > 40-bit physical addressing Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 1/9] xen: arm: rename p2m->first_level to p2m->root Ian Campbell
2014-07-30 13:47   ` [PATCH RFC 2/9] xen: arm: Implement variable levels in dump_pt_walk Ian Campbell
2014-07-30 16:40     ` Julien Grall
2014-07-30 13:47   ` [PATCH RFC 3/9] xen: arm: handle concatenated root tables " Ian Campbell
2014-07-30 16:58     ` Julien Grall [this message]
2014-09-04 14:40       ` Ian Campbell
2014-09-08 20:54         ` Julien Grall
2014-07-30 13:47   ` [PATCH RFC 4/9] xen: arm: move setup_virt_paging to p2m.c Ian Campbell
2014-07-30 17:00     ` Julien Grall
2014-07-30 13:47   ` [PATCH RFC 5/9] xen: arm: Defer setting of VTCR_EL2 until after CPUs are up Ian Campbell
2014-07-30 17:11     ` Julien Grall
2014-09-04 14:50       ` Ian Campbell
2014-07-30 13:47   ` [PATCH RFC 6/9] xen: arm: handle variable p2m levels in p2m_lookup Ian Campbell
2014-07-31 11:14     ` Julien Grall
2014-09-04 14:54       ` Ian Campbell
2014-07-30 13:47   ` [PATCH RFC 7/9] xen: arm: handle variable p2m levels in apply_p2m_changes Ian Campbell
2014-07-31 15:38     ` Julien Grall
2014-08-11  7:00     ` Vijay Kilari
2014-08-26  9:11       ` Vijay Kilari
2014-09-04 14:01         ` Ian Campbell
2014-07-30 13:47   ` [PATCH RFC 8/9] xen: arm: support for up to 48-bit physical addressing on arm64 Ian Campbell
2014-08-07 15:33     ` Julien Grall
2014-07-30 13:47   ` [PATCH RFC 9/9] xen: arm: support for up to 48-bit IPA " Ian Campbell
2014-08-07 15:49     ` Julien Grall
2014-07-30 16:06   ` [PATCH RFC 1/9] xen: arm: rename p2m->first_level to p2m->root Julien Grall
2014-07-30 16:19     ` Ian Campbell
2014-07-30 16:23       ` Julien Grall
2014-07-31  8:22 ` [PATCH RFC 0/9] xen: arm: support for > 40-bit physical addressing Vijay Kilari
2014-07-31  8:54   ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53D92423.3000509@linaro.org \
    --to=julien.grall@linaro.org \
    --cc=ian.campbell@citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=tim@xen.org \
    --cc=vijay.kilari@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.