Changeset 58775d30 in mainline for kernel/arch/ia64/src/interrupt.c
- Timestamp:
- 2015-03-16T16:07:21Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2003739
- Parents:
- 6069061 (diff), 795e2bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/interrupt.c
r6069061 r58775d30 54 54 #include <synch/spinlock.h> 55 55 #include <mm/tlb.h> 56 #include <arch/mm/tlb.h> 56 57 #include <symtab.h> 57 58 #include <putchar.h> … … 59 60 #define VECTORS_64_BUNDLE 20 60 61 #define VECTORS_16_BUNDLE 48 61 #define VECTORS_16_BUNDLE_START 0x5000 62 63 #define VECTOR_MAX 0x7f00 64 65 #define BUNDLE_SIZE 16 62 #define VECTORS_16_BUNDLE_START 0x50 63 64 #define VECTOR_MAX 0x7f 66 65 67 66 static const char *vector_names_64_bundle[VECTORS_64_BUNDLE] = { … … 122 121 }; 123 122 124 static const char *vector_to_string(uint16_t vector) 125 { 126 ASSERT(vector <= VECTOR_MAX); 127 128 if (vector >= VECTORS_16_BUNDLE_START) 129 return vector_names_16_bundle[(vector - 130 VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)]; 123 static const char *vector_to_string(unsigned int n) 124 { 125 ASSERT(n <= VECTOR_MAX); 126 127 if (n >= VECTORS_16_BUNDLE_START) 128 return vector_names_16_bundle[n - VECTORS_16_BUNDLE_START]; 131 129 else 132 return vector_names_64_bundle[ vector / (64 * BUNDLE_SIZE)];130 return vector_names_64_bundle[n / 4]; 133 131 } 134 132 … … 153 151 } 154 152 155 void general_exception(u int64_t vector, istate_t *istate)153 void general_exception(unsigned int n, istate_t *istate) 156 154 { 157 155 const char *desc; … … 182 180 183 181 fault_if_from_uspace(istate, "General Exception (%s).", desc); 184 panic_badtrap(istate, vector, "General Exception (%s).", desc);185 } 186 187 void disabled_fp_register(u int64_t vector, istate_t *istate)182 panic_badtrap(istate, n, "General Exception (%s).", desc); 183 } 184 185 void disabled_fp_register(unsigned int n, istate_t *istate) 188 186 { 189 187 #ifdef CONFIG_FPU_LAZY … … 191 189 #else 192 190 fault_if_from_uspace(istate, "Interruption: %#hx (%s).", 193 (uint16_t) vector, vector_to_string(vector));191 (uint16_t) n, vector_to_string(n)); 194 192 panic_badtrap(istate, vector, "Interruption: %#hx (%s).", 195 (uint16_t) vector, vector_to_string(vector));193 (uint16_t) n, vector_to_string(n)); 196 194 #endif 197 195 } 198 196 199 void nop_handler(uint64_t vector, istate_t *istate)200 {201 }202 203 197 /** Handle syscall. */ 204 int break_instruction(uint64_t vector, istate_t *istate) 205 { 198 sysarg_t break_instruction(unsigned int n, istate_t *istate) 199 { 200 sysarg_t ret; 201 206 202 /* 207 203 * Move to next instruction after BREAK. … … 214 210 } 215 211 216 return syscall_handler(istate->in0, istate->in1, istate->in2, 212 interrupts_enable(); 213 ret = syscall_handler(istate->in0, istate->in1, istate->in2, 217 214 istate->in3, istate->in4, istate->in5, istate->in6); 218 } 219 220 void universal_handler(uint64_t vector, istate_t *istate) 215 interrupts_disable(); 216 217 return ret; 218 } 219 220 void universal_handler(unsigned int n, istate_t *istate) 221 221 { 222 222 fault_if_from_uspace(istate, "Interruption: %#hx (%s).", 223 (uint16_t) vector, vector_to_string(vector));224 panic_badtrap(istate, vector, "Interruption: %#hx (%s).",225 (uint16_t) vector, vector_to_string(vector));223 n, vector_to_string(n)); 224 panic_badtrap(istate, n, "Interruption: %#hx (%s).", 225 n, vector_to_string(n)); 226 226 } 227 227 … … 229 229 { 230 230 asm volatile ( 231 "mov cr.eoi =r0;;"231 "mov cr.eoi = r0 ;;" 232 232 ); 233 233 } 234 234 235 void external_interrupt(u int64_t vector, istate_t *istate)235 void external_interrupt(unsigned int n, istate_t *istate) 236 236 { 237 237 cr_ivr_t ivr; … … 298 298 } 299 299 300 void exception_init(void) 301 { 302 unsigned int i; 303 304 for (i = 0; i < IVT_ITEMS; i++) 305 exc_register(i, "universal_handler", false, universal_handler); 306 307 exc_register(EXC_ALT_ITLB_FAULT, 308 vector_to_string(EXC_ALT_ITLB_FAULT), true, 309 alternate_instruction_tlb_fault); 310 exc_register(EXC_ALT_DTLB_FAULT, 311 vector_to_string(EXC_ALT_DTLB_FAULT), true, 312 alternate_data_tlb_fault); 313 exc_register(EXC_NESTED_TLB_FAULT, 314 vector_to_string(EXC_NESTED_TLB_FAULT), false, 315 data_nested_tlb_fault); 316 exc_register(EXC_DATA_D_BIT_FAULT, 317 vector_to_string(EXC_DATA_D_BIT_FAULT), true, 318 data_dirty_bit_fault); 319 exc_register(EXC_INST_A_BIT_FAULT, 320 vector_to_string(EXC_INST_A_BIT_FAULT), true, 321 instruction_access_bit_fault); 322 exc_register(EXC_DATA_A_BIT_FAULT, 323 vector_to_string(EXC_DATA_A_BIT_FAULT), true, 324 data_access_bit_fault); 325 exc_register(EXC_EXT_INTERRUPT, 326 vector_to_string(EXC_EXT_INTERRUPT), true, 327 external_interrupt); 328 329 exc_register(EXC_PAGE_NOT_PRESENT, 330 vector_to_string(EXC_PAGE_NOT_PRESENT), true, 331 page_not_present); 332 exc_register(EXC_DATA_AR_FAULT, 333 vector_to_string(EXC_DATA_AR_FAULT), true, 334 data_access_rights_fault); 335 exc_register(EXC_GENERAL_EXCEPTION, 336 vector_to_string(EXC_GENERAL_EXCEPTION), false, 337 general_exception); 338 exc_register(EXC_DISABLED_FP_REG, 339 vector_to_string(EXC_DISABLED_FP_REG), true, 340 disabled_fp_register); 341 } 342 300 343 /** @} 301 344 */
Note:
See TracChangeset
for help on using the changeset viewer.