Blame view

arch/blackfin/kernel/traps.c 15.7 KB
1394f0322   Bryan Wu   blackfin architec...
1
  /*
2a12c4632   Robin Getz   Blackfin: split k...
2
3
4
   * Main exception handling logic.
   *
   * Copyright 2004-2010 Analog Devices Inc.
1394f0322   Bryan Wu   blackfin architec...
5
   *
96f1050d3   Robin Getz   Blackfin: mass cl...
6
   * Licensed under the GPL-2 or later
1394f0322   Bryan Wu   blackfin architec...
7
   */
70f12567a   Mike Frysinger   Blackfin: add sup...
8
  #include <linux/bug.h>
1f83b8f14   Mike Frysinger   Blackfin arch: cl...
9
  #include <linux/uaccess.h>
1f83b8f14   Mike Frysinger   Blackfin arch: cl...
10
  #include <linux/module.h>
1394f0322   Bryan Wu   blackfin architec...
11
  #include <asm/traps.h>
f4585a084   Mike Frysinger   Blackfin arch: on...
12
  #include <asm/cplb.h>
1394f0322   Bryan Wu   blackfin architec...
13
  #include <asm/blackfin.h>
1394f0322   Bryan Wu   blackfin architec...
14
  #include <asm/irq_handler.h>
d8f66c8c1   Robin Getz   [Blackfin] arch: ...
15
  #include <linux/irq.h>
669b792c7   Robin Getz   Blackfin arch: Cl...
16
  #include <asm/trace.h>
226eb1ef5   Robin Getz   Blackfin arch: cl...
17
  #include <asm/fixed_code.h>
6ce3e9c2a   Robin Getz   Blackfin: add sup...
18
  #include <asm/pseudo_instructions.h>
1394f0322   Bryan Wu   blackfin architec...
19
20
  
  #ifdef CONFIG_KGDB
1394f0322   Bryan Wu   blackfin architec...
21
  # include <linux/kgdb.h>
