Rev 575 | Rev 610 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 575 | Rev 590 | ||
|---|---|---|---|
| Line 30... | Line 30... | ||
| 30 | #include <arch/interrupt.h> |
30 | #include <arch/interrupt.h> |
| 31 | #include <arch/types.h> |
31 | #include <arch/types.h> |
| 32 | #include <arch.h> |
32 | #include <arch.h> |
| 33 | #include <arch/cp0.h> |
33 | #include <arch/cp0.h> |
| 34 | #include <time/clock.h> |
34 | #include <time/clock.h> |
| 35 | #include <panic.h> |
- | |
| 36 | #include <print.h> |
- | |
| 37 | #include <symtab.h> |
- | |
| 38 | #include <arch/drivers/arc.h> |
35 | #include <arch/drivers/arc.h> |
| 39 | 36 | ||
| 40 | static void print_regdump(struct exception_regdump *pstate) |
- | |
| 41 | { |
- | |
| 42 | char *pcsymbol = ""; |
- | |
| 43 | char *rasymbol = ""; |
- | |
| 44 | - | ||
| 45 | char *s = get_symtab_entry(pstate->epc); |
- | |
| 46 | if (s) |
- | |
| 47 | pcsymbol = s; |
- | |
| 48 | s = get_symtab_entry(pstate->ra); |
- | |
| 49 | if (s) |
- | |
| 50 | rasymbol = s; |
- | |
| 51 | - | ||
| 52 | printf("PC: %X(%s) RA: %X(%s)\n",pstate->epc,pcsymbol, |
- | |
| 53 | pstate->ra,rasymbol); |
- | |
| 54 | } |
- | |
| 55 | - | ||
| 56 | /** Disable interrupts. |
37 | /** Disable interrupts. |
| 57 | * |
38 | * |
| 58 | * @return Old interrupt priority level. |
39 | * @return Old interrupt priority level. |
| 59 | */ |
40 | */ |
| 60 | ipl_t interrupts_disable(void) |
41 | ipl_t interrupts_disable(void) |
| Line 91... | Line 72... | ||
| 91 | ipl_t interrupts_read(void) |
72 | ipl_t interrupts_read(void) |
| 92 | { |
73 | { |
| 93 | return cp0_status_read(); |
74 | return cp0_status_read(); |
| 94 | } |
75 | } |
| 95 | 76 | ||
| 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) |
77 | static void timer_exception(int n, void *stack) |
| 105 | { |
78 | { |
| 106 | cp0_compare_write(cp0_count_read() + cp0_compare_value); |
79 | cp0_compare_write(cp0_count_read() + cp0_compare_value); |
| 107 | clock(); |
80 | clock(); |
| 108 | } |
81 | } |
| Line 115... | Line 88... | ||
| 115 | static void swint1(int n, void *stack) |
88 | static void swint1(int n, void *stack) |
| 116 | { |
89 | { |
| 117 | cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */ |
90 | cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */ |
| 118 | } |
91 | } |
| 119 | 92 | ||
| 120 | /** Basic exception handler */ |
- | |
| 121 | void interrupt(struct exception_regdump *pstate) |
- | |
| 122 | { |
- | |
| 123 | __u32 cause; |
- | |
| 124 | int i; |
- | |
| 125 | - | ||
| 126 | /* decode interrupt number and process the interrupt */ |
- | |
| 127 | cause = (cp0_cause_read() >> 8) &0xff; |
- | |
| 128 | - | ||
| 129 | for (i = 0; i < 8; i++) |
- | |
| 130 | if (cause & (1 << i)) |
- | |
| 131 | exc_dispatch(i, (void *)pstate); |
- | |
| 132 | } |
- | |
| 133 | - | ||
| 134 | /* Initialize basic tables for exception dispatching */ |
93 | /* Initialize basic tables for exception dispatching */ |
| 135 | void interrupt_init(void) |
94 | void interrupt_init(void) |
| 136 | { |
95 | { |
| 137 | int i; |
96 | int i; |
| 138 | 97 | ||
| 139 | for (i=0;i < IVT_ITEMS; i++) |
- | |
| 140 | exc_register(i, "undef", unhandled_exception); |
- | |
| 141 | - | ||
| 142 | exc_register(TIMER_IRQ, "timer", timer_exception); |
98 | int_register(TIMER_IRQ, "timer", timer_exception); |
| 143 | exc_register(0, "swint0", swint0); |
99 | int_register(0, "swint0", swint0); |
| 144 | exc_register(1, "swint1", swint1); |
100 | int_register(1, "swint1", swint1); |
| 145 | } |
101 | } |