Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F171144783
D32346.id96443.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D32346.id96443.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D32346: sys: add trap frame compatibility macros
Attached
Detach File
Event Timeline
Log In to Comment