summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_intr.c
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2010-01-27 09:59:08 +0000
committeravg <avg@FreeBSD.org>2010-01-27 09:59:08 +0000
commit8ad65aae5c54b9bef2da68d416e16a6f680759ab (patch)
tree23c9b673e414659271eb8872494a043a2ac05186 /sys/kern/kern_intr.c
parent52f89aaf3bfded4001ec37cd0537c95df9f11683 (diff)
downloadFreeBSD-src-8ad65aae5c54b9bef2da68d416e16a6f680759ab.zip
FreeBSD-src-8ad65aae5c54b9bef2da68d416e16a6f680759ab.tar.gz
KASSERT that return value of interrupt filter complies with contract
For example a return value of zero could lead to a stuck level-triggered interrupt line. Reviewed by: jhb (for INTR_FILTER case) MFC after: 3 weeks
Diffstat (limited to 'sys/kern/kern_intr.c')
-rw-r--r--sys/kern/kern_intr.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 3554b9f..105ea18 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -1378,6 +1378,12 @@ intr_event_handle(struct intr_event *ie, struct trapframe *frame)
ret = ih->ih_filter(frame);
else
ret = ih->ih_filter(ih->ih_argument);
+ KASSERT(ret == FILTER_STRAY ||
+ ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 &&
+ (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0),
+ ("%s: incorrect return value %#x from %s", __func__, ret,
+ ih->ih_name));
+
/*
* Wrapper handler special handling:
*
@@ -1546,7 +1552,11 @@ intr_filter_loop(struct intr_event *ie, struct trapframe *frame,
thread_only = 1;
continue;
}
-
+ KASSERT(ret == FILTER_STRAY ||
+ ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 &&
+ (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0),
+ ("%s: incorrect return value %#x from %s", __func__, ret,
+ ih->ih_name));
if (ret & FILTER_STRAY)
continue;
else {
OpenPOWER on IntegriCloud