Index: aplintc.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/dev/aplintc.c,v diff -u -p -r1.18 aplintc.c --- aplintc.c 21 Dec 2022 22:30:42 -0000 1.18 +++ aplintc.c 3 Jul 2025 02:47:30 -0000 @@ -658,10 +658,7 @@ aplintc_send_ipi(struct cpu_info *ci, in if (ci == curcpu() && reason == ARM_IPI_NOP) return; - /* never overwrite IPI_DDB or IPI_HALT with IPI_NOP */ - if (reason == ARM_IPI_DDB || reason == ARM_IPI_HALT) - sc->sc_ipi_reason[ci->ci_cpuid] = reason; - membar_producer(); + atomic_setbits_int(&sc->sc_ipi_reason[ci->ci_cpuid], 1 << reason); sendmask = (ci->ci_mpidr & MPIDR_AFF0); if ((curcpu()->ci_mpidr & MPIDR_AFF1) == (ci->ci_mpidr & MPIDR_AFF1)) { @@ -678,16 +675,16 @@ void aplintc_handle_ipi(struct aplintc_softc *sc) { struct cpu_info *ci = curcpu(); + u_int reasons; - membar_consumer(); - if (sc->sc_ipi_reason[ci->ci_cpuid] == ARM_IPI_DDB) { - sc->sc_ipi_reason[ci->ci_cpuid] = ARM_IPI_NOP; + reasons = atomic_swap_uint(&sc->sc_ipi_reason[ci->ci_cpuid], 0); + if (reasons) { #ifdef DDB - db_enter(); + if (ISSET(reasons, 1 << ARM_IPI_DDB)) + db_enter(); #endif - } else if (sc->sc_ipi_reason[ci->ci_cpuid] == ARM_IPI_HALT) { - sc->sc_ipi_reason[ci->ci_cpuid] = ARM_IPI_NOP; - cpu_halt(); + if (ISSET(reasons, 1 << ARM_IPI_HALT)) + cpu_halt(); } sc->sc_ipi_count.ec_count++;