diff options
author | piso <piso@FreeBSD.org> | 2007-05-06 17:02:50 +0000 |
---|---|---|
committer | piso <piso@FreeBSD.org> | 2007-05-06 17:02:50 +0000 |
commit | 25c9d95cb5947382643fdb02dee7a6b99bb639a4 (patch) | |
tree | e66c2b004bab077c7727881fe5ffb706d78b575c /sys/sys/interrupt.h | |
parent | 5dbec163341730f1769c5939a5e146d429090527 (diff) | |
download | FreeBSD-src-25c9d95cb5947382643fdb02dee7a6b99bb639a4.zip FreeBSD-src-25c9d95cb5947382643fdb02dee7a6b99bb639a4.tar.gz |
Bring in the reminaing bits to make interrupt filtering work:
o push much of the i386 and amd64 MD interrupt handling code
(intr_machdep.c::intr_execute_handlers()) into MI code
(kern_intr.c::ithread_loop())
o move filter handling to kern_intr.c::intr_filter_loop()
o factor out the code necessary to mask and ack an interrupt event
(intr_machdep.c::intr_eoi_src() and intr_machdep.c::intr_disab_eoi_src()),
and make them part of 'struct intr_event', passing them as arguments to
kern_intr.c::intr_event_create().
o spawn a private ithread per handler (struct intr_handler::ih_thread)
with filter and ithread functions.
Approved by: re (implicit?)
Diffstat (limited to 'sys/sys/interrupt.h')
-rw-r--r-- | sys/sys/interrupt.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h index 9ca87d2..b110374 100644 --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -52,6 +52,7 @@ struct intr_handler { int ih_need; /* Needs service. */ TAILQ_ENTRY(intr_handler) ih_next; /* Next handler for this event. */ u_char ih_pri; /* Priority of this handler. */ + struct intr_thread *ih_thread; /* Ithread for filtered handler. */ }; /* Interrupt handle flags kept in ih_flags */ @@ -72,6 +73,10 @@ struct intr_event { void *ie_source; /* Cookie used by MD code. */ struct intr_thread *ie_thread; /* Thread we are connected to. */ void (*ie_enable)(void *); +#ifdef INTR_FILTER + void (*ie_eoi)(void *); + void (*ie_disab)(void *); +#endif int ie_flags; int ie_count; /* Loop counter. */ int ie_warncnt; /* Rate-check interrupt storm warns. */ @@ -113,17 +118,33 @@ extern char intrnames[]; /* string table containing device names */ #ifdef DDB void db_dump_intr_event(struct intr_event *ie, int handlers); #endif +#ifdef INTR_FILTER +int intr_filter_loop(struct intr_event *ie, struct trapframe *frame, + struct intr_thread **ithd); int intr_event_handle(struct intr_event *ie, struct trapframe *frame); +#endif u_char intr_priority(enum intr_type flags); int intr_event_add_handler(struct intr_event *ie, const char *name, driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, void **cookiep); +#ifndef INTR_FILTER int intr_event_create(struct intr_event **event, void *source, int flags, void (*enable)(void *), const char *fmt, ...) __printflike(5, 6); +#else +int intr_event_create(struct intr_event **event, void *source, + int flags, void (*enable)(void *), void (*eoi)(void *), + void (*disab)(void *), const char *fmt, ...) + __printflike(7, 8); +#endif int intr_event_destroy(struct intr_event *ie); int intr_event_remove_handler(void *cookie); +#ifndef INTR_FILTER int intr_event_schedule_thread(struct intr_event *ie); +#else +int intr_event_schedule_thread(struct intr_event *ie, + struct intr_thread *ithd); +#endif void *intr_handler_source(void *cookie); int swi_add(struct intr_event **eventp, const char *name, driver_intr_t handler, void *arg, int pri, enum intr_type flags, |