On Fri, Sep 04, 2020 at 08:55:30AM -0600, Theo de Raadt wrote: > Too much ifdef. Can you try a different approach -- leave the ipi code > intact, but wrap the call to db_enter() with #ifdef DDB? The ipi won't > be activated, so it should be fine for it to return 0.
Thanks Theo. I just tried to the follow (what seems to be) the standard practice across the kernel of segregating all DDB-specific code. Pros and cons to both approaches, obviously, but I can confirm the less explicit approach works too: Index: agintc.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/dev/agintc.c,v retrieving revision 1.26 diff -u -p -u -p -r1.26 agintc.c --- agintc.c 17 Jul 2020 08:07:33 -0000 1.26 +++ agintc.c 5 Sep 2020 01:32:13 -0000 @@ -1121,7 +1121,9 @@ int agintc_ipi_ddb(void *v) { /* XXX */ +#ifdef DDB db_enter(); +#endif return 1; } Index: ampintc.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/dev/ampintc.c,v retrieving revision 1.19 diff -u -p -u -p -r1.19 ampintc.c --- ampintc.c 17 Jul 2020 08:07:33 -0000 1.19 +++ ampintc.c 5 Sep 2020 01:32:13 -0000 @@ -958,7 +958,9 @@ int ampintc_ipi_ddb(void *v) { /* XXX */ +#ifdef DDB db_enter(); +#endif return 1; } > Matt Baulch <baulch.m...@gmail.com> wrote: > > > Currently, it's not possible to build on arm64 without the in-kernel > > debugger. > > This patch fixes the two offending files: > > > > Index: agintc.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/arm64/dev/agintc.c,v > > retrieving revision 1.26 > > diff -u -p -u -p -r1.26 agintc.c > > --- agintc.c 17 Jul 2020 08:07:33 -0000 1.26 > > +++ agintc.c 4 Sep 2020 13:18:33 -0000 > > @@ -156,7 +156,9 @@ struct agintc_softc { > > struct agintc_dmamem *sc_pend; > > struct interrupt_controller sc_ic; > > int sc_ipi_num[2]; /* id for NOP and DDB ipi */ > > +#ifdef DDB > > int sc_ipi_reason[MAXCPUS]; /* NOP or DDB caused */ > > +#endif > > void *sc_ipi_irq[2]; /* irqhandle for each ipi */ > > }; > > struct agintc_softc *agintc_sc; > > @@ -226,7 +228,9 @@ void agintc_wait_rwp(struct agintc_soft > > void agintc_r_wait_rwp(struct agintc_softc *sc); > > uint32_t agintc_r_ictlr(void); > > > > +#ifdef DDB > > int agintc_ipi_ddb(void *v); > > +#endif > > int agintc_ipi_nop(void *v); > > int agintc_ipi_combined(void *); > > void agintc_send_ipi(struct cpu_info *, int); > > @@ -576,15 +580,19 @@ agintc_attach(struct device *parent, str > > sc->sc_ipi_irq[0] = agintc_intr_establish(ipiirq[0], > > IPL_IPI|IPL_MPSAFE, NULL, agintc_ipi_combined, sc, "ipi"); > > sc->sc_ipi_num[ARM_IPI_NOP] = ipiirq[0]; > > +#ifdef DDB > > sc->sc_ipi_num[ARM_IPI_DDB] = ipiirq[0]; > > +#endif > > break; > > case 2: > > sc->sc_ipi_irq[0] = agintc_intr_establish(ipiirq[0], > > IPL_IPI|IPL_MPSAFE, NULL, agintc_ipi_nop, sc, "ipinop"); > > sc->sc_ipi_num[ARM_IPI_NOP] = ipiirq[0]; > > +#ifdef DDB > > sc->sc_ipi_irq[1] = agintc_intr_establish(ipiirq[1], > > IPL_IPI|IPL_MPSAFE, NULL, agintc_ipi_ddb, sc, "ipiddb"); > > sc->sc_ipi_num[ARM_IPI_DDB] = ipiirq[1]; > > +#endif > > break; > > default: > > panic("nipi unexpected number %d", nipi); > > @@ -1117,6 +1125,7 @@ agintc_r_wait_rwp(struct agintc_softc *s > > } > > > > #ifdef MULTIPROCESSOR > > +#ifdef DDB > > int > > agintc_ipi_ddb(void *v) > > { > > @@ -1124,6 +1133,7 @@ agintc_ipi_ddb(void *v) > > db_enter(); > > return 1; > > } > > +#endif > > > > int > > agintc_ipi_nop(void *v) > > @@ -1135,14 +1145,16 @@ agintc_ipi_nop(void *v) > > int > > agintc_ipi_combined(void *v) > > { > > +#ifdef DDB > > struct agintc_softc *sc = v; > > > > if (sc->sc_ipi_reason[cpu_number()] == ARM_IPI_DDB) { > > sc->sc_ipi_reason[cpu_number()] = ARM_IPI_NOP; > > return agintc_ipi_ddb(v); > > - } else { > > - return agintc_ipi_nop(v); > > } > > +#endif > > + > > + return agintc_ipi_nop(v); > > } > > > > void > > @@ -1154,9 +1166,11 @@ agintc_send_ipi(struct cpu_info *ci, int > > if (ci == curcpu() && id == ARM_IPI_NOP) > > return; > > > > +#ifdef DDB > > /* never overwrite IPI_DDB with IPI_NOP */ > > if (id == ARM_IPI_DDB) > > sc->sc_ipi_reason[ci->ci_cpuid] = id; > > +#endif > > > > /* will only send 1 cpu */ > > sendmask = (ci->ci_mpidr & MPIDR_AFF3) << 16; > > Index: ampintc.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/arm64/dev/ampintc.c,v > > retrieving revision 1.19 > > diff -u -p -u -p -r1.19 ampintc.c > > --- ampintc.c 17 Jul 2020 08:07:33 -0000 1.19 > > +++ ampintc.c 4 Sep 2020 13:18:33 -0000 > > @@ -141,7 +141,9 @@ struct ampintc_softc { > > uint8_t sc_cpu_mask[ICD_ICTR_CPU_M + 1]; > > struct evcount sc_spur; > > struct interrupt_controller sc_ic; > > +#ifdef DDB > > int sc_ipi_reason[ICD_ICTR_CPU_M + 1]; > > +#endif > > int sc_ipi_num[2]; > > }; > > struct ampintc_softc *ampintc; > > @@ -196,7 +198,9 @@ void ampintc_intr_barrier(void *); > > > > int ampintc_ipi_combined(void *); > > int ampintc_ipi_nop(void *); > > +#ifdef DDB > > int ampintc_ipi_ddb(void *); > > +#endif > > void ampintc_send_ipi(struct cpu_info *, int); > > > > struct cfattach ampintc_ca = { > > @@ -347,15 +351,19 @@ ampintc_attach(struct device *parent, st > > ampintc_intr_establish(ipiirq[0], IST_EDGE_RISING, > > IPL_IPI|IPL_MPSAFE, NULL, ampintc_ipi_combined, sc, "ipi"); > > sc->sc_ipi_num[ARM_IPI_NOP] = ipiirq[0]; > > +#ifdef DDB > > sc->sc_ipi_num[ARM_IPI_DDB] = ipiirq[0]; > > +#endif > > break; > > case 2: > > ampintc_intr_establish(ipiirq[0], IST_EDGE_RISING, > > IPL_IPI|IPL_MPSAFE, NULL, ampintc_ipi_nop, sc, "ipinop"); > > sc->sc_ipi_num[ARM_IPI_NOP] = ipiirq[0]; > > +#ifdef DDB > > ampintc_intr_establish(ipiirq[1], IST_EDGE_RISING, > > IPL_IPI|IPL_MPSAFE, NULL, ampintc_ipi_ddb, sc, "ipiddb"); > > sc->sc_ipi_num[ARM_IPI_DDB] = ipiirq[1]; > > +#endif > > break; > > default: > > panic("nipi unexpected number %d", nipi); > > @@ -954,6 +962,7 @@ ampintc_intr_barrier_msi(void *cookie) > > } > > > > #ifdef MULTIPROCESSOR > > +#ifdef DDB > > int > > ampintc_ipi_ddb(void *v) > > { > > @@ -961,6 +970,7 @@ ampintc_ipi_ddb(void *v) > > db_enter(); > > return 1; > > } > > +#endif > > > > int > > ampintc_ipi_nop(void *v) > > @@ -972,14 +982,16 @@ ampintc_ipi_nop(void *v) > > int > > ampintc_ipi_combined(void *v) > > { > > +#ifdef DDB > > struct ampintc_softc *sc = (struct ampintc_softc *)v; > > > > if (sc->sc_ipi_reason[cpu_number()] == ARM_IPI_DDB) { > > sc->sc_ipi_reason[cpu_number()] = ARM_IPI_NOP; > > return ampintc_ipi_ddb(v); > > - } else { > > - return ampintc_ipi_nop(v); > > } > > +#endif > > + > > + return ampintc_ipi_nop(v); > > } > > > > void > > @@ -991,9 +1003,11 @@ ampintc_send_ipi(struct cpu_info *ci, in > > if (ci == curcpu() && id == ARM_IPI_NOP) > > return; > > > > +#ifdef DDB > > /* never overwrite IPI_DDB with IPI_NOP */ > > if (id == ARM_IPI_DDB) > > sc->sc_ipi_reason[ci->ci_cpuid] = id; > > +#endif > > > > /* currently will only send to one cpu */ > > sendmask = 1 << (16 + ci->ci_cpuid); > >