예제 #1
0
파일: interrupts.c 프로젝트: cpizano/lk
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;
}
예제 #2
0
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);
}
예제 #3
0
파일: exceptions.c 프로젝트: 0xBADCA7/lk
void microblaze_irq(void)
{
    if (platform_irq_handler() == INT_RESCHEDULE)
        thread_preempt();
}