Rev 2071 | Rev 3626 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2608 | ||
|---|---|---|---|
| Line 124... | Line 124... | ||
| 124 | char *vector_to_string(uint16_t vector) |
124 | char *vector_to_string(uint16_t vector) |
| 125 | { |
125 | { |
| 126 | ASSERT(vector <= VECTOR_MAX); |
126 | ASSERT(vector <= VECTOR_MAX); |
| 127 | 127 | ||
| 128 | if (vector >= VECTORS_16_BUNDLE_START) |
128 | if (vector >= VECTORS_16_BUNDLE_START) |
| - | 129 | return vector_names_16_bundle[(vector - |
|
| 129 | return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)]; |
130 | VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)]; |
| 130 | else |
131 | else |
| 131 | return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)]; |
132 | return vector_names_64_bundle[vector / (64 * BUNDLE_SIZE)]; |
| 132 | } |
133 | } |
| 133 | 134 | ||
| 134 | void dump_interrupted_context(istate_t *istate) |
135 | void dump_interrupted_context(istate_t *istate) |
| 135 | { |
136 | { |
| 136 | char *ifa, *iipa, *iip; |
137 | char *ifa, *iipa, *iip; |
| Line 139... | Line 140... | ||
| 139 | iipa = get_symtab_entry(istate->cr_iipa); |
140 | iipa = get_symtab_entry(istate->cr_iipa); |
| 140 | iip = get_symtab_entry(istate->cr_iip); |
141 | iip = get_symtab_entry(istate->cr_iip); |
| 141 | 142 | ||
| 142 | putchar('\n'); |
143 | putchar('\n'); |
| 143 | printf("Interrupted context dump:\n"); |
144 | printf("Interrupted context dump:\n"); |
| 144 | printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore); |
145 | printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, |
| - | 146 | istate->ar_bspstore); |
|
| 145 | printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc); |
147 | printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, |
| - | 148 | istate->ar_rsc); |
|
| 146 | printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs); |
149 | printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, |
| - | 150 | istate->ar_pfs); |
|
| 147 | printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr); |
151 | printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, |
| - | 152 | istate->cr_ipsr); |
|
| 148 | 153 | ||
| 149 | printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip); |
154 | printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, |
| - | 155 | istate->cr_isr.ei, iip); |
|
| 150 | printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa); |
156 | printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa); |
| 151 | printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa); |
157 | printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa); |
| 152 | } |
158 | } |
| 153 | 159 | ||
| 154 | void general_exception(uint64_t vector, istate_t *istate) |
160 | void general_exception(uint64_t vector, istate_t *istate) |
| Line 188... | Line 194... | ||
| 188 | void disabled_fp_register(uint64_t vector, istate_t *istate) |
194 | void disabled_fp_register(uint64_t vector, istate_t *istate) |
| 189 | { |
195 | { |
| 190 | #ifdef CONFIG_FPU_LAZY |
196 | #ifdef CONFIG_FPU_LAZY |
| 191 | scheduler_fpu_lazy_request(); |
197 | scheduler_fpu_lazy_request(); |
| 192 | #else |
198 | #else |
| 193 | fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector)); |
199 | fault_if_from_uspace(istate, "Interruption: %#hx (%s)", |
| - | 200 | (uint16_t) vector, vector_to_string(vector)); |
|
| 194 | dump_interrupted_context(istate); |
201 | dump_interrupted_context(istate); |
| 195 | panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector)); |
202 | panic("Interruption: %#hx (%s)\n", (uint16_t) vector, |
| - | 203 | vector_to_string(vector)); |
|
| 196 | #endif |
204 | #endif |
| 197 | } |
205 | } |
| 198 | 206 | ||
| 199 | void nop_handler(uint64_t vector, istate_t *istate) |
207 | void nop_handler(uint64_t vector, istate_t *istate) |
| 200 | { |
208 | { |
| Line 211... | Line 219... | ||
| 211 | istate->cr_iip += 16; |
219 | istate->cr_iip += 16; |
| 212 | } else { |
220 | } else { |
| 213 | istate->cr_ipsr.ri++; |
221 | istate->cr_ipsr.ri++; |
| 214 | } |
222 | } |
| 215 | 223 | ||
| 216 | return syscall_handler(istate->in0, istate->in1, istate->in2, istate->in3, istate->in4); |
224 | return syscall_handler(istate->in0, istate->in1, istate->in2, |
| - | 225 | istate->in3, istate->in4, istate->in5, istate->in6); |
|
| 217 | } |
226 | } |
| 218 | 227 | ||
| 219 | void universal_handler(uint64_t vector, istate_t *istate) |
228 | void universal_handler(uint64_t vector, istate_t *istate) |
| 220 | { |
229 | { |
| 221 | fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector)); |
230 | fault_if_from_uspace(istate, "Interruption: %#hx (%s)\n", |
| - | 231 | (uint16_t) vector, vector_to_string(vector)); |
|
| 222 | dump_interrupted_context(istate); |
232 | dump_interrupted_context(istate); |
| 223 | panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector)); |
233 | panic("Interruption: %#hx (%s)\n", (uint16_t) vector, |
| - | 234 | vector_to_string(vector)); |
|
| 224 | } |
235 | } |
| 225 | 236 | ||
| 226 | void external_interrupt(uint64_t vector, istate_t *istate) |
237 | void external_interrupt(uint64_t vector, istate_t *istate) |
| 227 | { |
238 | { |
| 228 | irq_t *irq; |
239 | irq_t *irq; |
| Line 242... | Line 253... | ||
| 242 | printf("cpu%d: spurious interrupt\n", CPU->id); |
253 | printf("cpu%d: spurious interrupt\n", CPU->id); |
| 243 | #endif |
254 | #endif |
| 244 | break; |
255 | break; |
| 245 | 256 | ||
| 246 | default: |
257 | default: |
| 247 | panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector); |
258 | panic("\nUnhandled External Interrupt Vector %d\n", |
| - | 259 | ivr.vector); |
|
| 248 | break; |
260 | break; |
| 249 | } |
261 | } |
| 250 | } |
262 | } |
| 251 | } |
263 | } |
| 252 | 264 | ||