Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: arch.c Proyecto: dzc1234ok/lk
void arm_cm_irq_exit(bool reschedule)
{
	if (reschedule)
		arm_cm_trigger_preempt();

	KEVLOG_IRQ_EXIT(__get_IPSR());
}
Ejemplo n.º 3
0
Archivo: arch.c Proyecto: herhut-ggl/lk
void arm_cm_irq_exit(bool reschedule)
{
	if (reschedule)
		arm_cm_trigger_preempt();

	KEVLOG_IRQ_EXIT(__get_IPSR());

	__enable_irq(); // clear PRIMASK
}
Ejemplo n.º 4
0
Archivo: arch.c Proyecto: jbush001/lk
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
}