diff --git a/sys/arm/arm/gic.c b/sys/arm/arm/gic.c --- a/sys/arm/arm/gic.c +++ b/sys/arm/arm/gic.c @@ -205,6 +205,9 @@ struct arm_gic_softc *sc = device_get_softc(dev); u_int irq, cpu; + if (root_type >= INTR_ROOT_COUNT) + return; + /* Set the mask so we can find this CPU to send it IPIs */ cpu = PCPU_GET(cpuid); MPASS(cpu < GIC_MAXCPU); diff --git a/sys/arm/broadcom/bcm2835/bcm2836.c b/sys/arm/broadcom/bcm2835/bcm2836.c --- a/sys/arm/broadcom/bcm2835/bcm2836.c +++ b/sys/arm/broadcom/bcm2835/bcm2836.c @@ -543,6 +543,9 @@ u_int cpu; struct bcm_lintc_softc *sc; + if (root_type >= INTR_ROOT_COUNT) + return; + cpu = PCPU_GET(cpuid); sc = device_get_softc(dev); diff --git a/sys/arm64/arm64/gic_v3.c b/sys/arm64/arm64/gic_v3.c --- a/sys/arm64/arm64/gic_v3.c +++ b/sys/arm64/arm64/gic_v3.c @@ -1103,6 +1103,9 @@ u_int cpu, irq; int err, i; + if (root_type >= INTR_ROOT_COUNT) + return; + sc = device_get_softc(dev); cpu = PCPU_GET(cpuid); diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c --- a/sys/arm64/arm64/gicv3_its.c +++ b/sys/arm64/arm64/gicv3_its.c @@ -1297,6 +1297,9 @@ { struct gicv3_its_softc *sc; + if (root_type >= INTR_ROOT_COUNT) + return; + sc = device_get_softc(dev); /* diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -1570,12 +1570,10 @@ void intr_pic_init_secondary(void) { + struct intr_pic *pic; device_t dev; enum root_type root_type; - /* - * QQQ: Only root PICs are aware of other CPUs ??? - */ //mtx_lock(&isrc_table_lock); for (root_type = 0; root_type < INTR_ROOT_COUNT; root_type++) { dev = intr_irq_roots[root_type].dev; @@ -1583,6 +1581,9 @@ PIC_INIT_SECONDARY(dev, root_type); } } + + STAILQ_FOREACH(pic, &pic_list, pic_next) + PIC_INIT_SECONDARY(pic->pic_dev, INTR_ROOT_COUNT); //mtx_unlock(&isrc_table_lock); } #endif