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 arm_cm_irq_exit(bool reschedule) { if (reschedule) arm_cm_trigger_preempt(); KEVLOG_IRQ_EXIT(__get_IPSR()); }
void arm_cm_irq_exit(bool reschedule) { if (reschedule) arm_cm_trigger_preempt(); KEVLOG_IRQ_EXIT(__get_IPSR()); __enable_irq(); // clear PRIMASK }
void arm_cm_irq_exit(bool reschedule) { target_set_debug_led(1, false); if (reschedule) arm_cm_trigger_preempt(); KEVLOG_IRQ_EXIT(__get_IPSR()); __enable_irq(); // clear PRIMASK }