Rev 4055 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4055 | Rev 4420 | ||
---|---|---|---|
Line 58... | Line 58... | ||
58 | static void exception_external(int n, istate_t *istate) |
58 | static void exception_external(int n, istate_t *istate) |
59 | { |
59 | { |
60 | int inum; |
60 | int inum; |
61 | 61 | ||
62 | while ((inum = pic_get_pending()) != -1) { |
62 | while ((inum = pic_get_pending()) != -1) { |
63 | bool ack = false; |
- | |
64 | irq_t *irq = irq_dispatch_and_lock(inum); |
63 | irq_t *irq = irq_dispatch_and_lock(inum); |
65 | if (irq) { |
64 | if (irq) { |
66 | /* |
65 | /* |
67 | * The IRQ handler was found. |
66 | * The IRQ handler was found. |
68 | */ |
67 | */ |
69 | 68 | ||
70 | if (irq->preack) { |
69 | if (irq->preack) { |
71 | /* Acknowledge the interrupt before processing */ |
70 | /* Acknowledge the interrupt before processing */ |
72 | pic_ack_interrupt(inum); |
71 | if (irq->cir) |
73 | ack = true; |
72 | irq->cir(irq->cir_arg, irq->inr); |
74 | } |
73 | } |
75 | 74 | ||
76 | irq->handler(irq); |
75 | irq->handler(irq); |
- | 76 | ||
- | 77 | if (!irq->preack) { |
|
- | 78 | if (irq->cir) |
|
- | 79 | irq->cir(irq->cir_arg, irq->inr); |
|
- | 80 | } |
|
- | 81 | ||
77 | spinlock_unlock(&irq->lock); |
82 | spinlock_unlock(&irq->lock); |
78 | } else { |
83 | } else { |
79 | /* |
84 | /* |
80 | * Spurious interrupt. |
85 | * Spurious interrupt. |
81 | */ |
86 | */ |
82 | #ifdef CONFIG_DEBUG |
87 | #ifdef CONFIG_DEBUG |
83 | printf("cpu%u: spurious interrupt (inum=%d)\n", CPU->id, inum); |
88 | printf("cpu%u: spurious interrupt (inum=%d)\n", CPU->id, inum); |
84 | #endif |
89 | #endif |
85 | } |
90 | } |
86 | - | ||
87 | if (!ack) |
- | |
88 | pic_ack_interrupt(inum); |
- | |
89 | } |
91 | } |
90 | } |
92 | } |
91 | 93 | ||
92 | 94 | ||
93 | static void exception_decrementer(int n, istate_t *istate) |
95 | static void exception_decrementer(int n, istate_t *istate) |