diff options
author | cognet <cognet@FreeBSD.org> | 2004-11-23 16:31:16 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2004-11-23 16:31:16 +0000 |
commit | 61c101ec0de2d94095739fdab995de15573f579c (patch) | |
tree | b6fecc8e003d2bdaf134246da267a039f9260b7a /sys/arm | |
parent | 8519448b1b319816778c82132e8cfcc9bdbb1368 (diff) | |
download | FreeBSD-src-61c101ec0de2d94095739fdab995de15573f579c.zip FreeBSD-src-61c101ec0de2d94095739fdab995de15573f579c.tar.gz |
Enable interrupts as soon as the pending interrupts have been masked.
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/arm/intr.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c index e4e0506..b45d942 100644 --- a/sys/arm/arm/intr.c +++ b/sys/arm/arm/intr.c @@ -139,17 +139,16 @@ arm_handler_execute(void *frame, int irqnb) continue; ih = TAILQ_FIRST(&ithd->it_handlers); if (ih && ih->ih_flags & IH_FAST) { + oldirqstate = disable_interrupts(I32_bit); TAILQ_FOREACH(ih, &ithd->it_handlers, ih_next) { ih->ih_handler(ih->ih_argument ? ih->ih_argument : frame); } + restore_interrupts(oldirqstate); arm_unmask_irqs(1 << i); - } else if (ih) { - oldirqstate = enable_interrupts(I32_bit); + } else if (ih) ithread_schedule(ithd); - restore_interrupts(oldirqstate); - } irqnb |= arm_get_irqnb(frame); } td->td_intr_nesting_level--; |