Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 123 → Rev 124

/SPARTAN/trunk/arch/mips/include/exception.h
30,7 → 30,7
#define __EXCEPTION_H__
 
#define EXC_Int 0
#define EXC_MOD 1
#define EXC_Mod 1
#define EXC_TLBL 2
#define EXC_TLBS 3
#define EXC_AdEL 4
/SPARTAN/trunk/arch/mips/src/asm.s
67,6 → 67,7
.global cp0_status_read
.global cp0_status_write
.global cp0_cause_read
.global cp0_cause_write
.global cp0_epc_read
.global cp0_epc_write
.global cp0_prid_read
106,6 → 107,7
cp0_status_write: cp0_write $12
 
cp0_cause_read: cp0_read $13
cp0_cause_write: cp0_write $13
 
cp0_epc_read: cp0_read $14
cp0_epc_write: cp0_write $14
/SPARTAN/trunk/arch/mips/src/interrupt.c
61,30 → 61,35
void interrupt(void)
{
__u32 cause;
int i;
 
int i;
/* decode interrupt number and process the interrupt */
cause = (cp0_cause_read()>>8)&0xff;
 
for (i=0; i<8; i++) {
if (cause & (1<<i)) {
switch (i) {
case 0x0:
case 0x1:
case 0x2:
case 0x3:
case 0x4:
case 0x5:
case 0x6: panic("unhandled interrupt %d\n", i); break;
case 0x7:
/* clear timer interrupt */
cp0_compare_write(cp0_compare_value);
cause = (cp0_cause_read() >> 8) &0xff;
for (i = 0; i < 8; i++) {
if (cause & (1 << i)) {
switch (i) {
case 0: /* SW0 - Software interrupt 0 */
cp0_cause_write(cause & ~(1 << 8)); /* clear SW0 interrupt */
break;
case 1: /* SW1 - Software interrupt 1 */
cp0_cause_write(cause & ~(1 << 9)); /* clear SW1 interrupt */
break;
case 2: /* IRQ0 */
case 3: /* IRQ1 */
case 4: /* IRQ2 */
case 5: /* IRQ3 */
case 6: /* IRQ4 */
panic("unhandled interrupt %d\n", i);
break;
case 7: /* Timer Interrupt */
cp0_compare_write(cp0_compare_value); /* clear timer interrupt */
/* start counting over again */
cp0_count_write(0);
clock();
break;
}
}
}
cp0_count_write(0);
clock();
break;
}
}
}
 
}