|
@@ -141,8 +141,8 @@ int interrupts_init (void)
|
|
|
|
|
|
void interrupt_handler (void)
|
|
|
{
|
|
|
- int irqs = (intc->isr & intc->ier); /* find active interrupt */
|
|
|
- int i = 1;
|
|
|
+ int irqs = intc->ivr; /* find active interrupt */
|
|
|
+ int mask = 1;
|
|
|
#ifdef DEBUG_INT
|
|
|
int value;
|
|
|
printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,
|
|
@@ -150,23 +150,17 @@ void interrupt_handler (void)
|
|
|
R14(value);
|
|
|
printf ("Interrupt handler on %x line, r14 %x\n", irqs, value);
|
|
|
#endif
|
|
|
- struct irq_action *act = vecs;
|
|
|
- while (irqs) {
|
|
|
- if (irqs & 1) {
|
|
|
+ struct irq_action *act = vecs + irqs;
|
|
|
+
|
|
|
+ intc->iar = mask << irqs;
|
|
|
+
|
|
|
#ifdef DEBUG_INT
|
|
|
- printf
|
|
|
- ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
|
|
|
- act->handler, act->count, act->arg);
|
|
|
+ printf
|
|
|
+ ("Jumping to interrupt handler rutine addr %x,count %x,arg %x\n",
|
|
|
+ act->handler, act->count, act->arg);
|
|
|
#endif
|
|
|
- act->handler (act->arg);
|
|
|
- act->count++;
|
|
|
- intc->iar = i;
|
|
|
- return;
|
|
|
- }
|
|
|
- irqs >>= 1;
|
|
|
- act++;
|
|
|
- i <<= 1;
|
|
|
- }
|
|
|
+ act->handler (act->arg);
|
|
|
+ act->count++;
|
|
|
|
|
|
#ifdef DEBUG_INT
|
|
|
printf ("Dump INTC reg, isr %x, ier %x, iar %x, mer %x\n", intc->isr,
|