enum handler_return platform_irq(struct arm64_iframe_short *frame) { uint32_t iar = GICCPUREG(IAR); uint vector = iar & 0x3ff; // printf("platform_irq: spsr 0x%llx, pc 0x%llx, currthread %p, vector %d\n", frame->spsr, frame->elr, current_thread, vector); if (vector >= 0x3fe) { // spurious return INT_NO_RESCHEDULE; } THREAD_STATS_INC(interrupts); KEVLOG_IRQ_ENTER(vector); // deliver the interrupt enum handler_return ret; ret = INT_NO_RESCHEDULE; if (int_handler_table[vector].handler) ret = int_handler_table[vector].handler(int_handler_table[vector].arg); GICCPUREG(EOIR) = iar; // printf("platform_irq: exit %d\n", ret); KEVLOG_IRQ_EXIT(vector); if (ret != INT_NO_RESCHEDULE) thread_preempt(); return ret; }
void lk_scheduler(void) { static enum handler_return ret; mt_irq_ack(MT6575_GPT_IRQ_ID); DRV_WriteReg32( GPT_IRQACK_REG, 0x10); ret = timer_irq(0); if(ret == INT_RESCHEDULE) { thread_preempt(); } DRV_WriteReg32(GPT5_CON_REG, GPT_CLEAR); DRV_WriteReg32(GPT5_CON_REG, GPT_ENABLE|GPT_MODE4_ONE_SHOT); }
void microblaze_irq(void) { if (platform_irq_handler() == INT_RESCHEDULE) thread_preempt(); }