/* * FILE NAME * arch/mips/vr41xx/common/int-handler.S * * BRIEF MODULE DESCRIPTION * Interrupt dispatcher for the NEC VR4100 series. * * Author: Yoichi Yuasa * yyuasa@mvista.com or source@mvista.com * * Copyright 2001 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Changes: * MontaVista Software Inc. or * - New creation, NEC VR4100 series are supported. * * Yoichi Yuasa * - Coped with INTASSIGN of NEC VR4133. */ #include #include #include #include .text .set noreorder .align 5 NESTED(vr41xx_handle_interrupt, PT_SIZE, ra) .set noat SAVE_ALL CLI .set at .set noreorder /* * Get the pending interrupts */ mfc0 t0, CP0_CAUSE mfc0 t1, CP0_STATUS andi t0, 0xff00 and t0, t0, t1 andi t1, t0, CAUSEF_IP7 # MIPS timer interrupt bnez t1, handle_irq li a0, 7 andi t1, t0, 0x7800 # check for Int1-4 beqz t1, 1f andi t1, t0, CAUSEF_IP3 # check for Int1 bnez t1, handle_int li a0, 1 andi t1, t0, CAUSEF_IP4 # check for Int2 bnez t1, handle_int li a0, 2 andi t1, t0, CAUSEF_IP5 # check for Int3 bnez t1, handle_int li a0, 3 andi t1, t0, CAUSEF_IP6 # check for Int4 bnez t1, handle_int li a0, 4 1: andi t1, t0, CAUSEF_IP2 # check for Int0 bnez t1, handle_int li a0, 0 andi t1, t0, CAUSEF_IP0 # check for IP0 bnez t1, handle_irq li a0, 0 andi t1, t0, CAUSEF_IP1 # check for IP1 bnez t1, handle_irq li a0, 1 j spurious_interrupt nop handle_int: jal irq_dispatch move a1, sp j ret_from_irq nop handle_irq: jal do_IRQ move a1, sp j ret_from_irq END(vr41xx_handle_interrupt)