Rev 575 | Rev 958 | 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 | } |