226eb1ef5   Robin Getz   Blackfin arch: cl...
22
23
24
  
  # define CHK_DEBUGGER_TRAP() \
  	do { \
a5ac01292   Sonic Zhang   Blackfin arch: ad...
25
  		kgdb_handle_exception(trapnr, sig, info.si_code, fp); \
226eb1ef5   Robin Getz   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   Bryan Wu   blackfin architec...
35
  #endif
9f06c38fb   Robin Getz   Blackfin arch: Ad...
36

4ee1c4533   Robin Getz   Blackfin arch: Fi...
37
  #ifdef CONFIG_DEBUG_VERBOSE
9f06c38fb   Robin Getz   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   Robin Getz   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   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
57
58
59
60
  static int kernel_mode_regs(struct pt_regs *regs)
  {
  	return regs->ipend & 0xffc0;
  }
c4baebf26   Yi Li   Blackfin: do not ...
61
  asmlinkage notrace void trap_c(struct pt_regs *fp)
1394f0322   Bryan Wu   blackfin architec...
62
  {
518039bc2   Robin Getz   Blackfin arch: Ad...
63
64
65
  #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
  	int j;
  #endif
6ce3e9c2a   Robin Getz   Blackfin: add sup...
66
67
68
  #ifdef CONFIG_BFIN_PSEUDODBG_INSNS
  	int opcode;
  #endif
b6dbde27d   Yi Li   Blackfin: use raw...
69
  	unsigned int cpu = raw_smp_processor_id();
82bd1d7d4   Mike Frysinger   Blackfin: push do...
70
  	const char *strerror = NULL;
518039bc2   Robin Getz   Blackfin arch: Ad...
71
  	int sig = 0;
1394f0322   Bryan Wu   blackfin architec...
72
73
  	siginfo_t info;
  	unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE;
226eb1ef5   Robin Getz   Blackfin arch: cl...
74
  	trace_buffer_save(j);
81f7f4560   Robin Getz   Blackfin: export ...
75
76
77
  #if defined(CONFIG_DEBUG_MMRS) || defined(CONFIG_DEBUG_MMRS_MODULE)
  	last_seqstat = (u32)fp->seqstat;
  #endif
226eb1ef5   Robin Getz   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   Bryan Wu   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   Lucas De Marchi   Fix common misspe...
93
  	/* This table works in conjunction with the one in ./mach-common/entry.S
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
108
  		if (kernel_mode_regs(fp))
6510a20e1   Mike Frysinger   Blackfin: fix tra...
109
  			goto traps_done;
1394f0322   Bryan Wu   blackfin architec...
110
111
  		else
  			break;
9401e618c   Mike Frysinger   Blackfin arch: sc...
112
  	/* 0x03 - User Defined, userspace stack overflow */
1394f0322   Bryan Wu   blackfin architec...
113
114
115
  	case VEC_EXCPT03:
  		info.si_code = SEGV_STACKFLOW;
  		sig = SIGSEGV;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
116
  		strerror = KERN_NOTICE EXC_0x03(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
117
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
118
  		break;
27707d3e4   Sonic Zhang   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   Mike Frysinger   Blackfin: fix tra...
125
  		goto traps_done;
27707d3e4   Sonic Zhang   Blackfin arch: Fi...
126
  #endif
5c64e0d51   Robin Getz   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   Sonic Zhang   Blackfin arch: Fi...
139
  	/* If we got here, it is most likely that someone was trying to use a
5c64e0d51   Robin Getz   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   Mike Frysinger   Blackfin: push do...
145
  		strerror = KERN_NOTICE EXC_0x04(KERN_NOTICE);
5c64e0d51   Robin Getz   Blackfin arch: Be...
146
147
  		CHK_DEBUGGER_TRAP_MAYBE();
  		break;
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
154
  		if (kernel_mode_regs(fp))
6510a20e1   Mike Frysinger   Blackfin: fix tra...
155
  			goto traps_done;
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
162
  		strerror = KERN_NOTICE EXC_0x11(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
163
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   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   Robin Getz   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   Robin Getz   Blackfin: add sup...
208
209
  			if (execute_pseudodbg(fp, opcode))
  				goto traps_done;
6ce3e9c2a   Robin Getz   Blackfin: add sup...
210
211
  		}
  #endif
1394f0322   Bryan Wu   blackfin architec...
212
213
  		info.si_code = ILL_ILLOPC;
  		sig = SIGILL;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
214
  		strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
215
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
221
  		strerror = KERN_NOTICE EXC_0x22(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
222
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
223
  		break;
f26fbc48f   Robin Getz   Blackfin arch: en...
224
  	/* 0x23 - Data CPLB protection violation, handled here */
1394f0322   Bryan Wu   blackfin architec...
225
226
  	case VEC_CPLB_VL:
  		info.si_code = ILL_CPLB_VI;
36b841288   Graf Yang   Blackfin: fix MPU...
227
  		sig = SIGSEGV;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
228
  		strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
229
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
235
  		strerror = KERN_NOTICE EXC_0x24(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
236
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
237
238
239
240
241
  		break;
  	/* 0x25 - Unrecoverable Event, handled here */
  	case VEC_UNCOV:
  		info.si_code = ILL_ILLEXCPT;
  		sig = SIGILL;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
242
  		strerror = KERN_NOTICE EXC_0x25(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
243
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
250
  		strerror = KERN_NOTICE EXC_0x26(KERN_NOTICE);
1394f0322   Bryan Wu   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   Bryan Wu   blackfin architec...
255
  		sig = SIGSEGV;
c6c6f75d5   Mike Frysinger   Blackfin arch: cl...
256
  #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
8f65873e4   Graf Yang   Blackfin arch: SM...
257
  		if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START)
82bd1d7d4   Mike Frysinger   Blackfin: push do...
258
259
  			strerror = KERN_NOTICE "NULL pointer access
  ";
c6c6f75d5   Mike Frysinger   Blackfin arch: cl...
260
  		else
1394f0322   Bryan Wu   blackfin architec...
261
  #endif
82bd1d7d4   Mike Frysinger   Blackfin: push do...
262
  			strerror = KERN_NOTICE EXC_0x27(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
263
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
264
265
266
267
268
  		break;
  	/* 0x28 - Emulation Watchpoint, handled here */
  	case VEC_WATCH:
  		info.si_code = TRAP_WATCHPT;
  		sig = SIGTRAP;
569a50ca3   Robin Getz   Blackfin arch: En...
269
  		pr_debug(EXC_0x28(KERN_DEBUG));
1394f0322   Bryan Wu   blackfin architec...
270
271
  		CHK_DEBUGGER_TRAP_MAYBE();
  		/* Check if this is a watchpoint in kernel space */
82bd1d7d4   Mike Frysinger   Blackfin: push do...
272
  		if (kernel_mode_regs(fp))
6510a20e1   Mike Frysinger   Blackfin: fix tra...
273
  			goto traps_done;
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
281
282
  		strerror = KERN_NOTICE "BF535: VEC_ISTRU_VL
  ";
a5ac01292   Sonic Zhang   Blackfin arch: ad...
283
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
292
  		strerror = KERN_NOTICE EXC_0x2A(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
293
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
294
  		break;
f26fbc48f   Robin Getz   Blackfin arch: en...
295
  	/* 0x2B - Instruction CPLB protection violation, handled here */
1394f0322   Bryan Wu   blackfin architec...
296
297
  	case VEC_CPLB_I_VL:
  		info.si_code = ILL_CPLB_VI;
f26fbc48f   Robin Getz   Blackfin arch: en...
298
  		sig = SIGBUS;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
299
  		strerror = KERN_NOTICE EXC_0x2B(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
300
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
306
  		strerror = KERN_NOTICE EXC_0x2C(KERN_NOTICE);
1394f0322   Bryan Wu   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   Bryan Wu   blackfin architec...
311
  		sig = SIGSEGV;
c6c6f75d5   Mike Frysinger   Blackfin arch: cl...
312
  #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
8f65873e4   Graf Yang   Blackfin arch: SM...
313
  		if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START)
82bd1d7d4   Mike Frysinger   Blackfin: push do...
314
315
  			strerror = KERN_NOTICE "Jump to NULL address
  ";
c6c6f75d5   Mike Frysinger   Blackfin arch: cl...
316
  		else
1394f0322   Bryan Wu   blackfin architec...
317
  #endif
82bd1d7d4   Mike Frysinger   Blackfin: push do...
318
  			strerror = KERN_NOTICE EXC_0x2D(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
319
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Mike Frysinger   Blackfin: push do...
325
  		strerror = KERN_NOTICE EXC_0x2E(KERN_NOTICE);
a5ac01292   Sonic Zhang   Blackfin arch: ad...
326
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   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   Robin Getz   [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   Mike Frysinger   Blackfin: push do...
353
  			strerror = KERN_NOTICE HWC_x2(KERN_NOTICE);
13fe24f37   Robin Getz   [Blackfin] arch: ...
354
355
356
  			break;
  		/* External Memory Addressing Error */
  		case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR):
a00b4fe5c   Barry Song   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   Robin Getz   [Blackfin] arch: ...
386
387
  			info.si_code = BUS_ADRERR;
  			sig = SIGBUS;
82bd1d7d4   Mike Frysinger   Blackfin: push do...
388
  			strerror = KERN_NOTICE HWC_x3(KERN_NOTICE);
13fe24f37   Robin Getz   [Blackfin] arch: ...
389
390
391
  			break;
  		/* Performance Monitor Overflow */
  		case (SEQSTAT_HWERRCAUSE_PERF_FLOW):
82bd1d7d4   Mike Frysinger   Blackfin: push do...
392
  			strerror = KERN_NOTICE HWC_x12(KERN_NOTICE);
13fe24f37   Robin Getz   [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   Sonic Zhang   Blackfin arch: ad...
402
  		CHK_DEBUGGER_TRAP_MAYBE();
13fe24f37   Robin Getz   [Blackfin] arch: ...
403
  		break;
5c64e0d51   Robin Getz   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   Bryan Wu   blackfin architec...
408
  	default:
5c64e0d51   Robin Getz   Blackfin arch: Be...
409
410
  		info.si_code = ILL_ILLPARAOP;
  		sig = SIGILL;
9f06c38fb   Robin Getz   Blackfin arch: Ad...
411
412
  		verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx
  ",
1394f0322   Bryan Wu   blackfin architec...
413
  			(fp->seqstat & SEQSTAT_EXCAUSE));
a5ac01292   Sonic Zhang   Blackfin arch: ad...
414
  		CHK_DEBUGGER_TRAP_MAYBE();
1394f0322   Bryan Wu   blackfin architec...
415
416
  		break;
  	}
226eb1ef5   Robin Getz   Blackfin arch: cl...
417
  	BUG_ON(sig == 0);
82bd1d7d4   Mike Frysinger   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   Mike Frysinger   Blackfin: push do...
424
  	}
226eb1ef5   Robin Getz   Blackfin arch: cl...
425
  	if (sig != SIGTRAP) {
15627bd35   Mike Frysinger   Blackfin: restore...
426
427
  		if (strerror)
  			verbose_printk(strerror);
49dce9124   Mike Frysinger   Blackfin arch: sp...
428
  		dump_bfin_process(fp);
b03b08ba9   Robin Getz   [Blackfin] arch: ...
429
  		dump_bfin_mem(fp);
49dce9124   Mike Frysinger   Blackfin arch: sp...
430
  		show_regs(fp);
226eb1ef5   Robin Getz   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   Robin Getz   Blackfin arch: Ad...
435
  			verbose_printk(KERN_NOTICE "No trace since you do not have "
ad361c988   Joe Perches   Remove multiple K...
436
437
438
  			       "CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled
  
  ");
226eb1ef5   Robin Getz   Blackfin arch: cl...
439
440
441
  		else
  #endif
  			dump_bfin_trace_buffer();
f09630bff   Robin Getz   Blackfin arch: Ad...
442

226eb1ef5   Robin Getz   Blackfin arch: cl...
443
  		if (oops_in_progress) {
f09630bff   Robin Getz   Blackfin arch: Ad...
444
  			/* Dump the current kernel stack */
ad361c988   Joe Perches   Remove multiple K...
445
446
  			verbose_printk(KERN_NOTICE "Kernel Stack
  ");
f09630bff   Robin Getz   Blackfin arch: Ad...
447
  			show_stack(current, NULL);
aee3a2924   Robin Getz   [Blackfin] arch: ...
448
  			print_modules();
226eb1ef5   Robin Getz   Blackfin arch: cl...
449
  #ifndef CONFIG_ACCESS_CHECK
9f06c38fb   Robin Getz   Blackfin arch: Ad...
450
  			verbose_printk(KERN_EMERG "Please turn on "
90c7f4686   Robin Getz   Blackfin arch: cl...
451
452
  			       "CONFIG_ACCESS_CHECK
  ");
226eb1ef5   Robin Getz   Blackfin arch: cl...
453
  #endif
1394f0322   Bryan Wu   blackfin architec...
454
  			panic("Kernel exception");
f09630bff   Robin Getz   Blackfin arch: Ad...
455
  		} else {
4ee1c4533   Robin Getz   Blackfin arch: Fi...
456
  #ifdef CONFIG_DEBUG_VERBOSE
9f06c38fb   Robin Getz   Blackfin arch: Ad...
457
  			unsigned long *stack;
f09630bff   Robin Getz   Blackfin arch: Ad...
458
459
  			/* Dump the user space stack */
  			stack = (unsigned long *)rdusp();
9f06c38fb   Robin Getz   Blackfin arch: Ad...
460
461
  			verbose_printk(KERN_NOTICE "Userspace Stack
  ");
f09630bff   Robin Getz   Blackfin arch: Ad...
462
  			show_stack(NULL, stack);
9f06c38fb   Robin Getz   Blackfin arch: Ad...
463
  #endif
226eb1ef5   Robin Getz   Blackfin arch: cl...
464
  		}
1394f0322   Bryan Wu   blackfin architec...
465
  	}
fb322915a   Robin Getz   Blackfin arch: fi...
466

6a01f2303   Yi Li   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   Barry Song   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   Yi Li   Blackfin arch: m...
484
485
  		force_sig_info(sig, &info, current);
  	}
1394f0322   Bryan Wu   blackfin architec...
486

0e4edcf0b   Robin Getz   Blackfin: work ar...
487
  	if ((ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) ||
f574a76a3   Robin Getz   Blackfin: work ar...
488
489
  	    (ANOMALY_05000281 && trapnr == VEC_HWERR) ||
  	    (ANOMALY_05000189 && (trapnr == VEC_CPLB_I_VL || trapnr == VEC_CPLB_VL)))
0acad8dfe   Robin Getz   Blackfin: add wor...
490
  		fp->pc = SAFE_USER_INSTRUCTION;
6510a20e1   Mike Frysinger   Blackfin: fix tra...
491
   traps_done:
1394f0322   Bryan Wu   blackfin architec...
492
  	trace_buffer_restore(j);
1394f0322   Bryan Wu   blackfin architec...
493
  }
2a12c4632   Robin Getz   Blackfin: split k...
494
  asmlinkage void double_fault_c(struct pt_regs *fp)
1394f0322   Bryan Wu   blackfin architec...
495
  {
518039bc2   Robin Getz   Blackfin arch: Ad...
496
  #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON
2a12c4632   Robin Getz   Blackfin: split k...
497
498
  	int j;
  	trace_buffer_save(j);
518039bc2   Robin Getz   Blackfin arch: Ad...
499
  #endif
1394f0322   Bryan Wu   blackfin architec...
500

2a12c4632   Robin Getz   Blackfin: split k...
501
502
  	console_verbose();
  	oops_in_progress = 1;
9f06c38fb   Robin Getz   Blackfin arch: Ad...
503
  #ifdef CONFIG_DEBUG_VERBOSE
2a12c4632   Robin Getz   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   Robin Getz   [Blackfin] arch: ...
520

2a12c4632   Robin Getz   Blackfin: split k...
521
522
523
  		decode_address(buf, fp->retx);
  		printk(KERN_NOTICE "The instruction at %s caused a double exception
  ", buf);
49dce9124   Mike Frysinger   Blackfin arch: sp...
524
  	} else
9ba3c24f1   Robin Getz   Blackfin: include...
525
  #endif
2a12c4632   Robin Getz   Blackfin: split k...
526
527
528
529
530
  	{
  		dump_bfin_process(fp);
  		dump_bfin_mem(fp);
  		show_regs(fp);
  		dump_bfin_trace_buffer();
226eb1ef5   Robin Getz   Blackfin arch: cl...
531
  	}
1394f0322   Bryan Wu   blackfin architec...
532
  #endif
2a12c4632   Robin Getz   Blackfin: split k...
533
  	panic("Double Fault - unrecoverable event");
1394f0322   Bryan Wu   blackfin architec...
534

1394f0322   Bryan Wu   blackfin architec...
535
  }
1ffe6646b   Mike Frysinger   Blackfin arch: ad...
536

1394f0322   Bryan Wu   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   Robin Getz   Blackfin arch: cl...
553
  	oops_in_progress = 1;
49dce9124   Mike Frysinger   Blackfin arch: sp...
554
  	dump_bfin_process(fp);
b03b08ba9   Robin Getz   [Blackfin] arch: ...
555
  	dump_bfin_mem(fp);
49dce9124   Mike Frysinger   Blackfin arch: sp...
556
  	show_regs(fp);
1394f0322   Bryan Wu   blackfin architec...
557
  	dump_stack();
d8804adf5   Mike Frysinger   Blackfin: do not ...
558
  	panic("Unrecoverable event");
1394f0322   Bryan Wu   blackfin architec...
559
  }
2a12c4632   Robin Getz   Blackfin: split k...
560
561
562
563
  
  #ifdef CONFIG_BUG
  int is_valid_bugaddr(unsigned long addr)
  {
9a95e2f10   Robin Getz   Blackfin: make ha...
564
  	unsigned int opcode;
2a12c4632   Robin Getz   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   Robin Getz   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