import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / mips / lasat / lasatIRQ.S
1 /*
2  * Carsten Langgaard, carstenl@mips.com
3  * Copyright (C) 1999, 2000 MIPS Technologies, Inc.  All rights reserved.
4  *
5  * ########################################################################
6  *
7  *  This program is free software; you can distribute it and/or modify it
8  *  under the terms of the GNU General Public License (Version 2) as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope it will be useful, but WITHOUT
12  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  *  for more details.
15  *
16  *  You should have received a copy of the GNU General Public License along
17  *  with this program; if not, write to the Free Software Foundation, Inc.,
18  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
19  *
20  * ########################################################################
21  *
22  * Interrupt exception dispatch code.
23  *
24  */
25 #include <linux/config.h>
26
27 #include <asm/asm.h>
28 #include <asm/mipsregs.h>
29 #include <asm/regdef.h>
30 #include <asm/stackframe.h>
31
32         .text
33         .set    noreorder
34         .set    noat
35         .align  5
36         NESTED(mipsIRQ, PT_SIZE, sp)
37         SAVE_ALL
38         CLI
39         .set    at
40
41         mfc0    s0, CP0_CAUSE           # get irq mask
42
43         /* First we check for r4k counter/timer IRQ. */
44         andi    a0, s0, CAUSEF_IP7
45         beq     a0, zero, 1f
46          andi   a0, s0, CAUSEF_IP2      # delay slot, check hw0 interrupt
47
48         /* Wheee, a timer interrupt. */
49         move    a0, sp
50         jal     lasat_timer_interrupt
51          nop
52
53         j       ret_from_irq
54          nop
55
56 1:
57         /* Wheee, combined hardware level zero interrupt. */
58         jal     lasat_hw0_irqdispatch
59          move   a0, sp                  # delay slot
60
61         j       ret_from_irq
62          nop                            # delay slot
63
64 1:
65         /*
66          * Here by mistake?  This is possible, what can happen is that by the
67          * time we take the exception the IRQ pin goes low, so just leave if
68          * this is the case.
69          */
70         move    a1,s0
71         mfc0    a1, CP0_EPC
72
73         j       ret_from_irq
74          nop
75         END(mipsIRQ)