diff options
Diffstat (limited to 'device/intr.c')
-rw-r--r-- | device/intr.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/device/intr.c b/device/intr.c index 27dfa8ec..07d8acd8 100644 --- a/device/intr.c +++ b/device/intr.c @@ -55,12 +55,18 @@ search_intr (struct irqdev *dev, ipc_port_t dst_port) /* * Interrupt handling logic: + * PCI interrupts are raised on master processor only. * * interrupt.S raises spl (thus IF cleared) - * interrupt.S EOI - * interrupt.S calls the handler - * - for pure in-kernel handlers, they do whatever they want with IF cleared. - * - when a userland handler is registered, queue_intr masks the irq. + * For edge triggered interrupts (to ensure none are missed): + * - interrupt.S EOI + * - interrupt.S calls the handler + * For level triggered interrupts (to prevent stacking): + * - interrupt.S calls the handler + * - interrupt.S EOI + * + * For pure in-kernel handlers, they do whatever they want with IF cleared. + * When a userland handler is registered, queue_intr masks the irq. * interrupt.S lowers spl with splx_cli, thus IF still cleared * iret, that also sets IF * @@ -159,7 +165,7 @@ insert_intr_entry (struct irqdev *dev, int id, ipc_port_t dst_port) ret = NULL; goto out; } - printf("irq handler [%d]: new delivery port %p entry %p\n", id, dst_port, new); + printf("irq handler [%d]: new delivery port %p entry %p for %s\n", id, dst_port, new, current_task()->name); ret = new; new->id = id; new->dst_port = dst_port; |