version 1.2, 2004/12/29 04:46:13 |
version 1.3, 2005/01/05 04:53:50 |
Line 476 ep93xx_intr_dispatch(struct clockframe * |
|
Line 476 ep93xx_intr_dispatch(struct clockframe * |
|
u_int32_t vic1_hwpend; |
u_int32_t vic1_hwpend; |
u_int32_t vic2_hwpend; |
u_int32_t vic2_hwpend; |
int irq; |
int irq; |
u_int32_t ibit; |
|
|
|
pcpl = current_spl_level; |
pcpl = current_spl_level; |
|
|
Line 490 ep93xx_intr_dispatch(struct clockframe * |
|
Line 489 ep93xx_intr_dispatch(struct clockframe * |
|
vic1_hwpend &= ~vic1_imask[pcpl]; |
vic1_hwpend &= ~vic1_imask[pcpl]; |
vic2_hwpend &= ~vic2_imask[pcpl]; |
vic2_hwpend &= ~vic2_imask[pcpl]; |
|
|
while (vic1_hwpend) { |
if (vic1_hwpend) { |
irq = ffs(vic1_hwpend) - 1; |
irq = ffs(vic1_hwpend) - 1; |
ibit = (1U << irq); |
|
|
|
iq = &intrq[irq]; |
iq = &intrq[irq]; |
iq->iq_ev.ev_count++; |
iq->iq_ev.ev_count++; |
uvmexp.intrs++; |
uvmexp.intrs++; |
for (ih = TAILQ_FIRST(&iq->iq_list); ih != NULL; |
for (ih = TAILQ_FIRST(&iq->iq_list); ih != NULL; |
ih = TAILQ_NEXT(ih, ih_list)) { |
ih = TAILQ_NEXT(ih, ih_list)) { |
int ipl; |
current_spl_level = ih->ih_ipl; |
|
|
current_spl_level = ipl = ih->ih_ipl; |
|
oldirqstate = enable_interrupts(I32_bit); |
oldirqstate = enable_interrupts(I32_bit); |
(void) (*ih->ih_func)(ih->ih_arg ? ih->ih_arg : frame); |
(void) (*ih->ih_func)(ih->ih_arg ? ih->ih_arg : frame); |
restore_interrupts(oldirqstate); |
restore_interrupts(oldirqstate); |
vic1_hwpend &= ~ibit; |
|
} |
} |
} |
} else if (vic2_hwpend) { |
while (vic2_hwpend) { |
|
irq = ffs(vic2_hwpend) - 1; |
irq = ffs(vic2_hwpend) - 1; |
ibit = (1U << irq); |
|
|
|
iq = &intrq[irq + VIC_NIRQ]; |
iq = &intrq[irq + VIC_NIRQ]; |
iq->iq_ev.ev_count++; |
iq->iq_ev.ev_count++; |
uvmexp.intrs++; |
uvmexp.intrs++; |
for (ih = TAILQ_FIRST(&iq->iq_list); ih != NULL; |
for (ih = TAILQ_FIRST(&iq->iq_list); ih != NULL; |
ih = TAILQ_NEXT(ih, ih_list)) { |
ih = TAILQ_NEXT(ih, ih_list)) { |
int ipl; |
current_spl_level = ih->ih_ipl; |
|
|
current_spl_level = ipl = ih->ih_ipl; |
|
oldirqstate = enable_interrupts(I32_bit); |
oldirqstate = enable_interrupts(I32_bit); |
(void) (*ih->ih_func)(ih->ih_arg ? ih->ih_arg : frame); |
(void) (*ih->ih_func)(ih->ih_arg ? ih->ih_arg : frame); |
restore_interrupts(oldirqstate); |
restore_interrupts(oldirqstate); |
vic2_hwpend &= ~ibit; |
|
} |
} |
} |
} |
|
|