[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |