Blame view
arch/blackfin/kernel/traps.c
15.7 KB
1394f0322 blackfin architec... |
1 |
/* |
2a12c4632 Blackfin: split k... |
2 3 4 |
* Main exception handling logic. * * Copyright 2004-2010 Analog Devices Inc. |
1394f0322 blackfin architec... |
5 |
* |
96f1050d3 Blackfin: mass cl... |
6 |
* Licensed under the GPL-2 or later |
1394f0322 blackfin architec... |
7 |
*/ |
70f12567a Blackfin: add sup... |
8 |
#include <linux/bug.h> |
1f83b8f14 Blackfin arch: cl... |
9 |
#include <linux/uaccess.h> |
1f83b8f14 Blackfin arch: cl... |
10 |
#include <linux/module.h> |
1394f0322 blackfin architec... |
11 |
#include <asm/traps.h> |
f4585a084 Blackfin arch: on... |
12 |
#include <asm/cplb.h> |
1394f0322 blackfin architec... |
13 |
#include <asm/blackfin.h> |
1394f0322 blackfin architec... |
14 |
#include <asm/irq_handler.h> |
d8f66c8c1 [Blackfin] arch: ... |
15 |
#include <linux/irq.h> |
669b792c7 Blackfin arch: Cl... |
16 |
#include <asm/trace.h> |
226eb1ef5 Blackfin arch: cl... |
17 |
#include <asm/fixed_code.h> |
6ce3e9c2a Blackfin: add sup... |
18 |
#include <asm/pseudo_instructions.h> |
1394f0322 blackfin architec... |
19 20 |
#ifdef CONFIG_KGDB |
1394f0322 blackfin architec... |
21 |
# include <linux/kgdb.h> |
226eb1ef5 Blackfin arch: cl... |
22 23 24 |
# define CHK_DEBUGGER_TRAP() \ do { \ |
a5ac01292 Blackfin arch: ad... |
25 |
kgdb_handle_exception(trapnr, sig, info.si_code, fp); \ |
226eb1ef5 Blackfin arch: cl... |
26 27 28 29 30 31 32 33 34 |
} while (0) # define CHK_DEBUGGER_TRAP_MAYBE() \ do { \ if (kgdb_connected) \ CHK_DEBUGGER_TRAP(); \ } while (0) #else # define CHK_DEBUGGER_TRAP() do { } while (0) # define CHK_DEBUGGER_TRAP_MAYBE() do { } while (0) |
1394f0322 blackfin architec... |
35 |
#endif |
9f06c38fb Blackfin arch: Ad... |
36 |
|
4ee1c4533 Blackfin arch: Fi... |
37 |
#ifdef CONFIG_DEBUG_VERBOSE |
9f06c38fb Blackfin arch: Ad... |
38 39 40 41 42 43 |
#define verbose_printk(fmt, arg...) \ printk(fmt, ##arg) #else #define verbose_printk(fmt, arg...) \ ({ if (0) printk(fmt, ##arg); 0; }) #endif |
81f7f4560 Blackfin: export ... |
44 45 46 47 48 49 |
#if defined(CONFIG_DEBUG_MMRS) || defined(CONFIG_DEBUG_MMRS_MODULE) u32 last_seqstat; #ifdef CONFIG_DEBUG_MMRS_MODULE EXPORT_SYMBOL(last_seqstat); #endif #endif |
1394f0322 blackfin architec... |
50 51 52 53 54 55 56 |
/* Initiate the event table handler */ void __init trap_init(void) { CSYNC(); bfin_write_EVT3(trap); CSYNC(); } |
82bd1d7d4 Blackfin: push do... |
57 58 59 60 |
static int kernel_mode_regs(struct pt_regs *regs) { return regs->ipend & 0xffc0; } |
c4baebf26 Blackfin: do not ... |
61 |
asmlinkage notrace void trap_c(struct pt_regs *fp) |
1394f0322 blackfin architec... |
62 |
{ |
518039bc2 Blackfin arch: Ad... |
63 64 65 |
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON int j; #endif |
6ce3e9c2a Blackfin: add sup... |
66 67 68 |
#ifdef CONFIG_BFIN_PSEUDODBG_INSNS int opcode; #endif |
b6dbde27d Blackfin: use raw... |
69 |
unsigned int cpu = raw_smp_processor_id(); |
82bd1d7d4 Blackfin: push do... |
70 |
const char *strerror = NULL; |
518039bc2 Blackfin arch: Ad... |
71 |
int sig = 0; |
1394f0322 blackfin architec... |
72 73 |
siginfo_t info; unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; |
226eb1ef5 Blackfin arch: cl... |
74 |
trace_buffer_save(j); |
81f7f4560 Blackfin: export ... |
75 76 77 |
#if defined(CONFIG_DEBUG_MMRS) || defined(CONFIG_DEBUG_MMRS_MODULE) last_seqstat = (u32)fp->seqstat; #endif |
226eb1ef5 Blackfin arch: cl... |
78 79 80 81 |
/* Important - be very careful dereferncing pointers - will lead to * double faults if the stack has become corrupt */ |
1394f0322 blackfin architec... |
82 83 84 85 86 87 88 89 90 91 92 |
/* trap_c() will be called for exceptions. During exceptions * processing, the pc value should be set with retx value. * With this change we can cleanup some code in signal.c- TODO */ fp->orig_pc = fp->retx; /* printk("exception: 0x%x, ipend=%x, reti=%x, retx=%x ", trapnr, fp->ipend, fp->pc, fp->retx); */ /* send the appropriate signal to the user program */ switch (trapnr) { |
25985edce Fix common misspe... |
93 |
/* This table works in conjunction with the one in ./mach-common/entry.S |
1394f0322 blackfin architec... |
94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
* Some exceptions are handled there (in assembly, in exception space) * Some are handled here, (in C, in interrupt space) * Some, like CPLB, are handled in both, where the normal path is * handled in assembly/exception space, and the error path is handled * here */ /* 0x00 - Linux Syscall, getting here is an error */ /* 0x01 - userspace gdb breakpoint, handled here */ case VEC_EXCPT01: info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); /* Check if this is a breakpoint in kernel space */ |
82bd1d7d4 Blackfin: push do... |
108 |
if (kernel_mode_regs(fp)) |
6510a20e1 Blackfin: fix tra... |
109 |
goto traps_done; |
1394f0322 blackfin architec... |
110 111 |
else break; |
9401e618c Blackfin arch: sc... |
112 |
/* 0x03 - User Defined, userspace stack overflow */ |
1394f0322 blackfin architec... |
113 114 115 |
case VEC_EXCPT03: info.si_code = SEGV_STACKFLOW; sig = SIGSEGV; |
82bd1d7d4 Blackfin: push do... |
116 |
strerror = KERN_NOTICE EXC_0x03(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
117 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
118 |
break; |
27707d3e4 Blackfin arch: Fi... |
119 120 121 122 123 124 |
/* 0x02 - KGDB initial connection and break signal trap */ case VEC_EXCPT02: #ifdef CONFIG_KGDB info.si_code = TRAP_ILLTRAP; sig = SIGTRAP; CHK_DEBUGGER_TRAP(); |
6510a20e1 Blackfin: fix tra... |
125 |
goto traps_done; |
27707d3e4 Blackfin arch: Fi... |
126 |
#endif |
5c64e0d51 Blackfin arch: Be... |
127 128 129 130 131 132 133 134 135 136 137 138 |
/* 0x04 - User Defined */ /* 0x05 - User Defined */ /* 0x06 - User Defined */ /* 0x07 - User Defined */ /* 0x08 - User Defined */ /* 0x09 - User Defined */ /* 0x0A - User Defined */ /* 0x0B - User Defined */ /* 0x0C - User Defined */ /* 0x0D - User Defined */ /* 0x0E - User Defined */ /* 0x0F - User Defined */ |
27707d3e4 Blackfin arch: Fi... |
139 |
/* If we got here, it is most likely that someone was trying to use a |
5c64e0d51 Blackfin arch: Be... |
140 141 142 143 144 |
* custom exception handler, and it is not actually installed properly */ case VEC_EXCPT04 ... VEC_EXCPT15: info.si_code = ILL_ILLPARAOP; sig = SIGILL; |
82bd1d7d4 Blackfin: push do... |
145 |
strerror = KERN_NOTICE EXC_0x04(KERN_NOTICE); |
5c64e0d51 Blackfin arch: Be... |
146 147 |
CHK_DEBUGGER_TRAP_MAYBE(); break; |
1394f0322 blackfin architec... |
148 149 150 151 152 153 |
/* 0x10 HW Single step, handled here */ case VEC_STEP: info.si_code = TRAP_STEP; sig = SIGTRAP; CHK_DEBUGGER_TRAP_MAYBE(); /* Check if this is a single step in kernel space */ |
82bd1d7d4 Blackfin: push do... |
154 |
if (kernel_mode_regs(fp)) |
6510a20e1 Blackfin: fix tra... |
155 |
goto traps_done; |
1394f0322 blackfin architec... |
156 157 158 159 160 161 |
else break; /* 0x11 - Trace Buffer Full, handled here */ case VEC_OVFLOW: info.si_code = TRAP_TRACEFLOW; sig = SIGTRAP; |
82bd1d7d4 Blackfin: push do... |
162 |
strerror = KERN_NOTICE EXC_0x11(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
163 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
break; /* 0x12 - Reserved, Caught by default */ /* 0x13 - Reserved, Caught by default */ /* 0x14 - Reserved, Caught by default */ /* 0x15 - Reserved, Caught by default */ /* 0x16 - Reserved, Caught by default */ /* 0x17 - Reserved, Caught by default */ /* 0x18 - Reserved, Caught by default */ /* 0x19 - Reserved, Caught by default */ /* 0x1A - Reserved, Caught by default */ /* 0x1B - Reserved, Caught by default */ /* 0x1C - Reserved, Caught by default */ /* 0x1D - Reserved, Caught by default */ /* 0x1E - Reserved, Caught by default */ /* 0x1F - Reserved, Caught by default */ /* 0x20 - Reserved, Caught by default */ /* 0x21 - Undefined Instruction, handled here */ case VEC_UNDEF_I: |
70f12567a Blackfin: add sup... |
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
#ifdef CONFIG_BUG if (kernel_mode_regs(fp)) { switch (report_bug(fp->pc, fp)) { case BUG_TRAP_TYPE_NONE: break; case BUG_TRAP_TYPE_WARN: dump_bfin_trace_buffer(); fp->pc += 2; goto traps_done; case BUG_TRAP_TYPE_BUG: /* call to panic() will dump trace, and it is * off at this point, so it won't be clobbered */ panic("BUG()"); } } #endif |
6ce3e9c2a Blackfin: add sup... |
199 200 201 202 203 204 205 206 207 |
#ifdef CONFIG_BFIN_PSEUDODBG_INSNS /* * Support for the fake instructions, if the instruction fails, * then just execute a illegal opcode failure (like normal). * Don't support these instructions inside the kernel */ if (!kernel_mode_regs(fp) && get_instruction(&opcode, (unsigned short *)fp->pc)) { if (execute_pseudodbg_assert(fp, opcode)) goto traps_done; |
dc89d97fc Blackfin: add sup... |
208 209 |
if (execute_pseudodbg(fp, opcode)) goto traps_done; |
6ce3e9c2a Blackfin: add sup... |
210 211 |
} #endif |
1394f0322 blackfin architec... |
212 213 |
info.si_code = ILL_ILLOPC; sig = SIGILL; |
82bd1d7d4 Blackfin: push do... |
214 |
strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
215 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
216 217 218 219 220 |
break; /* 0x22 - Illegal Instruction Combination, handled here */ case VEC_ILGAL_I: info.si_code = ILL_ILLPARAOP; sig = SIGILL; |
82bd1d7d4 Blackfin: push do... |
221 |
strerror = KERN_NOTICE EXC_0x22(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
222 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
223 |
break; |
f26fbc48f Blackfin arch: en... |
224 |
/* 0x23 - Data CPLB protection violation, handled here */ |
1394f0322 blackfin architec... |
225 226 |
case VEC_CPLB_VL: info.si_code = ILL_CPLB_VI; |
36b841288 Blackfin: fix MPU... |
227 |
sig = SIGSEGV; |
82bd1d7d4 Blackfin: push do... |
228 |
strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
229 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
230 231 232 233 234 |
break; /* 0x24 - Data access misaligned, handled here */ case VEC_MISALI_D: info.si_code = BUS_ADRALN; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
235 |
strerror = KERN_NOTICE EXC_0x24(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
236 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
237 238 239 240 241 |
break; /* 0x25 - Unrecoverable Event, handled here */ case VEC_UNCOV: info.si_code = ILL_ILLEXCPT; sig = SIGILL; |
82bd1d7d4 Blackfin: push do... |
242 |
strerror = KERN_NOTICE EXC_0x25(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
243 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
244 245 246 247 248 249 |
break; /* 0x26 - Data CPLB Miss, normal case is handled in _cplb_hdr, error case is handled here */ case VEC_CPLB_M: info.si_code = BUS_ADRALN; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
250 |
strerror = KERN_NOTICE EXC_0x26(KERN_NOTICE); |
1394f0322 blackfin architec... |
251 252 253 254 |
break; /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */ case VEC_CPLB_MHIT: info.si_code = ILL_CPLB_MULHIT; |
1394f0322 blackfin architec... |
255 |
sig = SIGSEGV; |
c6c6f75d5 Blackfin arch: cl... |
256 |
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
8f65873e4 Blackfin arch: SM... |
257 |
if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START) |
82bd1d7d4 Blackfin: push do... |
258 259 |
strerror = KERN_NOTICE "NULL pointer access "; |
c6c6f75d5 Blackfin arch: cl... |
260 |
else |
1394f0322 blackfin architec... |
261 |
#endif |
82bd1d7d4 Blackfin: push do... |
262 |
strerror = KERN_NOTICE EXC_0x27(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
263 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
264 265 266 267 268 |
break; /* 0x28 - Emulation Watchpoint, handled here */ case VEC_WATCH: info.si_code = TRAP_WATCHPT; sig = SIGTRAP; |
569a50ca3 Blackfin arch: En... |
269 |
pr_debug(EXC_0x28(KERN_DEBUG)); |
1394f0322 blackfin architec... |
270 271 |
CHK_DEBUGGER_TRAP_MAYBE(); /* Check if this is a watchpoint in kernel space */ |
82bd1d7d4 Blackfin: push do... |
272 |
if (kernel_mode_regs(fp)) |
6510a20e1 Blackfin: fix tra... |
273 |
goto traps_done; |
1394f0322 blackfin architec... |
274 275 276 277 278 279 280 |
else break; #ifdef CONFIG_BF535 /* 0x29 - Instruction fetch access error (535 only) */ case VEC_ISTRU_VL: /* ADSP-BF535 only (MH) */ info.si_code = BUS_OPFETCH; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
281 282 |
strerror = KERN_NOTICE "BF535: VEC_ISTRU_VL "; |
a5ac01292 Blackfin arch: ad... |
283 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
284 285 286 287 288 289 290 291 |
break; #else /* 0x29 - Reserved, Caught by default */ #endif /* 0x2A - Instruction fetch misaligned, handled here */ case VEC_MISALI_I: info.si_code = BUS_ADRALN; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
292 |
strerror = KERN_NOTICE EXC_0x2A(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
293 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
294 |
break; |
f26fbc48f Blackfin arch: en... |
295 |
/* 0x2B - Instruction CPLB protection violation, handled here */ |
1394f0322 blackfin architec... |
296 297 |
case VEC_CPLB_I_VL: info.si_code = ILL_CPLB_VI; |
f26fbc48f Blackfin arch: en... |
298 |
sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
299 |
strerror = KERN_NOTICE EXC_0x2B(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
300 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
301 302 303 304 305 |
break; /* 0x2C - Instruction CPLB miss, handled in _cplb_hdr */ case VEC_CPLB_I_M: info.si_code = ILL_CPLB_MISS; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
306 |
strerror = KERN_NOTICE EXC_0x2C(KERN_NOTICE); |
1394f0322 blackfin architec... |
307 308 309 310 |
break; /* 0x2D - Instruction CPLB Multiple Hits, handled here */ case VEC_CPLB_I_MHIT: info.si_code = ILL_CPLB_MULHIT; |
1394f0322 blackfin architec... |
311 |
sig = SIGSEGV; |
c6c6f75d5 Blackfin arch: cl... |
312 |
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
8f65873e4 Blackfin arch: SM... |
313 |
if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START) |
82bd1d7d4 Blackfin: push do... |
314 315 |
strerror = KERN_NOTICE "Jump to NULL address "; |
c6c6f75d5 Blackfin arch: cl... |
316 |
else |
1394f0322 blackfin architec... |
317 |
#endif |
82bd1d7d4 Blackfin: push do... |
318 |
strerror = KERN_NOTICE EXC_0x2D(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
319 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
320 321 322 323 324 |
break; /* 0x2E - Illegal use of Supervisor Resource, handled here */ case VEC_ILL_RES: info.si_code = ILL_PRVOPC; sig = SIGILL; |
82bd1d7d4 Blackfin: push do... |
325 |
strerror = KERN_NOTICE EXC_0x2E(KERN_NOTICE); |
a5ac01292 Blackfin arch: ad... |
326 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
break; /* 0x2F - Reserved, Caught by default */ /* 0x30 - Reserved, Caught by default */ /* 0x31 - Reserved, Caught by default */ /* 0x32 - Reserved, Caught by default */ /* 0x33 - Reserved, Caught by default */ /* 0x34 - Reserved, Caught by default */ /* 0x35 - Reserved, Caught by default */ /* 0x36 - Reserved, Caught by default */ /* 0x37 - Reserved, Caught by default */ /* 0x38 - Reserved, Caught by default */ /* 0x39 - Reserved, Caught by default */ /* 0x3A - Reserved, Caught by default */ /* 0x3B - Reserved, Caught by default */ /* 0x3C - Reserved, Caught by default */ /* 0x3D - Reserved, Caught by default */ /* 0x3E - Reserved, Caught by default */ /* 0x3F - Reserved, Caught by default */ |
13fe24f37 [Blackfin] arch: ... |
345 346 347 348 349 350 351 352 |
case VEC_HWERR: info.si_code = BUS_ADRALN; sig = SIGBUS; switch (fp->seqstat & SEQSTAT_HWERRCAUSE) { /* System MMR Error */ case (SEQSTAT_HWERRCAUSE_SYSTEM_MMR): info.si_code = BUS_ADRALN; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
353 |
strerror = KERN_NOTICE HWC_x2(KERN_NOTICE); |
13fe24f37 [Blackfin] arch: ... |
354 355 356 |
break; /* External Memory Addressing Error */ case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR): |
a00b4fe5c Blackfin: workaro... |
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
if (ANOMALY_05000310) { static unsigned long anomaly_rets; if ((fp->pc >= (L1_CODE_START + L1_CODE_LENGTH - 512)) && (fp->pc < (L1_CODE_START + L1_CODE_LENGTH))) { /* * A false hardware error will happen while fetching at * the L1 instruction SRAM boundary. Ignore it. */ anomaly_rets = fp->rets; goto traps_done; } else if (fp->rets == anomaly_rets) { /* * While boundary code returns to a function, at the ret * point, a new false hardware error might occur too based * on tests. Ignore it too. */ goto traps_done; } else if ((fp->rets >= (L1_CODE_START + L1_CODE_LENGTH - 512)) && (fp->rets < (L1_CODE_START + L1_CODE_LENGTH))) { /* * If boundary code calls a function, at the entry point, * a new false hardware error maybe happen based on tests. * Ignore it too. */ goto traps_done; } else anomaly_rets = 0; } |
13fe24f37 [Blackfin] arch: ... |
386 387 |
info.si_code = BUS_ADRERR; sig = SIGBUS; |
82bd1d7d4 Blackfin: push do... |
388 |
strerror = KERN_NOTICE HWC_x3(KERN_NOTICE); |
13fe24f37 [Blackfin] arch: ... |
389 390 391 |
break; /* Performance Monitor Overflow */ case (SEQSTAT_HWERRCAUSE_PERF_FLOW): |
82bd1d7d4 Blackfin: push do... |
392 |
strerror = KERN_NOTICE HWC_x12(KERN_NOTICE); |
13fe24f37 [Blackfin] arch: ... |
393 394 395 396 397 398 399 400 401 |
break; /* RAISE 5 instruction */ case (SEQSTAT_HWERRCAUSE_RAISE_5): printk(KERN_NOTICE HWC_x18(KERN_NOTICE)); break; default: /* Reserved */ printk(KERN_NOTICE HWC_default(KERN_NOTICE)); break; } |
a5ac01292 Blackfin arch: ad... |
402 |
CHK_DEBUGGER_TRAP_MAYBE(); |
13fe24f37 [Blackfin] arch: ... |
403 |
break; |
5c64e0d51 Blackfin arch: Be... |
404 405 406 407 |
/* * We should be handling all known exception types above, * if we get here we hit a reserved one, so panic */ |
1394f0322 blackfin architec... |
408 |
default: |
5c64e0d51 Blackfin arch: Be... |
409 410 |
info.si_code = ILL_ILLPARAOP; sig = SIGILL; |
9f06c38fb Blackfin arch: Ad... |
411 412 |
verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx ", |
1394f0322 blackfin architec... |
413 |
(fp->seqstat & SEQSTAT_EXCAUSE)); |
a5ac01292 Blackfin arch: ad... |
414 |
CHK_DEBUGGER_TRAP_MAYBE(); |
1394f0322 blackfin architec... |
415 416 |
break; } |
226eb1ef5 Blackfin arch: cl... |
417 |
BUG_ON(sig == 0); |
82bd1d7d4 Blackfin: push do... |
418 419 420 421 422 423 |
/* If the fault was caused by a kernel thread, or interrupt handler * we will kernel panic, so the system reboots. */ if (kernel_mode_regs(fp) || (current && !current->mm)) { console_verbose(); oops_in_progress = 1; |
82bd1d7d4 Blackfin: push do... |
424 |
} |
226eb1ef5 Blackfin arch: cl... |
425 |
if (sig != SIGTRAP) { |
15627bd35 Blackfin: restore... |
426 427 |
if (strerror) verbose_printk(strerror); |
49dce9124 Blackfin arch: sp... |
428 |
dump_bfin_process(fp); |
b03b08ba9 [Blackfin] arch: ... |
429 |
dump_bfin_mem(fp); |
49dce9124 Blackfin arch: sp... |
430 |
show_regs(fp); |
226eb1ef5 Blackfin arch: cl... |
431 432 433 434 |
/* Print out the trace buffer if it makes sense */ #ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE if (trapnr == VEC_CPLB_I_M || trapnr == VEC_CPLB_M) |
9f06c38fb Blackfin arch: Ad... |
435 |
verbose_printk(KERN_NOTICE "No trace since you do not have " |
ad361c988 Remove multiple K... |
436 437 438 |
"CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled "); |
226eb1ef5 Blackfin arch: cl... |
439 440 441 |
else #endif dump_bfin_trace_buffer(); |
f09630bff Blackfin arch: Ad... |
442 |
|
226eb1ef5 Blackfin arch: cl... |
443 |
if (oops_in_progress) { |
f09630bff Blackfin arch: Ad... |
444 |
/* Dump the current kernel stack */ |
ad361c988 Remove multiple K... |
445 446 |
verbose_printk(KERN_NOTICE "Kernel Stack "); |
f09630bff Blackfin arch: Ad... |
447 |
show_stack(current, NULL); |
aee3a2924 [Blackfin] arch: ... |
448 |
print_modules(); |
226eb1ef5 Blackfin arch: cl... |
449 |
#ifndef CONFIG_ACCESS_CHECK |
9f06c38fb Blackfin arch: Ad... |
450 |
verbose_printk(KERN_EMERG "Please turn on " |
90c7f4686 Blackfin arch: cl... |
451 452 |
"CONFIG_ACCESS_CHECK "); |
226eb1ef5 Blackfin arch: cl... |
453 |
#endif |
1394f0322 blackfin architec... |
454 |
panic("Kernel exception"); |
f09630bff Blackfin arch: Ad... |
455 |
} else { |
4ee1c4533 Blackfin arch: Fi... |
456 |
#ifdef CONFIG_DEBUG_VERBOSE |
9f06c38fb Blackfin arch: Ad... |
457 |
unsigned long *stack; |
f09630bff Blackfin arch: Ad... |
458 459 |
/* Dump the user space stack */ stack = (unsigned long *)rdusp(); |
9f06c38fb Blackfin arch: Ad... |
460 461 |
verbose_printk(KERN_NOTICE "Userspace Stack "); |
f09630bff Blackfin arch: Ad... |
462 |
show_stack(NULL, stack); |
9f06c38fb Blackfin arch: Ad... |
463 |
#endif |
226eb1ef5 Blackfin arch: cl... |
464 |
} |
1394f0322 blackfin architec... |
465 |
} |
fb322915a Blackfin arch: fi... |
466 |
|
6a01f2303 Blackfin arch: m... |
467 468 469 470 471 472 |
#ifdef CONFIG_IPIPE if (!ipipe_trap_notify(fp->seqstat & 0x3f, fp)) #endif { info.si_signo = sig; info.si_errno = 0; |
5e8d3210b Blackfin: fill ou... |
473 474 475 476 477 478 479 480 481 482 483 |
switch (trapnr) { case VEC_CPLB_VL: case VEC_MISALI_D: case VEC_CPLB_M: case VEC_CPLB_MHIT: info.si_addr = (void __user *)cpu_pda[cpu].dcplb_fault_addr; break; default: info.si_addr = (void __user *)fp->pc; break; } |
6a01f2303 Blackfin arch: m... |
484 485 |
force_sig_info(sig, &info, current); } |
1394f0322 blackfin architec... |
486 |
|
0e4edcf0b Blackfin: work ar... |
487 |
if ((ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) || |
f574a76a3 Blackfin: work ar... |
488 489 |
(ANOMALY_05000281 && trapnr == VEC_HWERR) || (ANOMALY_05000189 && (trapnr == VEC_CPLB_I_VL || trapnr == VEC_CPLB_VL))) |
0acad8dfe Blackfin: add wor... |
490 |
fp->pc = SAFE_USER_INSTRUCTION; |
6510a20e1 Blackfin: fix tra... |
491 |
traps_done: |
1394f0322 blackfin architec... |
492 |
trace_buffer_restore(j); |
1394f0322 blackfin architec... |
493 |
} |
2a12c4632 Blackfin: split k... |
494 |
asmlinkage void double_fault_c(struct pt_regs *fp) |
1394f0322 blackfin architec... |
495 |
{ |
518039bc2 Blackfin arch: Ad... |
496 |
#ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON |
2a12c4632 Blackfin: split k... |
497 498 |
int j; trace_buffer_save(j); |
518039bc2 Blackfin arch: Ad... |
499 |
#endif |
1394f0322 blackfin architec... |
500 |
|
2a12c4632 Blackfin: split k... |
501 502 |
console_verbose(); oops_in_progress = 1; |
9f06c38fb Blackfin arch: Ad... |
503 |
#ifdef CONFIG_DEBUG_VERBOSE |
2a12c4632 Blackfin: split k... |
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
printk(KERN_EMERG "Double Fault "); #ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) { unsigned int cpu = raw_smp_processor_id(); char buf[150]; decode_address(buf, cpu_pda[cpu].retx_doublefault); printk(KERN_EMERG "While handling exception (EXCAUSE = 0x%x) at %s: ", (unsigned int)cpu_pda[cpu].seqstat_doublefault & SEQSTAT_EXCAUSE, buf); decode_address(buf, cpu_pda[cpu].dcplb_doublefault_addr); printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %s ", buf); decode_address(buf, cpu_pda[cpu].icplb_doublefault_addr); printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %s ", buf); |
9a62ca40f [Blackfin] arch: ... |
520 |
|
2a12c4632 Blackfin: split k... |
521 522 523 |
decode_address(buf, fp->retx); printk(KERN_NOTICE "The instruction at %s caused a double exception ", buf); |
49dce9124 Blackfin arch: sp... |
524 |
} else |
9ba3c24f1 Blackfin: include... |
525 |
#endif |
2a12c4632 Blackfin: split k... |
526 527 528 529 530 |
{ dump_bfin_process(fp); dump_bfin_mem(fp); show_regs(fp); dump_bfin_trace_buffer(); |
226eb1ef5 Blackfin arch: cl... |
531 |
} |
1394f0322 blackfin architec... |
532 |
#endif |
2a12c4632 Blackfin: split k... |
533 |
panic("Double Fault - unrecoverable event"); |
1394f0322 blackfin architec... |
534 |
|
1394f0322 blackfin architec... |
535 |
} |
1ffe6646b Blackfin arch: ad... |
536 |
|
1394f0322 blackfin architec... |
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
void panic_cplb_error(int cplb_panic, struct pt_regs *fp) { switch (cplb_panic) { case CPLB_NO_UNLOCKED: printk(KERN_EMERG "All CPLBs are locked "); break; case CPLB_PROT_VIOL: return; case CPLB_NO_ADDR_MATCH: return; case CPLB_UNKNOWN_ERR: printk(KERN_EMERG "Unknown CPLB Exception "); break; } |
226eb1ef5 Blackfin arch: cl... |
553 |
oops_in_progress = 1; |
49dce9124 Blackfin arch: sp... |
554 |
dump_bfin_process(fp); |
b03b08ba9 [Blackfin] arch: ... |
555 |
dump_bfin_mem(fp); |
49dce9124 Blackfin arch: sp... |
556 |
show_regs(fp); |
1394f0322 blackfin architec... |
557 |
dump_stack(); |
d8804adf5 Blackfin: do not ... |
558 |
panic("Unrecoverable event"); |
1394f0322 blackfin architec... |
559 |
} |
2a12c4632 Blackfin: split k... |
560 561 562 563 |
#ifdef CONFIG_BUG int is_valid_bugaddr(unsigned long addr) { |
9a95e2f10 Blackfin: make ha... |
564 |
unsigned int opcode; |
2a12c4632 Blackfin: split k... |
565 566 567 568 569 570 571 |
if (!get_instruction(&opcode, (unsigned short *)addr)) return 0; return opcode == BFIN_BUG_OPCODE; } #endif |
d28cff4b6 Blackfin: remove ... |
572 573 574 575 576 577 578 579 |
/* stub this out */ #ifndef CONFIG_DEBUG_VERBOSE void show_regs(struct pt_regs *fp) { } #endif |