Rev 3386 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3386 | Rev 4153 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <arch/cp0.h> |
39 | #include <arch/cp0.h> |
40 | #include <arch/types.h> |
40 | #include <arch/types.h> |
41 | #include <arch.h> |
41 | #include <arch.h> |
42 | #include <debug.h> |
42 | #include <debug.h> |
43 | #include <proc/thread.h> |
43 | #include <proc/thread.h> |
44 | #include <symtab.h> |
- | |
45 | #include <print.h> |
44 | #include <print.h> |
46 | #include <interrupt.h> |
45 | #include <interrupt.h> |
47 | #include <func.h> |
46 | #include <func.h> |
48 | #include <console/kconsole.h> |
- | |
49 | #include <ddi/irq.h> |
47 | #include <ddi/irq.h> |
50 | #include <arch/debugger.h> |
48 | #include <arch/debugger.h> |
- | 49 | #include <symtab.h> |
|
51 | 50 | ||
52 | static char * exctable[] = { |
51 | static char * exctable[] = { |
53 | "Interrupt", |
52 | "Interrupt", |
54 | "TLB Modified", |
53 | "TLB Modified", |
55 | "TLB Invalid", |
54 | "TLB Invalid", |
Line 72... | Line 71... | ||
72 | "Virtual Coherency - data", |
71 | "Virtual Coherency - data", |
73 | }; |
72 | }; |
74 | 73 | ||
75 | static void print_regdump(istate_t *istate) |
74 | static void print_regdump(istate_t *istate) |
76 | { |
75 | { |
77 | char *pcsymbol = ""; |
76 | char *pcsymbol, *rasymbol; |
78 | char *rasymbol = ""; |
- | |
79 | 77 | ||
80 | char *s = get_symtab_entry(istate->epc); |
78 | pcsymbol = symtab_fmt_name_lookup(istate->epc); |
81 | if (s) |
- | |
82 | pcsymbol = s; |
- | |
83 | s = get_symtab_entry(istate->ra); |
79 | rasymbol = symtab_fmt_name_lookup(istate->ra); |
84 | if (s) |
- | |
85 | rasymbol = s; |
- | |
86 | 80 | ||
87 | printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc, pcsymbol, istate->ra, rasymbol, istate->sp); |
81 | printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc, pcsymbol, |
- | 82 | istate->ra, rasymbol, istate->sp); |
|
88 | } |
83 | } |
89 | 84 | ||
90 | static void unhandled_exception(int n, istate_t *istate) |
85 | static void unhandled_exception(int n, istate_t *istate) |
91 | { |
86 | { |
92 | fault_if_from_uspace(istate, "unhandled exception %s", exctable[n]); |
87 | fault_if_from_uspace(istate, "Unhandled exception %s.", exctable[n]); |
93 | 88 | ||
94 | print_regdump(istate); |
89 | print_regdump(istate); |
95 | panic("unhandled exception %s\n", exctable[n]); |
90 | panic("Unhandled exception %s.", exctable[n]); |
96 | } |
91 | } |
97 | 92 | ||
98 | static void reserved_instr_exception(int n, istate_t *istate) |
93 | static void reserved_instr_exception(int n, istate_t *istate) |
99 | { |
94 | { |
100 | if (*((uint32_t *)istate->epc) == 0x7c03e83b) { |
95 | if (*((uint32_t *)istate->epc) == 0x7c03e83b) { |
Line 131... | Line 126... | ||
131 | static void cpuns_exception(int n, istate_t *istate) |
126 | static void cpuns_exception(int n, istate_t *istate) |
132 | { |
127 | { |
133 | if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id) |
128 | if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id) |
134 | scheduler_fpu_lazy_request(); |
129 | scheduler_fpu_lazy_request(); |
135 | else { |
130 | else { |
136 | fault_if_from_uspace(istate, "unhandled Coprocessor Unusable Exception"); |
131 | fault_if_from_uspace(istate, "Unhandled Coprocessor Unusable Exception."); |
137 | panic("unhandled Coprocessor Unusable Exception\n"); |
132 | panic("Unhandled Coprocessor Unusable Exception."); |
138 | } |
133 | } |
139 | } |
134 | } |
140 | #endif |
135 | #endif |
141 | 136 | ||
142 | static void interrupt_exception(int n, istate_t *istate) |
137 | static void interrupt_exception(int n, istate_t *istate) |
143 | { |
138 | { |
144 | uint32_t cause; |
139 | uint32_t cause; |
145 | int i; |
140 | int i; |
146 | 141 | ||
147 | /* decode interrupt number and process the interrupt */ |
142 | /* decode interrupt number and process the interrupt */ |
148 | cause = (cp0_cause_read() >> 8) &0xff; |
143 | cause = (cp0_cause_read() >> 8) & 0xff; |
149 | 144 | ||
150 | for (i = 0; i < 8; i++) { |
145 | for (i = 0; i < 8; i++) { |
151 | if (cause & (1 << i)) { |
146 | if (cause & (1 << i)) { |
152 | irq_t *irq = irq_dispatch_and_lock(i); |
147 | irq_t *irq = irq_dispatch_and_lock(i); |
153 | if (irq) { |
148 | if (irq) { |
154 | /* |
149 | /* |
155 | * The IRQ handler was found. |
150 | * The IRQ handler was found. |
156 | */ |
151 | */ |
157 | irq->handler(irq, irq->arg); |
152 | irq->handler(irq); |
158 | spinlock_unlock(&irq->lock); |
153 | spinlock_unlock(&irq->lock); |
159 | } else { |
154 | } else { |
160 | /* |
155 | /* |
161 | * Spurious interrupt. |
156 | * Spurious interrupt. |
162 | */ |
157 | */ |
163 | #ifdef CONFIG_DEBUG |
158 | #ifdef CONFIG_DEBUG |
164 | printf("cpu%u: spurious interrupt (inum=%d)\n", CPU->id, i); |
159 | printf("cpu%u: spurious interrupt (inum=%d)\n", |
- | 160 | CPU->id, i); |
|
165 | #endif |
161 | #endif |
166 | } |
162 | } |
167 | } |
163 | } |
168 | } |
164 | } |
169 | } |
165 | } |
170 | 166 | ||
171 | /** Handle syscall userspace call */ |
167 | /** Handle syscall userspace call */ |
172 | static void syscall_exception(int n, istate_t *istate) |
168 | static void syscall_exception(int n, istate_t *istate) |
173 | { |
169 | { |
174 | panic("Syscall is handled through shortcut"); |
170 | panic("Syscall is handled through shortcut."); |
175 | } |
171 | } |
176 | 172 | ||
177 | void exception_init(void) |
173 | void exception_init(void) |
178 | { |
174 | { |
179 | int i; |
175 | int i; |