/* | |
* int-handler.S | |
* | |
* Based on the cobalt handler. | |
*/ | |
#include <asm/asm.h> | |
#include <asm/mipsregs.h> | |
#include <asm/addrspace.h> | |
#include <asm/regdef.h> | |
#include <asm/stackframe.h> | |
/* | |
* galileo_handle_int - | |
* We check for the timer first, then check PCI ints A and D. | |
* Then check for serial IRQ and fall through. | |
*/ | |
.align 5 | |
.set reorder | |
.set noat | |
NESTED(galileo_handle_int, PT_SIZE, sp) | |
SAVE_ALL | |
CLI | |
.set at | |
mfc0 t0,CP0_CAUSE | |
mfc0 t2,CP0_STATUS | |
and t0,t2 | |
andi t1,t0,STATUSF_IP4 /* int2 hardware line (timer) */ | |
bnez t1,ll_gt64120_irq | |
andi t1,t0,STATUSF_IP2 /* int0 hardware line */ | |
bnez t1,ll_pci_intA | |
andi t1,t0,STATUSF_IP5 /* int3 hardware line */ | |
bnez t1,ll_pci_intD | |
andi t1,t0,STATUSF_IP6 /* int4 hardware line */ | |
bnez t1,ll_serial_irq | |
andi t1,t0,STATUSF_IP7 /* compare int */ | |
bnez t1,ll_compare_irq | |
nop | |
/* wrong alarm or masked ... */ | |
jal spurious_interrupt | |
nop | |
j ret_from_irq | |
END(galileo_handle_int) | |
.align 5 | |
.set reorder | |
ll_gt64120_irq: | |
li a0,4 | |
move a1,sp | |
jal do_IRQ | |
nop | |
j ret_from_irq | |
nop | |
.align 5 | |
.set reorder | |
ll_compare_irq: | |
li a0,7 | |
move a1,sp | |
jal do_IRQ | |
nop | |
j ret_from_irq | |
nop | |
.align 5 | |
.set reorder | |
ll_pci_intA: | |
move a0,sp | |
jal pci_intA | |
nop | |
j ret_from_irq | |
nop | |
#if 0 | |
.align 5 | |
.set reorder | |
ll_pci_intB: | |
move a0,sp | |
jal pci_intB | |
nop | |
j ret_from_irq | |
nop | |
.align 5 | |
.set reorder | |
ll_pci_intC: | |
move a0,sp | |
jal pci_intC | |
nop | |
j ret_from_irq | |
nop | |
#endif | |
.align 5 | |
.set reorder | |
ll_pci_intD: | |
move a0,sp | |
jal pci_intD | |
nop | |
j ret_from_irq | |
nop | |
.align 5 | |
.set reorder | |
ll_serial_irq: | |
li a0,6 | |
move a1,sp | |
jal do_IRQ | |
nop | |
j ret_from_irq | |
nop |