Rev 2292 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2292 | Rev 2307 | ||
|---|---|---|---|
| Line 154... | Line 154... | ||
| 154 | static void irq_interrupt(int n, istate_t *istate) |
154 | static void irq_interrupt(int n, istate_t *istate) |
| 155 | { |
155 | { |
| 156 | ASSERT(n >= IVT_IRQBASE); |
156 | ASSERT(n >= IVT_IRQBASE); |
| 157 | 157 | ||
| 158 | int inum = n - IVT_IRQBASE; |
158 | int inum = n - IVT_IRQBASE; |
| - | 159 | bool ack = false; |
|
| 159 | ASSERT(inum < IRQ_COUNT); |
160 | ASSERT(inum < IRQ_COUNT); |
| 160 | ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
161 | ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
| 161 | 162 | ||
| 162 | irq_t *irq = irq_dispatch_and_lock(inum); |
163 | irq_t *irq = irq_dispatch_and_lock(inum); |
| 163 | if (irq) { |
164 | if (irq) { |
| 164 | /* |
165 | /* |
| 165 | * The IRQ handler was found. |
166 | * The IRQ handler was found. |
| 166 | */ |
167 | */ |
| - | 168 | ||
| - | 169 | if (irq->preack) { |
|
| - | 170 | /* Send EOI before processing the interrupt */ |
|
| - | 171 | trap_virtual_eoi(); |
|
| - | 172 | ack = true; |
|
| - | 173 | } |
|
| 167 | irq->handler(irq, irq->arg); |
174 | irq->handler(irq, irq->arg); |
| 168 | spinlock_unlock(&irq->lock); |
175 | spinlock_unlock(&irq->lock); |
| 169 | } else { |
176 | } else { |
| 170 | /* |
177 | /* |
| 171 | * Spurious interrupt. |
178 | * Spurious interrupt. |
| 172 | */ |
179 | */ |
| 173 | #ifdef CONFIG_DEBUG |
180 | #ifdef CONFIG_DEBUG |
| 174 | printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
181 | printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
| 175 | #endif |
182 | #endif |
| 176 | } |
183 | } |
| - | 184 | ||
| - | 185 | if (!ack) |
|
| 177 | trap_virtual_eoi(); |
186 | trap_virtual_eoi(); |
| 178 | } |
187 | } |
| 179 | 188 | ||
| 180 | void interrupt_init(void) |
189 | void interrupt_init(void) |
| 181 | { |
190 | { |
| 182 | int i; |
191 | int i; |