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 ---