Rev 2292 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2292 | Rev 2307 | ||
|---|---|---|---|
| Line 174... | Line 174... | ||
| 174 | static void irq_interrupt(int n, istate_t *istate) |
174 | static void irq_interrupt(int n, istate_t *istate) |
| 175 | { |
175 | { |
| 176 | ASSERT(n >= IVT_IRQBASE); |
176 | ASSERT(n >= IVT_IRQBASE); |
| 177 | 177 | ||
| 178 | int inum = n - IVT_IRQBASE; |
178 | int inum = n - IVT_IRQBASE; |
| - | 179 | bool ack = false; |
|
| 179 | ASSERT(inum < IRQ_COUNT); |
180 | ASSERT(inum < IRQ_COUNT); |
| 180 | ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
181 | ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
| 181 | 182 | ||
| 182 | irq_t *irq = irq_dispatch_and_lock(inum); |
183 | irq_t *irq = irq_dispatch_and_lock(inum); |
| 183 | if (irq) { |
184 | if (irq) { |
| 184 | /* |
185 | /* |
| 185 | * The IRQ handler was found. |
186 | * The IRQ handler was found. |
| 186 | */ |
187 | */ |
| - | 188 | ||
| - | 189 | if (irq->preack) { |
|
| - | 190 | /* Send EOI before processing the interrupt */ |
|
| - | 191 | trap_virtual_eoi(); |
|
| - | 192 | ack = true; |
|
| - | 193 | } |
|
| 187 | irq->handler(irq, irq->arg); |
194 | irq->handler(irq, irq->arg); |
| 188 | spinlock_unlock(&irq->lock); |
195 | spinlock_unlock(&irq->lock); |
| 189 | } else { |
196 | } else { |
| 190 | /* |
197 | /* |
| 191 | * Spurious interrupt. |
198 | * Spurious interrupt. |
| 192 | */ |
199 | */ |
| 193 | #ifdef CONFIG_DEBUG |
200 | #ifdef CONFIG_DEBUG |
| 194 | printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
201 | printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
| 195 | #endif |
202 | #endif |
| 196 | } |
203 | } |
| - | 204 | ||
| - | 205 | if (!ack) |
|
| 197 | trap_virtual_eoi(); |
206 | trap_virtual_eoi(); |
| 198 | } |
207 | } |
| 199 | 208 | ||
| 200 | void interrupt_init(void) |
209 | void interrupt_init(void) |
| 201 | { |
210 | { |
| 202 | int i; |
211 | int i; |