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

Re: [Xen-devel] [PATCH for-4.12] xen/arm: gic: Make sure the number of interrupt lines is valid before using it



On Fri, 30 Nov 2018, Julien Grall wrote:
> GICv2 and GICv3 supports up to 1020 interrupts. However, the value computed
> from GICD_TYPER.ITLinesNumber can be up to 1024. On GICv3, we will end up to
> write in reserved registers that are right after the IROUTERs one as the
> value is not capped early enough.
> 
> Cap the number of interrupts as soon as we compute it so we know we can
> safely using it afterwards.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> Reported-by: Jan-Peter Larsson <Jan-Peter.Larsson@xxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> ---
>     This patch should be backport up to Xen 4.9.

Agreed


> ---
>  xen/arch/arm/gic-v2.c | 7 ++++---
>  xen/arch/arm/gic-v3.c | 7 ++++---
>  2 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
> index 1a744c576f..e9fb8a01ab 100644
> --- a/xen/arch/arm/gic-v2.c
> +++ b/xen/arch/arm/gic-v2.c
> @@ -353,6 +353,10 @@ static void __init gicv2_dist_init(void)
>  
>      type = readl_gicd(GICD_TYPER);
>      nr_lines = 32 * ((type & GICD_TYPE_LINES) + 1);
> +    /* Only 1020 interrupts are supported */
> +    nr_lines = min(1020U, nr_lines);
> +    gicv2_info.nr_lines = nr_lines;
> +
>      gic_cpus = 1 + ((type & GICD_TYPE_CPUS) >> 5);
>      printk("GICv2: %d lines, %d cpu%s%s (IID %8.8x).\n",
>             nr_lines, gic_cpus, (gic_cpus == 1) ? "" : "s",
> @@ -377,9 +381,6 @@ static void __init gicv2_dist_init(void)
>      for ( i = 32; i < nr_lines; i += 32 )
>          writel_gicd(~0x0, GICD_ICENABLER + (i / 32) * 4);
>  
> -    /* Only 1020 interrupts are supported */
> -    gicv2_info.nr_lines = min(1020U, nr_lines);
> -
>      /* Turn on the distributor */
>      writel_gicd(GICD_CTL_ENABLE, GICD_CTLR);
>  }
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 6fbc106757..c9200d24e1 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -607,6 +607,10 @@ static void __init gicv3_dist_init(void)
>      if ( type & GICD_TYPE_LPIS )
>          gicv3_lpi_init_host_lpis(GICD_TYPE_ID_BITS(type));
>  
> +    /* Only 1020 interrupts are supported */
> +    nr_lines = min(1020U, nr_lines);
> +    gicv3_info.nr_lines = nr_lines;
> +
>      printk("GICv3: %d lines, (IID %8.8x).\n",
>             nr_lines, readl_relaxed(GICD + GICD_IIDR));
>  
> @@ -646,9 +650,6 @@ static void __init gicv3_dist_init(void)
>  
>      for ( i = NR_GIC_LOCAL_IRQS; i < nr_lines; i++ )
>          writeq_relaxed(affinity, GICD + GICD_IROUTER + i * 8);
> -
> -    /* Only 1020 interrupts are supported */
> -    gicv3_info.nr_lines = min(1020U, nr_lines);
>  }
>  
>  static int gicv3_enable_redist(void)
> -- 
> 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®.