Subversion Repositories HelenOS

Rev

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;