| /* |
| * Low level interrupt handler for the SGI O2 aka IP32 aka Moosehead |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Copyright (C) 2000 Harald Koerfgen |
| * Copyright (C) 2001 Keith M Wesolowski |
| */ |
| #include <asm/asm.h> |
| #include <asm/regdef.h> |
| #include <asm/mipsregs.h> |
| #include <asm/stackframe.h> |
| #include <asm/addrspace.h> |
| |
| .text |
| .set noreorder |
| .set noat |
| .align 5 |
| NESTED(ip32_handle_int, PT_SIZE, ra) |
| .set noat |
| SAVE_ALL |
| CLI # TEST: interrupts should be off |
| .set at |
| .set noreorder |
| |
| mfc0 s0,CP0_CAUSE |
| |
| andi t1, s0, IE_IRQ0 |
| bnez t1, handle_irq0 |
| andi t1, s0, IE_IRQ1 |
| bnez t1, handle_irq1 |
| andi t1, s0, IE_IRQ2 |
| bnez t1, handle_irq2 |
| andi t1, s0, IE_IRQ3 |
| bnez t1, handle_irq3 |
| andi t1, s0, IE_IRQ4 |
| bnez t1, handle_irq4 |
| andi t1, s0, IE_IRQ5 |
| bnez t1, handle_irq5 |
| nop |
| |
| /* Either someone has triggered the "software interrupts" |
| * or we lost an interrupt somehow. Ignore it. |
| */ |
| j ret_from_irq |
| nop |
| |
| handle_irq0: |
| jal ip32_irq0 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| handle_irq1: |
| jal ip32_irq1 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| handle_irq2: |
| jal ip32_irq2 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| handle_irq3: |
| jal ip32_irq3 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| handle_irq4: |
| jal ip32_irq4 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| handle_irq5: |
| jal ip32_irq5 |
| move a0, sp |
| j ret_from_irq |
| nop |
| |
| END(ip32_handle_int) |