/** DONT_TRANSLATE */ void resetTimer(void) { timer->tisr = TISR_OVF_FLAG; ackInterrupt(GPT9_IRQ); }
/** DONT_TRANSLATE */ void resetTimer(void) { timer->tisr = TISR_OVF_FLAG; ackInterrupt(DMTIMER0_IRQ); }
void handleInterrupt(irq_t irq) { if (unlikely(irq > maxIRQ)) { /* mask, ack and pretend it didn't happen. We assume that because * the interrupt controller for the platform returned this IRQ that * it is safe to use in mask and ack operations, even though it is * above the claimed maxIRQ. i.e. we're assuming maxIRQ is wrong */ printf("Received IRQ %d, which is above the platforms maxIRQ of %d\n", (int)irq, (int)maxIRQ); maskInterrupt(true, irq); ackInterrupt(irq); return; } switch (intStateIRQTable[irq]) { case IRQSignal: { cap_t cap; cap = intStateIRQNode[irq].cap; if (cap_get_capType(cap) == cap_notification_cap && cap_notification_cap_get_capNtfnCanSend(cap)) { sendSignal(NTFN_PTR(cap_notification_cap_get_capNtfnPtr(cap)), cap_notification_cap_get_capNtfnBadge(cap)); } else { #ifdef CONFIG_IRQ_REPORTING printf("Undelivered IRQ: %d\n", (int)irq); #endif } maskInterrupt(true, irq); break; } case IRQTimer: timerTick(); resetTimer(); break; case IRQReserved: #ifdef CONFIG_IRQ_REPORTING printf("Received reserved IRQ: %d", (int)irq); #endif handleReservedIRQ(irq); break; case IRQInactive: /* * This case shouldn't happen anyway unless the hardware or * platform code is broken. Hopefully masking it again should make * the interrupt go away. */ maskInterrupt(true, irq); #ifdef CONFIG_IRQ_REPORTING printf("Received disabled IRQ: %d\n", (int)irq); #endif break; default: /* No corresponding haskell error */ fail("Invalid IRQ state"); } ackInterrupt(irq); }