Index: sys/arm/allwinner/a10/a10_intc.c =================================================================== --- sys/arm/allwinner/a10/a10_intc.c +++ sys/arm/allwinner/a10/a10_intc.c @@ -182,8 +182,9 @@ } static int -a10_intr(void *arg) +a10_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { + INTR_IRQ_FILTER_TRAPFRAME(tf) struct a10_aintc_softc *sc = arg; u_int irq; @@ -199,8 +200,7 @@ irq); return (FILTER_HANDLED); } - if (intr_isrc_dispatch(&sc->isrcs[irq].isrc, - curthread->td_intr_frame) != 0) { + if (intr_isrc_dispatch(&sc->isrcs[irq].isrc, tf) != 0) { a10_intr_mask(sc, irq); a10_intr_eoi(sc, irq); device_printf(sc->sc_dev, Index: sys/arm/arm/gic.c =================================================================== --- sys/arm/arm/gic.c +++ sys/arm/arm/gic.c @@ -524,12 +524,12 @@ } int -arm_gic_intr(void *arg) +arm_gic_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { struct arm_gic_softc *sc = arg; struct gic_irqsrc *gi; uint32_t irq_active_reg, irq; - struct trapframe *tf; + INTR_IRQ_FILTER_TRAPFRAME(tf) irq_active_reg = gic_c_read_4(sc, GICC_IAR); irq = irq_active_reg & 0x3FF; @@ -560,7 +560,6 @@ return (FILTER_HANDLED); } - tf = curthread->td_intr_frame; dispatch_irq: gi = sc->gic_irqs + irq; /* Index: sys/arm/broadcom/bcm2835/bcm2835_intr.c =================================================================== --- sys/arm/broadcom/bcm2835/bcm2835_intr.c +++ sys/arm/broadcom/bcm2835/bcm2835_intr.c @@ -212,8 +212,9 @@ } static int -bcm2835_intc_intr(void *arg) +bcm2835_intc_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { + INTR_IRQ_FILTER_TRAPFRAME(tf) int irq, num; struct bcm_intc_softc *sc = arg; @@ -221,8 +222,7 @@ irq = bcm2835_intc_active_intr(sc); if (irq == -1) break; - if (intr_isrc_dispatch(&sc->intc_isrcs[irq].bii_isrc, - curthread->td_intr_frame) != 0) { + if (intr_isrc_dispatch(&sc->intc_isrcs[irq].bii_isrc, tf) != 0) { bcm_intc_isrc_mask(sc, &sc->intc_isrcs[irq]); device_printf(sc->sc_dev, "Stray irq %u disabled\n", irq); Index: sys/arm/broadcom/bcm2835/bcm2836.c =================================================================== --- sys/arm/broadcom/bcm2835/bcm2836.c +++ sys/arm/broadcom/bcm2835/bcm2836.c @@ -386,16 +386,15 @@ } static int -bcm_lintc_intr(void *arg) +bcm_lintc_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { struct bcm_lintc_softc *sc; u_int cpu; uint32_t num, reg; - struct trapframe *tf; + INTR_IRQ_FILTER_TRAPFRAME(tf) sc = arg; cpu = PCPU_GET(cpuid); - tf = curthread->td_intr_frame; for (num = 0; ; num++) { reg = bcm_lintc_read_4(sc, BCM_LINTC_PENDING_REG(cpu)); Index: sys/arm/freescale/imx/tzic.c =================================================================== --- sys/arm/freescale/imx/tzic.c +++ sys/arm/freescale/imx/tzic.c @@ -103,8 +103,9 @@ } static int -tzic_intr(void *arg) +tzic_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { + INTR_IRQ_FILTER_TRAPFRAME(tf) struct tzic_softc *sc = arg; int b, i, irq; uint32_t pending; @@ -116,8 +117,7 @@ continue; irq = i * 32 + b; tzic_write_4(sc, TZIC_PRIOMASK, 0); - if (intr_isrc_dispatch(&sc->isrcs[irq].isrc, - curthread->td_intr_frame) != 0) { + if (intr_isrc_dispatch(&sc->isrcs[irq].isrc, tf) != 0) { tzic_irq_mask(sc, irq); tzic_irq_eoi(sc); arm_irq_memory_barrier(irq); Index: sys/arm/ti/aintc.c =================================================================== --- sys/arm/ti/aintc.c +++ sys/arm/ti/aintc.c @@ -119,8 +119,9 @@ } static int -ti_aintc_intr(void *arg) +ti_aintc_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { + INTR_IRQ_FILTER_TRAPFRAME(tf) uint32_t irq; struct ti_aintc_softc *sc = arg; @@ -135,8 +136,7 @@ /* Only level-sensitive interrupts detection is supported. */ irq &= INTC_SIR_ACTIVE_MASK; - if (intr_isrc_dispatch(&sc->aintc_isrcs[irq].tai_isrc, - curthread->td_intr_frame) != 0) { + if (intr_isrc_dispatch(&sc->aintc_isrcs[irq].tai_isrc, tf) != 0) { ti_aintc_irq_mask(sc, irq); ti_aintc_irq_eoi(sc); device_printf(sc->sc_dev, "Stray irq %u disabled\n", irq); Index: sys/arm64/arm64/gic_v3.c =================================================================== --- sys/arm64/arm64/gic_v3.c +++ sys/arm64/arm64/gic_v3.c @@ -505,13 +505,13 @@ } int -arm_gic_v3_intr(void *arg) +arm_gic_v3_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { struct gic_v3_softc *sc = arg; struct gic_v3_irqsrc *gi; struct intr_pic *pic; uint64_t active_irq; - struct trapframe *tf; + INTR_IRQ_FILTER_TRAPFRAME(tf) pic = sc->gic_pic; @@ -541,7 +541,6 @@ if (__predict_false(active_irq >= sc->gic_nirqs)) return (FILTER_HANDLED); - tf = curthread->td_intr_frame; gi = &sc->gic_irqs[active_irq]; if (active_irq <= GIC_LAST_SGI) { /* Call EOI for all IPI before dispatch. */ Index: sys/arm64/arm64/gic_v3_var.h =================================================================== --- sys/arm64/arm64/gic_v3_var.h +++ sys/arm64/arm64/gic_v3_var.h @@ -106,7 +106,7 @@ /* Device methods */ int gic_v3_attach(device_t dev); int gic_v3_detach(device_t dev); -int arm_gic_v3_intr(void *); +intr_irq_filter arm_gic_v3_intr; uint32_t gic_r_read_4(device_t, bus_size_t); uint64_t gic_r_read_8(device_t, bus_size_t); Index: sys/kern/kern_intr.c =================================================================== --- sys/kern/kern_intr.c +++ sys/kern/kern_intr.c @@ -1397,6 +1397,11 @@ atomic_thread_fence_seq_cst(); CK_SLIST_FOREACH(ih, &ie->ie_handlers, ih_next) { +#ifdef notyet + void *const arg = ih->ih_argument; +#else + void *const arg = ih->ih_argument == NULL ? frame : ih->ih_argument; +#endif if ((ih->ih_flags & IH_SUSP) != 0) continue; if ((ie->ie_flags & IE_SOFT) != 0 && ih->ih_need == 0) @@ -1406,12 +1411,8 @@ continue; } CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, - ih->ih_filter, ih->ih_argument == NULL ? frame : - ih->ih_argument, ih->ih_name); - if (ih->ih_argument == NULL) - ret = ih->ih_filter(frame); - else - ret = ih->ih_filter(ih->ih_argument); + ih->ih_filter, arg, ih->ih_name); + ret = ih->ih_filter(DRIVER_FILTER_CALL(arg, frame)); #ifdef HWPMC_HOOKS PMC_SOFT_CALL_TF( , , intr, all, frame); #endif Index: sys/kern/subr_intr.c =================================================================== --- sys/kern/subr_intr.c +++ sys/kern/subr_intr.c @@ -324,7 +324,7 @@ td = curthread; oldframe = td->td_intr_frame; td->td_intr_frame = tf; - irq_root_filter(irq_root_arg); + irq_root_filter(INTR_IRQ_FILTER_CALL(irq_root_arg, tf)); td->td_intr_frame = oldframe; critical_exit(); #ifdef HWPMC_HOOKS Index: sys/mips/mips/mips_pic.c =================================================================== --- sys/mips/mips/mips_pic.c +++ sys/mips/mips/mips_pic.c @@ -72,7 +72,7 @@ struct mips_pic_softc; -static int mips_pic_intr(void *); +static intr_irq_filter_t mips_pic_intr; static struct mips_pic_intr *mips_pic_find_intr(struct resource *r); static int mips_pic_map_fixed_intr(u_int irq, struct mips_pic_intr **mapping); @@ -261,8 +261,9 @@ } int -mips_pic_intr(void *arg) +mips_pic_intr(INTR_IRQ_FILTER_ARGS(arg, tf)) { + INTR_IRQ_FILTER_TRAPFRAME(tf) struct mips_pic_softc *sc = arg; register_t cause, status; int i, intr; @@ -280,8 +281,7 @@ i--; /* Get a 0-offset interrupt. */ intr &= ~(1 << i); - if (intr_isrc_dispatch(PIC_INTR_ISRC(sc, i), - curthread->td_intr_frame) != 0) { + if (intr_isrc_dispatch(PIC_INTR_ISRC(sc, i), tf) != 0) { device_printf(sc->pic_dev, "Stray interrupt %u detected\n", i); pic_irq_mask(sc, i); Index: sys/sys/bus.h =================================================================== --- sys/sys/bus.h +++ sys/sys/bus.h @@ -233,7 +233,17 @@ * and may use regular mutexes. However, it is prohibited from * sleeping on a sleep queue. */ -typedef int driver_filter_t(void*); +#ifdef notyet +#define DRIVER_FILTER_CALL(arg, tf) (arg), (tf) +#define DRIVER_FILTER_ARGS(arg, tf) void *arg, struct trapframe *tf +#define DRIVER_FILTER_TRAPFRAME(tf) +#else +#define DRIVER_FILTER_CALL(arg, tf) (arg) +#define DRIVER_FILTER_ARGS(arg, tf) void *arg +#define DRIVER_FILTER_TRAPFRAME(tf) struct trapframe *tf = curthread->td_intr_frame; +#endif +#define DRIVER_FILTER_ARG DRIVER_FILTER_ARGS(arg, unused __unused) +typedef int driver_filter_t(DRIVER_FILTER_ARGS(,)); typedef void driver_intr_t(void*); /** Index: sys/sys/intr.h =================================================================== --- sys/sys/intr.h +++ sys/sys/intr.h @@ -65,10 +65,15 @@ #ifdef notyet #define INTR_SOLO INTR_MD1 -typedef int intr_irq_filter_t(void *arg, struct trapframe *tf); +#define INTR_IRQ_FILTER_CALL(arg, tf) (arg), (tf) +#define INTR_IRQ_FILTER_ARGS(arg, tf) void *arg, struct trapframe *tf +#define INTR_IRQ_FILTER_TRAPFRAME(tf) #else -typedef int intr_irq_filter_t(void *arg); +#define INTR_IRQ_FILTER_CALL(arg, tf) (arg) +#define INTR_IRQ_FILTER_ARGS(arg, tf) void *arg +#define INTR_IRQ_FILTER_TRAPFRAME(tf) struct trapframe *tf = curthread->td_intr_frame; #endif +typedef int intr_irq_filter_t(INTR_IRQ_FILTER_ARGS(,)); typedef int intr_child_irq_filter_t(void *arg, uintptr_t irq); #define INTR_ISRC_NAMELEN (MAXCOMLEN + 1)