[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 06/15] xen/arm: Rework lpae_mapping



On Mon, 16 Jul 2018, Julien Grall wrote:
> Currently, lpae_mapping can only work on entry from any level other than
> 3. Make it work with any level by extending the prototype to pass the
> level.
> 
> At the same time, rename the function to lpae_is_mapping so naming stay
> consistent accross lpae_* helpers.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>

> ---
>  xen/arch/arm/p2m.c         | 12 +++++++-----
>  xen/include/asm-arm/lpae.h | 13 +++++++++----
>  2 files changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index ebf74760fa..72a84a33fd 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -241,7 +241,8 @@ static int p2m_create_table(struct p2m_domain *p2m, 
> lpae_t *entry);
>   *  GUEST_TABLE_SUPER_PAGE: The next entry points to a superpage.
>   */
>  static int p2m_next_level(struct p2m_domain *p2m, bool read_only,
> -                          lpae_t **table, unsigned int offset)
> +                          unsigned int level, lpae_t **table,
> +                          unsigned int offset)
>  {
>      lpae_t *entry;
>      int ret;
> @@ -260,7 +261,8 @@ static int p2m_next_level(struct p2m_domain *p2m, bool 
> read_only,
>      }
>  
>      /* The function p2m_next_level is never called at the 3rd level */
> -    if ( lpae_mapping(*entry) )
> +    ASSERT(level < 3);
> +    if ( lpae_is_mapping(*entry, level) )
>          return GUEST_TABLE_SUPER_PAGE;
>  
>      mfn = _mfn(entry->p2m.base);
> @@ -331,7 +333,7 @@ mfn_t p2m_get_entry(struct p2m_domain *p2m, gfn_t gfn,
>  
>      for ( level = P2M_ROOT_LEVEL; level < 3; level++ )
>      {
> -        rc = p2m_next_level(p2m, true, &table, offsets[level]);
> +        rc = p2m_next_level(p2m, true, level, &table, offsets[level]);
>          if ( rc == GUEST_TABLE_MAP_FAILED )
>              goto out_unmap;
>          else if ( rc != GUEST_TABLE_NORMAL_PAGE )
> @@ -804,7 +806,7 @@ static int __p2m_set_entry(struct p2m_domain *p2m,
>           * is about to be removed (i.e mfn == INVALID_MFN).
>           */
>          rc = p2m_next_level(p2m, mfn_eq(smfn, INVALID_MFN),
> -                            &table, offsets[level]);
> +                            level, &table, offsets[level]);
>          if ( rc == GUEST_TABLE_MAP_FAILED )
>          {
>              /*
> @@ -861,7 +863,7 @@ static int __p2m_set_entry(struct p2m_domain *p2m,
>          /* then move to the level we want to make real changes */
>          for ( ; level < target; level++ )
>          {
> -            rc = p2m_next_level(p2m, true, &table, offsets[level]);
> +            rc = p2m_next_level(p2m, true, level, &table, offsets[level]);
>  
>              /*
>               * The entry should be found and either be a table
> diff --git a/xen/include/asm-arm/lpae.h b/xen/include/asm-arm/lpae.h
> index b30853e79d..4cf188ff82 100644
> --- a/xen/include/asm-arm/lpae.h
> +++ b/xen/include/asm-arm/lpae.h
> @@ -134,7 +134,7 @@ static inline bool lpae_valid(lpae_t pte)
>  }
>  
>  /*
> - * These two can only be used on L0..L2 ptes because L3 mappings set
> + * This one can only be used on L0..L2 ptes because L3 mappings set
>   * the table bit and therefore these would return the opposite to what
>   * you would expect.
>   */
> @@ -143,14 +143,19 @@ static inline bool lpae_table(lpae_t pte)
>      return lpae_valid(pte) && pte.walk.table;
>  }
>  
> -static inline bool lpae_mapping(lpae_t pte)
> +static inline bool lpae_is_mapping(lpae_t pte, unsigned int level)
>  {
> -    return lpae_valid(pte) && !pte.walk.table;
> +    if ( !lpae_valid(pte) )
> +        return false;
> +    else if ( level == 3 )
> +        return pte.walk.table;
> +    else
> +        return !pte.walk.table;
>  }
>  
>  static inline bool lpae_is_superpage(lpae_t pte, unsigned int level)
>  {
> -    return (level < 3) && lpae_mapping(pte);
> +    return (level < 3) && lpae_is_mapping(pte, level);
>  }
>  
>  static inline bool lpae_is_page(lpae_t pte, unsigned int level)
> -- 
> 2.11.0
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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