traps.c (27eb2c4b3d3e13f376a359e293c212a2e9407af5) | traps.c (996232393bcdfff49de31e1bc1c431fd8bce9ccb) |
---|---|
1/* 2 * arch/xtensa/kernel/traps.c 3 * 4 * Exception handling. 5 * 6 * Derived from code with the following copyrights: 7 * Copyright (C) 1994 - 1999 by Ralf Baechle 8 * Modified for R3000 by Paul M. Antoine, 1995, 1996 --- 198 unchanged lines hidden (view full) --- 207 XCHAL_INTLEVEL1_MASK, 208 XCHAL_INTLEVEL2_MASK, 209 XCHAL_INTLEVEL3_MASK, 210 XCHAL_INTLEVEL4_MASK, 211 XCHAL_INTLEVEL5_MASK, 212 XCHAL_INTLEVEL6_MASK, 213 XCHAL_INTLEVEL7_MASK, 214 }; | 1/* 2 * arch/xtensa/kernel/traps.c 3 * 4 * Exception handling. 5 * 6 * Derived from code with the following copyrights: 7 * Copyright (C) 1994 - 1999 by Ralf Baechle 8 * Modified for R3000 by Paul M. Antoine, 1995, 1996 --- 198 unchanged lines hidden (view full) --- 207 XCHAL_INTLEVEL1_MASK, 208 XCHAL_INTLEVEL2_MASK, 209 XCHAL_INTLEVEL3_MASK, 210 XCHAL_INTLEVEL4_MASK, 211 XCHAL_INTLEVEL5_MASK, 212 XCHAL_INTLEVEL6_MASK, 213 XCHAL_INTLEVEL7_MASK, 214 }; |
215 struct pt_regs *old_regs = set_irq_regs(regs); |
|
215 | 216 |
217 irq_enter(); 218 |
|
216 for (;;) { 217 unsigned intread = get_sr(interrupt); 218 unsigned intenable = get_sr(intenable); 219 unsigned int_at_level = intread & intenable; 220 unsigned level; 221 222 for (level = LOCKLEVEL; level > 0; --level) { 223 if (int_at_level & int_level_mask[level]) { 224 int_at_level &= int_level_mask[level]; 225 break; 226 } 227 } 228 229 if (level == 0) | 219 for (;;) { 220 unsigned intread = get_sr(interrupt); 221 unsigned intenable = get_sr(intenable); 222 unsigned int_at_level = intread & intenable; 223 unsigned level; 224 225 for (level = LOCKLEVEL; level > 0; --level) { 226 if (int_at_level & int_level_mask[level]) { 227 int_at_level &= int_level_mask[level]; 228 break; 229 } 230 } 231 232 if (level == 0) |
230 return; | 233 break; |
231 | 234 |
232 /* 233 * Clear the interrupt before processing, in case it's 234 * edge-triggered or software-generated 235 */ 236 while (int_at_level) { 237 unsigned i = __ffs(int_at_level); 238 unsigned mask = 1 << i; 239 240 int_at_level ^= mask; 241 set_sr(mask, intclear); 242 do_IRQ(i, regs); 243 } | 235 do_IRQ(__ffs(int_at_level), regs); |
244 } | 236 } |
237 238 irq_exit(); 239 set_irq_regs(old_regs); |
|
245} 246 247/* 248 * Illegal instruction. Fatal if in kernel space. 249 */ 250 251void 252do_illegal_instruction(struct pt_regs *regs) --- 256 unchanged lines hidden --- | 240} 241 242/* 243 * Illegal instruction. Fatal if in kernel space. 244 */ 245 246void 247do_illegal_instruction(struct pt_regs *regs) --- 256 unchanged lines hidden --- |