/* * High level IRQ handler called from shared_raw_irq_code_entry */ int C_dispatch_irq_handler( BSP_Exception_frame *frame, unsigned int excNum ) { register unsigned int irq; #if (HAS_PMC_PSC8) uint16_t check_irq; uint16_t status_word; #endif if (excNum == ASM_DEC_VECTOR) { bsp_irq_dispatch_list(rtems_hdl_tbl, BSP_DECREMENTER, dflt_entry.hdl); return 0; } irq = read_and_clear_irq(); #if (HAS_PMC_PSC8) if (irq == SCORE603E_PCI_IRQ_0) { status_word = read_and_clear_PMC_irq( irq ); for (check_irq=SCORE603E_IRQ16; check_irq<=SCORE603E_IRQ19; check_irq++) { if ( Is_PMC_IRQ( check_irq, status_word )) { bsp_irq_dispatch_list_base(rtems_hdl_tbl, check_irq, dflt_entry.hdl); } } } else #endif { bsp_irq_dispatch_list_base(rtems_hdl_tbl, irq, dflt_entry.hdl); } return 0; }
/* * This interrupt service routine is called for an External Exception. */ rtems_isr external_exception_ISR ( rtems_vector_number vector /* IN */ ) { uint16_t index; EE_ISR_Type *node; uint16_t value; #if (HAS_PMC_PSC8) uint16_t PMC_irq; uint16_t check_irq; uint16_t status_word; #endif index = read_and_clear_irq(); if ( index >= NUM_LIRQ ) { printk( "ERROR:: Invalid interrupt number (%02x)\n", index ); return; } #if (HAS_PMC_PSC8) PMC_irq = SCORE603E_PCI_IRQ_0 - SCORE603E_IRQ00; if (index == PMC_irq) { status_word = read_and_clear_PMC_irq( index ); for (check_irq=SCORE603E_IRQ16; check_irq<=SCORE603E_IRQ19; check_irq++) { if ( Is_PMC_IRQ( check_irq, status_word )) { index = check_irq - SCORE603E_IRQ00; node = (EE_ISR_Type *)(ISR_Array[ index ].first); if ( rtems_chain_is_tail( &ISR_Array[ index ], (void *)node ) ) { printk ("ERROR:: check %d interrupt %02d has no isr\n", check_irq, index); value = get_irq_mask(); printk(" Mask = %02x\n", value); } while ( !rtems_chain_is_tail( &ISR_Array[ index ], (void *)node ) ) { (*node->handler)( node->vector ); node = (EE_ISR_Type *) node->Node.next; } } } } else #endif { node = (EE_ISR_Type *)(ISR_Array[ index ].first); if ( rtems_chain_is_tail( &ISR_Array[ index ], (void *)node ) ) { printk( "ERROR:: interrupt %02x has no isr\n", index); value = get_irq_mask(); printk(" Mask = %02x\n", value); return; } while ( !rtems_chain_is_tail( &ISR_Array[ index ], (void *)node ) ) { (*node->handler)( node->vector ); node = (EE_ISR_Type *) node->Node.next; } } }
/* * High level IRQ handler called from shared_raw_irq_code_entry */ int C_dispatch_irq_handler (CPU_Interrupt_frame *frame, unsigned int excNum) { register unsigned int irq; register unsigned msr; register unsigned new_msr; if (excNum == ASM_DEC_VECTOR) { _CPU_MSR_GET(msr); new_msr = msr | MSR_EE; _CPU_MSR_SET(new_msr); rtems_hdl_tbl[BSP_DECREMENTER].hdl(rtems_hdl_tbl[BSP_DECREMENTER].handle); _CPU_MSR_SET(msr); return 0; } irq = read_and_clear_irq(); _CPU_MSR_GET(msr); new_msr = msr | MSR_EE; _CPU_MSR_SET(new_msr); /* rtems_hdl_tbl[irq].hdl(rtems_hdl_tbl[irq].handle); */ { rtems_irq_connect_data* vchain; for( vchain = &rtems_hdl_tbl[irq]; ((int)vchain != -1 && vchain->hdl != default_rtems_entry.hdl); vchain = (rtems_irq_connect_data*)vchain->next_handler ) { vchain->hdl(vchain->handle); } } _CPU_MSR_SET(msr); return 0; }