Changeset 973be64e in mainline for arch/mips32/src/interrupt.c
- Timestamp:
- 2005-12-10T00:19:57Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fcfac420
- Parents:
- 705b4149
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/mips32/src/interrupt.c
r705b4149 r973be64e 27 27 */ 28 28 29 #include <interrupt.h> 29 30 #include <arch/interrupt.h> 30 31 #include <arch/types.h> … … 36 37 #include <symtab.h> 37 38 #include <arch/drivers/arc.h> 38 #include <arch/drivers/keyboard.h>39 39 40 40 static void print_regdump(struct exception_regdump *pstate) … … 94 94 } 95 95 96 static void unhandled_exception(int n, void *stack) 97 { 98 struct exception_regdump *pstate = (struct exception_regdump *)stack; 99 100 print_regdump(pstate); 101 panic("unhandled interrupt %d\n", n); 102 } 103 104 static void timer_exception(int n, void *stack) 105 { 106 cp0_compare_write(cp0_count_read() + cp0_compare_value); 107 clock(); 108 } 109 110 static void swint0(int n, void *stack) 111 { 112 cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */ 113 } 114 115 static void swint1(int n, void *stack) 116 { 117 cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */ 118 } 119 120 /** Basic exception handler */ 96 121 void interrupt(struct exception_regdump *pstate) 97 122 { … … 102 127 cause = (cp0_cause_read() >> 8) &0xff; 103 128 104 for (i = 0; i < 8; i++) { 105 if (cause & (1 << i)) { 106 switch (i) { 107 case 0: /* SW0 - Software interrupt 0 */ 108 cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */ 109 break; 110 case 1: /* SW1 - Software interrupt 1 */ 111 cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */ 112 break; 113 case KEYBOARD_IRQ: 114 keyboard(); 115 break; 116 case 3: 117 case 4: /* IRQ2 */ 118 case 5: /* IRQ3 */ 119 case 6: /* IRQ4 */ 120 default: 121 print_regdump(pstate); 122 panic("unhandled interrupt %d\n", i); 123 break; 124 case TIMER_IRQ: 125 /* clear timer interrupt & set new */ 126 cp0_compare_write(cp0_count_read() + cp0_compare_value); 127 clock(); 128 keyboard_poll(); 129 break; 130 } 131 } 132 } 129 for (i = 0; i < 8; i++) 130 if (cause & (1 << i)) 131 exc_dispatch(i, (void *)pstate); 132 } 133 133 134 /* Initialize basic tables for exception dispatching */ 135 void interrupt_init(void) 136 { 137 int i; 138 139 for (i=0;i < IVT_ITEMS; i++) 140 exc_register(i, "undef", unhandled_exception); 141 142 exc_register(TIMER_IRQ, "timer", timer_exception); 143 exc_register(0, "swint0", swint0); 144 exc_register(1, "swint1", swint1); 134 145 }
Note:
See TracChangeset
for help on using the changeset viewer.