Page MenuHomeFreeBSD

D32346.id96443.diff
No OneTemporary

D32346.id96443.diff

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,12 @@
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);
+#ifdef notyet
+ ret = ih->ih_filter(arg, frame);
+#else
+ ret = ih->ih_filter(arg);
+#endif
#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,11 @@
td = curthread;
oldframe = td->td_intr_frame;
td->td_intr_frame = tf;
+#ifdef INTR_SOLO
+ irq_root_filter(irq_root_arg, tf);
+#else
irq_root_filter(irq_root_arg);
+#endif
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,15 @@
* 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_ARGS(arg, tf) void *arg, struct trapframe *tf
+#define DRIVER_FILTER_TRAPFRAME(tf)
+#else
+#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,13 @@
#ifdef notyet
#define INTR_SOLO INTR_MD1
-typedef int intr_irq_filter_t(void *arg, struct trapframe *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_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)

File Metadata

Mime Type
text/plain
Expires
Thu, Sep 10, 12:02 AM (7 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38620840
Default Alt Text
D32346.id96443.diff (8 KB)

Event Timeline