diff options
| author | Paolo Pisati <piso@FreeBSD.org> | 2007-05-31 19:25:35 +0000 |
|---|---|---|
| committer | Paolo Pisati <piso@FreeBSD.org> | 2007-05-31 19:25:35 +0000 |
| commit | 3401f2c1dfdb11f0c83a8394c7c14b2c69cb1f63 (patch) | |
| tree | 970cc806d49c2592d85b73107b989311f414b03f /sys/amd64 | |
| parent | bba4862c6482ae036365342c54e10864922f4c74 (diff) | |
Notes
Diffstat (limited to 'sys/amd64')
| -rw-r--r-- | sys/amd64/amd64/intr_machdep.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/amd64/amd64/intr_machdep.c b/sys/amd64/amd64/intr_machdep.c index 2864868d731d..6ed8c80c52b1 100644 --- a/sys/amd64/amd64/intr_machdep.c +++ b/sys/amd64/amd64/intr_machdep.c @@ -310,7 +310,7 @@ intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) struct thread *td; struct intr_event *ie; struct intr_handler *ih; - int error, vector, thread; + int error, vector, thread, ret; td = curthread; @@ -356,6 +356,7 @@ intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) * a trapframe as its argument. */ td->td_intr_nesting_level++; + ret = 0; thread = 0; critical_enter(); TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { @@ -367,9 +368,17 @@ intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) ih->ih_filter, ih->ih_argument == NULL ? frame : ih->ih_argument, ih->ih_name); if (ih->ih_argument == NULL) - ih->ih_filter(frame); + ret = ih->ih_filter(frame); else - ih->ih_filter(ih->ih_argument); + ret = ih->ih_filter(ih->ih_argument); + /* + * Wrapper handler special case: see + * i386/intr_machdep.c::intr_execute_handlers() + */ + if (!thread) { + if (ret == FILTER_SCHEDULE_THREAD) + thread = 1; + } } /* |
