/* * COPYRIGHT (c) 1998 by Radstone Technology * * * THIS FILE IS PROVIDED TO YOU, THE USER, "AS IS", WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK * AS TO THE QUALITY AND PERFORMANCE OF ALL CODE IN THIS FILE IS WITH YOU. * * You are hereby granted permission to use, copy, modify, and distribute * this file, provided that this notice, plus the above copyright notice * and disclaimer, appears in all copies. Radstone Technology will provide * no support for this code. * */ /* genpvec.c * * These routines handle the external exception. Multiple ISRs occur off * of this one interrupt. * * COPYRIGHT (c) 1989-1997. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may in * the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ */ #include #include #include /* * Proto types for this file */ rtems_isr external_exception_ISR ( rtems_vector_number vector /* IN */ ); #define NUM_LIRQ_HANDLERS 20 #define NUM_LIRQ ( MAX_BOARD_IRQS - PPC_IRQ_LAST ) /* * Current 8259 masks */ uint8_t ucMaster8259Mask; uint8_t ucSlave8259Mask; /* * Structure to for one of possible multiple interrupt handlers for * a given interrupt. */ typedef struct { Chain_Node Node; rtems_isr_entry handler; /* isr routine */ rtems_vector_number vector; /* vector number */ } EE_ISR_Type; /* Note: The following will not work if we add a method to remove * handlers at a later time. */ EE_ISR_Type ISR_Nodes [NUM_LIRQ_HANDLERS]; uint16_t Nodes_Used; Chain_Control ISR_Array [NUM_LIRQ]; void initialize_external_exception_vector() { rtems_isr_entry previous_isr; rtems_status_code status; int i; Nodes_Used = 0; for (i=0; i handler)( node->vector ); node = (EE_ISR_Type *)node->Node.next; } /* * Dismiss the interrupt */ if(index&8) { /* * Dismiss the interrupt in Slave first as it * is cascaded */ outport_byte(ISA8259_S_CTRL, NONSPECIFIC_EOI); } /* * Dismiss the interrupt in Master */ outport_byte(ISA8259_M_CTRL, NONSPECIFIC_EOI); } void Dis_Ext_Interrupt(int level) { ISR_Level Irql; level-=PPCN_60X_8259_IRQ_BASE; if(level==2) { /* * Level 2 is for cascade and must not be fiddled with */ return; } /* * Ensure that accesses to the mask are indivisible */ _ISR_Disable(Irql); if(level<8) { /* * Interrupt is handled by Master */ ucMaster8259Mask|=1<