Merge branch 'fix/misc' into for-linus
[pandora-kernel.git] / arch / sparc / kernel / traps_64.c
1 /* arch/sparc64/kernel/traps.c
2  *
3  * Copyright (C) 1995,1997,2008,2009 David S. Miller (davem@davemloft.net)
4  * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com)
5  */
6
7 /*
8  * I like traps on v9, :))))
9  */
10
11 #include <linux/module.h>
12 #include <linux/sched.h>
13 #include <linux/linkage.h>
14 #include <linux/kernel.h>
15 #include <linux/signal.h>
16 #include <linux/smp.h>
17 #include <linux/mm.h>
18 #include <linux/init.h>
19 #include <linux/kdebug.h>
20 #include <linux/gfp.h>
21
22 #include <asm/smp.h>
23 #include <asm/delay.h>
24 #include <asm/system.h>
25 #include <asm/ptrace.h>
26 #include <asm/oplib.h>
27 #include <asm/page.h>
28 #include <asm/pgtable.h>
29 #include <asm/unistd.h>
30 #include <asm/uaccess.h>
31 #include <asm/fpumacro.h>
32 #include <asm/lsu.h>
33 #include <asm/dcu.h>
34 #include <asm/estate.h>
35 #include <asm/chafsr.h>
36 #include <asm/sfafsr.h>
37 #include <asm/psrcompat.h>
38 #include <asm/processor.h>
39 #include <asm/timer.h>
40 #include <asm/head.h>
41 #include <asm/prom.h>
42 #include <asm/memctrl.h>
43
44 #include "entry.h"
45 #include "kstack.h"
46
47 /* When an irrecoverable trap occurs at tl > 0, the trap entry
48  * code logs the trap state registers at every level in the trap
49  * stack.  It is found at (pt_regs + sizeof(pt_regs)) and the layout
50  * is as follows:
51  */
52 struct tl1_traplog {
53         struct {
54                 unsigned long tstate;
55                 unsigned long tpc;
56                 unsigned long tnpc;
57                 unsigned long tt;
58         } trapstack[4];
59         unsigned long tl;
60 };
61
62 static void dump_tl1_traplog(struct tl1_traplog *p)
63 {
64         int i, limit;
65
66         printk(KERN_EMERG "TRAPLOG: Error at trap level 0x%lx, "
67                "dumping track stack.\n", p->tl);
68
69         limit = (tlb_type == hypervisor) ? 2 : 4;
70         for (i = 0; i < limit; i++) {
71                 printk(KERN_EMERG
72                        "TRAPLOG: Trap level %d TSTATE[%016lx] TPC[%016lx] "
73                        "TNPC[%016lx] TT[%lx]\n",
74                        i + 1,
75                        p->trapstack[i].tstate, p->trapstack[i].tpc,
76                        p->trapstack[i].tnpc, p->trapstack[i].tt);
77                 printk("TRAPLOG: TPC<%pS>\n", (void *) p->trapstack[i].tpc);
78         }
79 }
80
81 void bad_trap(struct pt_regs *regs, long lvl)
82 {
83         char buffer[32];
84         siginfo_t info;
85
86         if (notify_die(DIE_TRAP, "bad trap", regs,
87                        0, lvl, SIGTRAP) == NOTIFY_STOP)
88                 return;
89
90         if (lvl < 0x100) {
91                 sprintf(buffer, "Bad hw trap %lx at tl0\n", lvl);
92                 die_if_kernel(buffer, regs);
93         }
94
95         lvl -= 0x100;
96         if (regs->tstate & TSTATE_PRIV) {
97                 sprintf(buffer, "Kernel bad sw trap %lx", lvl);
98                 die_if_kernel(buffer, regs);
99         }
100         if (test_thread_flag(TIF_32BIT)) {
101                 regs->tpc &= 0xffffffff;
102                 regs->tnpc &= 0xffffffff;
103         }
104         info.si_signo = SIGILL;
105         info.si_errno = 0;
106         info.si_code = ILL_ILLTRP;
107         info.si_addr = (void __user *)regs->tpc;
108         info.si_trapno = lvl;
109         force_sig_info(SIGILL, &info, current);
110 }
111
112 void bad_trap_tl1(struct pt_regs *regs, long lvl)
113 {
114         char buffer[32];
115         
116         if (notify_die(DIE_TRAP_TL1, "bad trap tl1", regs,
117                        0, lvl, SIGTRAP) == NOTIFY_STOP)
118                 return;
119
120         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
121
122         sprintf (buffer, "Bad trap %lx at tl>0", lvl);
123         die_if_kernel (buffer, regs);
124 }
125
126 #ifdef CONFIG_DEBUG_BUGVERBOSE
127 void do_BUG(const char *file, int line)
128 {
129         bust_spinlocks(1);
130         printk("kernel BUG at %s:%d!\n", file, line);
131 }
132 EXPORT_SYMBOL(do_BUG);
133 #endif
134
135 static DEFINE_SPINLOCK(dimm_handler_lock);
136 static dimm_printer_t dimm_handler;
137
138 static int sprintf_dimm(int synd_code, unsigned long paddr, char *buf, int buflen)
139 {
140         unsigned long flags;
141         int ret = -ENODEV;
142
143         spin_lock_irqsave(&dimm_handler_lock, flags);
144         if (dimm_handler) {
145                 ret = dimm_handler(synd_code, paddr, buf, buflen);
146         } else if (tlb_type == spitfire) {
147                 if (prom_getunumber(synd_code, paddr, buf, buflen) == -1)
148                         ret = -EINVAL;
149                 else
150                         ret = 0;
151         } else
152                 ret = -ENODEV;
153         spin_unlock_irqrestore(&dimm_handler_lock, flags);
154
155         return ret;
156 }
157
158 int register_dimm_printer(dimm_printer_t func)
159 {
160         unsigned long flags;
161         int ret = 0;
162
163         spin_lock_irqsave(&dimm_handler_lock, flags);
164         if (!dimm_handler)
165                 dimm_handler = func;
166         else
167                 ret = -EEXIST;
168         spin_unlock_irqrestore(&dimm_handler_lock, flags);
169
170         return ret;
171 }
172 EXPORT_SYMBOL_GPL(register_dimm_printer);
173
174 void unregister_dimm_printer(dimm_printer_t func)
175 {
176         unsigned long flags;
177
178         spin_lock_irqsave(&dimm_handler_lock, flags);
179         if (dimm_handler == func)
180                 dimm_handler = NULL;
181         spin_unlock_irqrestore(&dimm_handler_lock, flags);
182 }
183 EXPORT_SYMBOL_GPL(unregister_dimm_printer);
184
185 void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
186 {
187         siginfo_t info;
188
189         if (notify_die(DIE_TRAP, "instruction access exception", regs,
190                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
191                 return;
192
193         if (regs->tstate & TSTATE_PRIV) {
194                 printk("spitfire_insn_access_exception: SFSR[%016lx] "
195                        "SFAR[%016lx], going.\n", sfsr, sfar);
196                 die_if_kernel("Iax", regs);
197         }
198         if (test_thread_flag(TIF_32BIT)) {
199                 regs->tpc &= 0xffffffff;
200                 regs->tnpc &= 0xffffffff;
201         }
202         info.si_signo = SIGSEGV;
203         info.si_errno = 0;
204         info.si_code = SEGV_MAPERR;
205         info.si_addr = (void __user *)regs->tpc;
206         info.si_trapno = 0;
207         force_sig_info(SIGSEGV, &info, current);
208 }
209
210 void spitfire_insn_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
211 {
212         if (notify_die(DIE_TRAP_TL1, "instruction access exception tl1", regs,
213                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
214                 return;
215
216         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
217         spitfire_insn_access_exception(regs, sfsr, sfar);
218 }
219
220 void sun4v_insn_access_exception(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)
221 {
222         unsigned short type = (type_ctx >> 16);
223         unsigned short ctx  = (type_ctx & 0xffff);
224         siginfo_t info;
225
226         if (notify_die(DIE_TRAP, "instruction access exception", regs,
227                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
228                 return;
229
230         if (regs->tstate & TSTATE_PRIV) {
231                 printk("sun4v_insn_access_exception: ADDR[%016lx] "
232                        "CTX[%04x] TYPE[%04x], going.\n",
233                        addr, ctx, type);
234                 die_if_kernel("Iax", regs);
235         }
236
237         if (test_thread_flag(TIF_32BIT)) {
238                 regs->tpc &= 0xffffffff;
239                 regs->tnpc &= 0xffffffff;
240         }
241         info.si_signo = SIGSEGV;
242         info.si_errno = 0;
243         info.si_code = SEGV_MAPERR;
244         info.si_addr = (void __user *) addr;
245         info.si_trapno = 0;
246         force_sig_info(SIGSEGV, &info, current);
247 }
248
249 void sun4v_insn_access_exception_tl1(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)
250 {
251         if (notify_die(DIE_TRAP_TL1, "instruction access exception tl1", regs,
252                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
253                 return;
254
255         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
256         sun4v_insn_access_exception(regs, addr, type_ctx);
257 }
258
259 void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
260 {
261         siginfo_t info;
262
263         if (notify_die(DIE_TRAP, "data access exception", regs,
264                        0, 0x30, SIGTRAP) == NOTIFY_STOP)
265                 return;
266
267         if (regs->tstate & TSTATE_PRIV) {
268                 /* Test if this comes from uaccess places. */
269                 const struct exception_table_entry *entry;
270
271                 entry = search_exception_tables(regs->tpc);
272                 if (entry) {
273                         /* Ouch, somebody is trying VM hole tricks on us... */
274 #ifdef DEBUG_EXCEPTIONS
275                         printk("Exception: PC<%016lx> faddr<UNKNOWN>\n", regs->tpc);
276                         printk("EX_TABLE: insn<%016lx> fixup<%016lx>\n",
277                                regs->tpc, entry->fixup);
278 #endif
279                         regs->tpc = entry->fixup;
280                         regs->tnpc = regs->tpc + 4;
281                         return;
282                 }
283                 /* Shit... */
284                 printk("spitfire_data_access_exception: SFSR[%016lx] "
285                        "SFAR[%016lx], going.\n", sfsr, sfar);
286                 die_if_kernel("Dax", regs);
287         }
288
289         info.si_signo = SIGSEGV;
290         info.si_errno = 0;
291         info.si_code = SEGV_MAPERR;
292         info.si_addr = (void __user *)sfar;
293         info.si_trapno = 0;
294         force_sig_info(SIGSEGV, &info, current);
295 }
296
297 void spitfire_data_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
298 {
299         if (notify_die(DIE_TRAP_TL1, "data access exception tl1", regs,
300                        0, 0x30, SIGTRAP) == NOTIFY_STOP)
301                 return;
302
303         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
304         spitfire_data_access_exception(regs, sfsr, sfar);
305 }
306
307 void sun4v_data_access_exception(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)
308 {
309         unsigned short type = (type_ctx >> 16);
310         unsigned short ctx  = (type_ctx & 0xffff);
311         siginfo_t info;
312
313         if (notify_die(DIE_TRAP, "data access exception", regs,
314                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
315                 return;
316
317         if (regs->tstate & TSTATE_PRIV) {
318                 /* Test if this comes from uaccess places. */
319                 const struct exception_table_entry *entry;
320
321                 entry = search_exception_tables(regs->tpc);
322                 if (entry) {
323                         /* Ouch, somebody is trying VM hole tricks on us... */
324 #ifdef DEBUG_EXCEPTIONS
325                         printk("Exception: PC<%016lx> faddr<UNKNOWN>\n", regs->tpc);
326                         printk("EX_TABLE: insn<%016lx> fixup<%016lx>\n",
327                                regs->tpc, entry->fixup);
328 #endif
329                         regs->tpc = entry->fixup;
330                         regs->tnpc = regs->tpc + 4;
331                         return;
332                 }
333                 printk("sun4v_data_access_exception: ADDR[%016lx] "
334                        "CTX[%04x] TYPE[%04x], going.\n",
335                        addr, ctx, type);
336                 die_if_kernel("Dax", regs);
337         }
338
339         if (test_thread_flag(TIF_32BIT)) {
340                 regs->tpc &= 0xffffffff;
341                 regs->tnpc &= 0xffffffff;
342         }
343         info.si_signo = SIGSEGV;
344         info.si_errno = 0;
345         info.si_code = SEGV_MAPERR;
346         info.si_addr = (void __user *) addr;
347         info.si_trapno = 0;
348         force_sig_info(SIGSEGV, &info, current);
349 }
350
351 void sun4v_data_access_exception_tl1(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)
352 {
353         if (notify_die(DIE_TRAP_TL1, "data access exception tl1", regs,
354                        0, 0x8, SIGTRAP) == NOTIFY_STOP)
355                 return;
356
357         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
358         sun4v_data_access_exception(regs, addr, type_ctx);
359 }
360
361 #ifdef CONFIG_PCI
362 #include "pci_impl.h"
363 #endif
364
365 /* When access exceptions happen, we must do this. */
366 static void spitfire_clean_and_reenable_l1_caches(void)
367 {
368         unsigned long va;
369
370         if (tlb_type != spitfire)
371                 BUG();
372
373         /* Clean 'em. */
374         for (va =  0; va < (PAGE_SIZE << 1); va += 32) {
375                 spitfire_put_icache_tag(va, 0x0);
376                 spitfire_put_dcache_tag(va, 0x0);
377         }
378
379         /* Re-enable in LSU. */
380         __asm__ __volatile__("flush %%g6\n\t"
381                              "membar #Sync\n\t"
382                              "stxa %0, [%%g0] %1\n\t"
383                              "membar #Sync"
384                              : /* no outputs */
385                              : "r" (LSU_CONTROL_IC | LSU_CONTROL_DC |
386                                     LSU_CONTROL_IM | LSU_CONTROL_DM),
387                              "i" (ASI_LSU_CONTROL)
388                              : "memory");
389 }
390
391 static void spitfire_enable_estate_errors(void)
392 {
393         __asm__ __volatile__("stxa      %0, [%%g0] %1\n\t"
394                              "membar    #Sync"
395                              : /* no outputs */
396                              : "r" (ESTATE_ERR_ALL),
397                                "i" (ASI_ESTATE_ERROR_EN));
398 }
399
400 static char ecc_syndrome_table[] = {
401         0x4c, 0x40, 0x41, 0x48, 0x42, 0x48, 0x48, 0x49,
402         0x43, 0x48, 0x48, 0x49, 0x48, 0x49, 0x49, 0x4a,
403         0x44, 0x48, 0x48, 0x20, 0x48, 0x39, 0x4b, 0x48,
404         0x48, 0x25, 0x31, 0x48, 0x28, 0x48, 0x48, 0x2c,
405         0x45, 0x48, 0x48, 0x21, 0x48, 0x3d, 0x04, 0x48,
406         0x48, 0x4b, 0x35, 0x48, 0x2d, 0x48, 0x48, 0x29,
407         0x48, 0x00, 0x01, 0x48, 0x0a, 0x48, 0x48, 0x4b,
408         0x0f, 0x48, 0x48, 0x4b, 0x48, 0x49, 0x49, 0x48,
409         0x46, 0x48, 0x48, 0x2a, 0x48, 0x3b, 0x27, 0x48,
410         0x48, 0x4b, 0x33, 0x48, 0x22, 0x48, 0x48, 0x2e,
411         0x48, 0x19, 0x1d, 0x48, 0x1b, 0x4a, 0x48, 0x4b,
412         0x1f, 0x48, 0x4a, 0x4b, 0x48, 0x4b, 0x4b, 0x48,
413         0x48, 0x4b, 0x24, 0x48, 0x07, 0x48, 0x48, 0x36,
414         0x4b, 0x48, 0x48, 0x3e, 0x48, 0x30, 0x38, 0x48,
415         0x49, 0x48, 0x48, 0x4b, 0x48, 0x4b, 0x16, 0x48,
416         0x48, 0x12, 0x4b, 0x48, 0x49, 0x48, 0x48, 0x4b,
417         0x47, 0x48, 0x48, 0x2f, 0x48, 0x3f, 0x4b, 0x48,
418         0x48, 0x06, 0x37, 0x48, 0x23, 0x48, 0x48, 0x2b,
419         0x48, 0x05, 0x4b, 0x48, 0x4b, 0x48, 0x48, 0x32,
420         0x26, 0x48, 0x48, 0x3a, 0x48, 0x34, 0x3c, 0x48,
421         0x48, 0x11, 0x15, 0x48, 0x13, 0x4a, 0x48, 0x4b,
422         0x17, 0x48, 0x4a, 0x4b, 0x48, 0x4b, 0x4b, 0x48,
423         0x49, 0x48, 0x48, 0x4b, 0x48, 0x4b, 0x1e, 0x48,
424         0x48, 0x1a, 0x4b, 0x48, 0x49, 0x48, 0x48, 0x4b,
425         0x48, 0x08, 0x0d, 0x48, 0x02, 0x48, 0x48, 0x49,
426         0x03, 0x48, 0x48, 0x49, 0x48, 0x4b, 0x4b, 0x48,
427         0x49, 0x48, 0x48, 0x49, 0x48, 0x4b, 0x10, 0x48,
428         0x48, 0x14, 0x4b, 0x48, 0x4b, 0x48, 0x48, 0x4b,
429         0x49, 0x48, 0x48, 0x49, 0x48, 0x4b, 0x18, 0x48,
430         0x48, 0x1c, 0x4b, 0x48, 0x4b, 0x48, 0x48, 0x4b,
431         0x4a, 0x0c, 0x09, 0x48, 0x0e, 0x48, 0x48, 0x4b,
432         0x0b, 0x48, 0x48, 0x4b, 0x48, 0x4b, 0x4b, 0x4a
433 };
434
435 static char *syndrome_unknown = "<Unknown>";
436
437 static void spitfire_log_udb_syndrome(unsigned long afar, unsigned long udbh, unsigned long udbl, unsigned long bit)
438 {
439         unsigned short scode;
440         char memmod_str[64], *p;
441
442         if (udbl & bit) {
443                 scode = ecc_syndrome_table[udbl & 0xff];
444                 if (sprintf_dimm(scode, afar, memmod_str, sizeof(memmod_str)) < 0)
445                         p = syndrome_unknown;
446                 else
447                         p = memmod_str;
448                 printk(KERN_WARNING "CPU[%d]: UDBL Syndrome[%x] "
449                        "Memory Module \"%s\"\n",
450                        smp_processor_id(), scode, p);
451         }
452
453         if (udbh & bit) {
454                 scode = ecc_syndrome_table[udbh & 0xff];
455                 if (sprintf_dimm(scode, afar, memmod_str, sizeof(memmod_str)) < 0)
456                         p = syndrome_unknown;
457                 else
458                         p = memmod_str;
459                 printk(KERN_WARNING "CPU[%d]: UDBH Syndrome[%x] "
460                        "Memory Module \"%s\"\n",
461                        smp_processor_id(), scode, p);
462         }
463
464 }
465
466 static void spitfire_cee_log(unsigned long afsr, unsigned long afar, unsigned long udbh, unsigned long udbl, int tl1, struct pt_regs *regs)
467 {
468
469         printk(KERN_WARNING "CPU[%d]: Correctable ECC Error "
470                "AFSR[%lx] AFAR[%016lx] UDBL[%lx] UDBH[%lx] TL>1[%d]\n",
471                smp_processor_id(), afsr, afar, udbl, udbh, tl1);
472
473         spitfire_log_udb_syndrome(afar, udbh, udbl, UDBE_CE);
474
475         /* We always log it, even if someone is listening for this
476          * trap.
477          */
478         notify_die(DIE_TRAP, "Correctable ECC Error", regs,
479                    0, TRAP_TYPE_CEE, SIGTRAP);
480
481         /* The Correctable ECC Error trap does not disable I/D caches.  So
482          * we only have to restore the ESTATE Error Enable register.
483          */
484         spitfire_enable_estate_errors();
485 }
486
487 static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned long udbh, unsigned long udbl, unsigned long tt, int tl1, struct pt_regs *regs)
488 {
489         siginfo_t info;
490
491         printk(KERN_WARNING "CPU[%d]: Uncorrectable Error AFSR[%lx] "
492                "AFAR[%lx] UDBL[%lx] UDBH[%ld] TT[%lx] TL>1[%d]\n",
493                smp_processor_id(), afsr, afar, udbl, udbh, tt, tl1);
494
495         /* XXX add more human friendly logging of the error status
496          * XXX as is implemented for cheetah
497          */
498
499         spitfire_log_udb_syndrome(afar, udbh, udbl, UDBE_UE);
500
501         /* We always log it, even if someone is listening for this
502          * trap.
503          */
504         notify_die(DIE_TRAP, "Uncorrectable Error", regs,
505                    0, tt, SIGTRAP);
506
507         if (regs->tstate & TSTATE_PRIV) {
508                 if (tl1)
509                         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
510                 die_if_kernel("UE", regs);
511         }
512
513         /* XXX need more intelligent processing here, such as is implemented
514          * XXX for cheetah errors, in fact if the E-cache still holds the
515          * XXX line with bad parity this will loop
516          */
517
518         spitfire_clean_and_reenable_l1_caches();
519         spitfire_enable_estate_errors();
520
521         if (test_thread_flag(TIF_32BIT)) {
522                 regs->tpc &= 0xffffffff;
523                 regs->tnpc &= 0xffffffff;
524         }
525         info.si_signo = SIGBUS;
526         info.si_errno = 0;
527         info.si_code = BUS_OBJERR;
528         info.si_addr = (void *)0;
529         info.si_trapno = 0;
530         force_sig_info(SIGBUS, &info, current);
531 }
532
533 void spitfire_access_error(struct pt_regs *regs, unsigned long status_encoded, unsigned long afar)
534 {
535         unsigned long afsr, tt, udbh, udbl;
536         int tl1;
537
538         afsr = (status_encoded & SFSTAT_AFSR_MASK) >> SFSTAT_AFSR_SHIFT;
539         tt = (status_encoded & SFSTAT_TRAP_TYPE) >> SFSTAT_TRAP_TYPE_SHIFT;
540         tl1 = (status_encoded & SFSTAT_TL_GT_ONE) ? 1 : 0;
541         udbl = (status_encoded & SFSTAT_UDBL_MASK) >> SFSTAT_UDBL_SHIFT;
542         udbh = (status_encoded & SFSTAT_UDBH_MASK) >> SFSTAT_UDBH_SHIFT;
543
544 #ifdef CONFIG_PCI
545         if (tt == TRAP_TYPE_DAE &&
546             pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) {
547                 spitfire_clean_and_reenable_l1_caches();
548                 spitfire_enable_estate_errors();
549
550                 pci_poke_faulted = 1;
551                 regs->tnpc = regs->tpc + 4;
552                 return;
553         }
554 #endif
555
556         if (afsr & SFAFSR_UE)
557                 spitfire_ue_log(afsr, afar, udbh, udbl, tt, tl1, regs);
558
559         if (tt == TRAP_TYPE_CEE) {
560                 /* Handle the case where we took a CEE trap, but ACK'd
561                  * only the UE state in the UDB error registers.
562                  */
563                 if (afsr & SFAFSR_UE) {
564                         if (udbh & UDBE_CE) {
565                                 __asm__ __volatile__(
566                                         "stxa   %0, [%1] %2\n\t"
567                                         "membar #Sync"
568                                         : /* no outputs */
569                                         : "r" (udbh & UDBE_CE),
570                                           "r" (0x0), "i" (ASI_UDB_ERROR_W));
571                         }
572                         if (udbl & UDBE_CE) {
573                                 __asm__ __volatile__(
574                                         "stxa   %0, [%1] %2\n\t"
575                                         "membar #Sync"
576                                         : /* no outputs */
577                                         : "r" (udbl & UDBE_CE),
578                                           "r" (0x18), "i" (ASI_UDB_ERROR_W));
579                         }
580                 }
581
582                 spitfire_cee_log(afsr, afar, udbh, udbl, tl1, regs);
583         }
584 }
585
586 int cheetah_pcache_forced_on;
587
588 void cheetah_enable_pcache(void)
589 {
590         unsigned long dcr;
591
592         printk("CHEETAH: Enabling P-Cache on cpu %d.\n",
593                smp_processor_id());
594
595         __asm__ __volatile__("ldxa [%%g0] %1, %0"
596                              : "=r" (dcr)
597                              : "i" (ASI_DCU_CONTROL_REG));
598         dcr |= (DCU_PE | DCU_HPE | DCU_SPE | DCU_SL);
599         __asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
600                              "membar #Sync"
601                              : /* no outputs */
602                              : "r" (dcr), "i" (ASI_DCU_CONTROL_REG));
603 }
604
605 /* Cheetah error trap handling. */
606 static unsigned long ecache_flush_physbase;
607 static unsigned long ecache_flush_linesize;
608 static unsigned long ecache_flush_size;
609
610 /* This table is ordered in priority of errors and matches the
611  * AFAR overwrite policy as well.
612  */
613
614 struct afsr_error_table {
615         unsigned long mask;
616         const char *name;
617 };
618
619 static const char CHAFSR_PERR_msg[] =
620         "System interface protocol error";
621 static const char CHAFSR_IERR_msg[] =
622         "Internal processor error";
623 static const char CHAFSR_ISAP_msg[] =
624         "System request parity error on incoming addresss";
625 static const char CHAFSR_UCU_msg[] =
626         "Uncorrectable E-cache ECC error for ifetch/data";
627 static const char CHAFSR_UCC_msg[] =
628         "SW Correctable E-cache ECC error for ifetch/data";
629 static const char CHAFSR_UE_msg[] =
630         "Uncorrectable system bus data ECC error for read";
631 static const char CHAFSR_EDU_msg[] =
632         "Uncorrectable E-cache ECC error for stmerge/blkld";
633 static const char CHAFSR_EMU_msg[] =
634         "Uncorrectable system bus MTAG error";
635 static const char CHAFSR_WDU_msg[] =
636         "Uncorrectable E-cache ECC error for writeback";
637 static const char CHAFSR_CPU_msg[] =
638         "Uncorrectable ECC error for copyout";
639 static const char CHAFSR_CE_msg[] =
640         "HW corrected system bus data ECC error for read";
641 static const char CHAFSR_EDC_msg[] =
642         "HW corrected E-cache ECC error for stmerge/blkld";
643 static const char CHAFSR_EMC_msg[] =
644         "HW corrected system bus MTAG ECC error";
645 static const char CHAFSR_WDC_msg[] =
646         "HW corrected E-cache ECC error for writeback";
647 static const char CHAFSR_CPC_msg[] =
648         "HW corrected ECC error for copyout";
649 static const char CHAFSR_TO_msg[] =
650         "Unmapped error from system bus";
651 static const char CHAFSR_BERR_msg[] =
652         "Bus error response from system bus";
653 static const char CHAFSR_IVC_msg[] =
654         "HW corrected system bus data ECC error for ivec read";
655 static const char CHAFSR_IVU_msg[] =
656         "Uncorrectable system bus data ECC error for ivec read";
657 static struct afsr_error_table __cheetah_error_table[] = {
658         {       CHAFSR_PERR,    CHAFSR_PERR_msg         },
659         {       CHAFSR_IERR,    CHAFSR_IERR_msg         },
660         {       CHAFSR_ISAP,    CHAFSR_ISAP_msg         },
661         {       CHAFSR_UCU,     CHAFSR_UCU_msg          },
662         {       CHAFSR_UCC,     CHAFSR_UCC_msg          },
663         {       CHAFSR_UE,      CHAFSR_UE_msg           },
664         {       CHAFSR_EDU,     CHAFSR_EDU_msg          },
665         {       CHAFSR_EMU,     CHAFSR_EMU_msg          },
666         {       CHAFSR_WDU,     CHAFSR_WDU_msg          },
667         {       CHAFSR_CPU,     CHAFSR_CPU_msg          },
668         {       CHAFSR_CE,      CHAFSR_CE_msg           },
669         {       CHAFSR_EDC,     CHAFSR_EDC_msg          },
670         {       CHAFSR_EMC,     CHAFSR_EMC_msg          },
671         {       CHAFSR_WDC,     CHAFSR_WDC_msg          },
672         {       CHAFSR_CPC,     CHAFSR_CPC_msg          },
673         {       CHAFSR_TO,      CHAFSR_TO_msg           },
674         {       CHAFSR_BERR,    CHAFSR_BERR_msg         },
675         /* These two do not update the AFAR. */
676         {       CHAFSR_IVC,     CHAFSR_IVC_msg          },
677         {       CHAFSR_IVU,     CHAFSR_IVU_msg          },
678         {       0,              NULL                    },
679 };
680 static const char CHPAFSR_DTO_msg[] =
681         "System bus unmapped error for prefetch/storequeue-read";
682 static const char CHPAFSR_DBERR_msg[] =
683         "System bus error for prefetch/storequeue-read";
684 static const char CHPAFSR_THCE_msg[] =
685         "Hardware corrected E-cache Tag ECC error";
686 static const char CHPAFSR_TSCE_msg[] =
687         "SW handled correctable E-cache Tag ECC error";
688 static const char CHPAFSR_TUE_msg[] =
689         "Uncorrectable E-cache Tag ECC error";
690 static const char CHPAFSR_DUE_msg[] =
691         "System bus uncorrectable data ECC error due to prefetch/store-fill";
692 static struct afsr_error_table __cheetah_plus_error_table[] = {
693         {       CHAFSR_PERR,    CHAFSR_PERR_msg         },
694         {       CHAFSR_IERR,    CHAFSR_IERR_msg         },
695         {       CHAFSR_ISAP,    CHAFSR_ISAP_msg         },
696         {       CHAFSR_UCU,     CHAFSR_UCU_msg          },
697         {       CHAFSR_UCC,     CHAFSR_UCC_msg          },
698         {       CHAFSR_UE,      CHAFSR_UE_msg           },
699         {       CHAFSR_EDU,     CHAFSR_EDU_msg          },
700         {       CHAFSR_EMU,     CHAFSR_EMU_msg          },
701         {       CHAFSR_WDU,     CHAFSR_WDU_msg          },
702         {       CHAFSR_CPU,     CHAFSR_CPU_msg          },
703         {       CHAFSR_CE,      CHAFSR_CE_msg           },
704         {       CHAFSR_EDC,     CHAFSR_EDC_msg          },
705         {       CHAFSR_EMC,     CHAFSR_EMC_msg          },
706         {       CHAFSR_WDC,     CHAFSR_WDC_msg          },
707         {       CHAFSR_CPC,     CHAFSR_CPC_msg          },
708         {       CHAFSR_TO,      CHAFSR_TO_msg           },
709         {       CHAFSR_BERR,    CHAFSR_BERR_msg         },
710         {       CHPAFSR_DTO,    CHPAFSR_DTO_msg         },
711         {       CHPAFSR_DBERR,  CHPAFSR_DBERR_msg       },
712         {       CHPAFSR_THCE,   CHPAFSR_THCE_msg        },
713         {       CHPAFSR_TSCE,   CHPAFSR_TSCE_msg        },
714         {       CHPAFSR_TUE,    CHPAFSR_TUE_msg         },
715         {       CHPAFSR_DUE,    CHPAFSR_DUE_msg         },
716         /* These two do not update the AFAR. */
717         {       CHAFSR_IVC,     CHAFSR_IVC_msg          },
718         {       CHAFSR_IVU,     CHAFSR_IVU_msg          },
719         {       0,              NULL                    },
720 };
721 static const char JPAFSR_JETO_msg[] =
722         "System interface protocol error, hw timeout caused";
723 static const char JPAFSR_SCE_msg[] =
724         "Parity error on system snoop results";
725 static const char JPAFSR_JEIC_msg[] =
726         "System interface protocol error, illegal command detected";
727 static const char JPAFSR_JEIT_msg[] =
728         "System interface protocol error, illegal ADTYPE detected";
729 static const char JPAFSR_OM_msg[] =
730         "Out of range memory error has occurred";
731 static const char JPAFSR_ETP_msg[] =
732         "Parity error on L2 cache tag SRAM";
733 static const char JPAFSR_UMS_msg[] =
734         "Error due to unsupported store";
735 static const char JPAFSR_RUE_msg[] =
736         "Uncorrectable ECC error from remote cache/memory";
737 static const char JPAFSR_RCE_msg[] =
738         "Correctable ECC error from remote cache/memory";
739 static const char JPAFSR_BP_msg[] =
740         "JBUS parity error on returned read data";
741 static const char JPAFSR_WBP_msg[] =
742         "JBUS parity error on data for writeback or block store";
743 static const char JPAFSR_FRC_msg[] =
744         "Foreign read to DRAM incurring correctable ECC error";
745 static const char JPAFSR_FRU_msg[] =
746         "Foreign read to DRAM incurring uncorrectable ECC error";
747 static struct afsr_error_table __jalapeno_error_table[] = {
748         {       JPAFSR_JETO,    JPAFSR_JETO_msg         },
749         {       JPAFSR_SCE,     JPAFSR_SCE_msg          },
750         {       JPAFSR_JEIC,    JPAFSR_JEIC_msg         },
751         {       JPAFSR_JEIT,    JPAFSR_JEIT_msg         },
752         {       CHAFSR_PERR,    CHAFSR_PERR_msg         },
753         {       CHAFSR_IERR,    CHAFSR_IERR_msg         },
754         {       CHAFSR_ISAP,    CHAFSR_ISAP_msg         },
755         {       CHAFSR_UCU,     CHAFSR_UCU_msg          },
756         {       CHAFSR_UCC,     CHAFSR_UCC_msg          },
757         {       CHAFSR_UE,      CHAFSR_UE_msg           },
758         {       CHAFSR_EDU,     CHAFSR_EDU_msg          },
759         {       JPAFSR_OM,      JPAFSR_OM_msg           },
760         {       CHAFSR_WDU,     CHAFSR_WDU_msg          },
761         {       CHAFSR_CPU,     CHAFSR_CPU_msg          },
762         {       CHAFSR_CE,      CHAFSR_CE_msg           },
763         {       CHAFSR_EDC,     CHAFSR_EDC_msg          },
764         {       JPAFSR_ETP,     JPAFSR_ETP_msg          },
765         {       CHAFSR_WDC,     CHAFSR_WDC_msg          },
766         {       CHAFSR_CPC,     CHAFSR_CPC_msg          },
767         {       CHAFSR_TO,      CHAFSR_TO_msg           },
768         {       CHAFSR_BERR,    CHAFSR_BERR_msg         },
769         {       JPAFSR_UMS,     JPAFSR_UMS_msg          },
770         {       JPAFSR_RUE,     JPAFSR_RUE_msg          },
771         {       JPAFSR_RCE,     JPAFSR_RCE_msg          },
772         {       JPAFSR_BP,      JPAFSR_BP_msg           },
773         {       JPAFSR_WBP,     JPAFSR_WBP_msg          },
774         {       JPAFSR_FRC,     JPAFSR_FRC_msg          },
775         {       JPAFSR_FRU,     JPAFSR_FRU_msg          },
776         /* These two do not update the AFAR. */
777         {       CHAFSR_IVU,     CHAFSR_IVU_msg          },
778         {       0,              NULL                    },
779 };
780 static struct afsr_error_table *cheetah_error_table;
781 static unsigned long cheetah_afsr_errors;
782
783 struct cheetah_err_info *cheetah_error_log;
784
785 static inline struct cheetah_err_info *cheetah_get_error_log(unsigned long afsr)
786 {
787         struct cheetah_err_info *p;
788         int cpu = smp_processor_id();
789
790         if (!cheetah_error_log)
791                 return NULL;
792
793         p = cheetah_error_log + (cpu * 2);
794         if ((afsr & CHAFSR_TL1) != 0UL)
795                 p++;
796
797         return p;
798 }
799
800 extern unsigned int tl0_icpe[], tl1_icpe[];
801 extern unsigned int tl0_dcpe[], tl1_dcpe[];
802 extern unsigned int tl0_fecc[], tl1_fecc[];
803 extern unsigned int tl0_cee[], tl1_cee[];
804 extern unsigned int tl0_iae[], tl1_iae[];
805 extern unsigned int tl0_dae[], tl1_dae[];
806 extern unsigned int cheetah_plus_icpe_trap_vector[], cheetah_plus_icpe_trap_vector_tl1[];
807 extern unsigned int cheetah_plus_dcpe_trap_vector[], cheetah_plus_dcpe_trap_vector_tl1[];
808 extern unsigned int cheetah_fecc_trap_vector[], cheetah_fecc_trap_vector_tl1[];
809 extern unsigned int cheetah_cee_trap_vector[], cheetah_cee_trap_vector_tl1[];
810 extern unsigned int cheetah_deferred_trap_vector[], cheetah_deferred_trap_vector_tl1[];
811
812 void __init cheetah_ecache_flush_init(void)
813 {
814         unsigned long largest_size, smallest_linesize, order, ver;
815         int i, sz;
816
817         /* Scan all cpu device tree nodes, note two values:
818          * 1) largest E-cache size
819          * 2) smallest E-cache line size
820          */
821         largest_size = 0UL;
822         smallest_linesize = ~0UL;
823
824         for (i = 0; i < NR_CPUS; i++) {
825                 unsigned long val;
826
827                 val = cpu_data(i).ecache_size;
828                 if (!val)
829                         continue;
830
831                 if (val > largest_size)
832                         largest_size = val;
833
834                 val = cpu_data(i).ecache_line_size;
835                 if (val < smallest_linesize)
836                         smallest_linesize = val;
837
838         }
839
840         if (largest_size == 0UL || smallest_linesize == ~0UL) {
841                 prom_printf("cheetah_ecache_flush_init: Cannot probe cpu E-cache "
842                             "parameters.\n");
843                 prom_halt();
844         }
845
846         ecache_flush_size = (2 * largest_size);
847         ecache_flush_linesize = smallest_linesize;
848
849         ecache_flush_physbase = find_ecache_flush_span(ecache_flush_size);
850
851         if (ecache_flush_physbase == ~0UL) {
852                 prom_printf("cheetah_ecache_flush_init: Cannot find %d byte "
853                             "contiguous physical memory.\n",
854                             ecache_flush_size);
855                 prom_halt();
856         }
857
858         /* Now allocate error trap reporting scoreboard. */
859         sz = NR_CPUS * (2 * sizeof(struct cheetah_err_info));
860         for (order = 0; order < MAX_ORDER; order++) {
861                 if ((PAGE_SIZE << order) >= sz)
862                         break;
863         }
864         cheetah_error_log = (struct cheetah_err_info *)
865                 __get_free_pages(GFP_KERNEL, order);
866         if (!cheetah_error_log) {
867                 prom_printf("cheetah_ecache_flush_init: Failed to allocate "
868                             "error logging scoreboard (%d bytes).\n", sz);
869                 prom_halt();
870         }
871         memset(cheetah_error_log, 0, PAGE_SIZE << order);
872
873         /* Mark all AFSRs as invalid so that the trap handler will
874          * log new new information there.
875          */
876         for (i = 0; i < 2 * NR_CPUS; i++)
877                 cheetah_error_log[i].afsr = CHAFSR_INVALID;
878
879         __asm__ ("rdpr %%ver, %0" : "=r" (ver));
880         if ((ver >> 32) == __JALAPENO_ID ||
881             (ver >> 32) == __SERRANO_ID) {
882                 cheetah_error_table = &__jalapeno_error_table[0];
883                 cheetah_afsr_errors = JPAFSR_ERRORS;
884         } else if ((ver >> 32) == 0x003e0015) {
885                 cheetah_error_table = &__cheetah_plus_error_table[0];
886                 cheetah_afsr_errors = CHPAFSR_ERRORS;
887         } else {
888                 cheetah_error_table = &__cheetah_error_table[0];
889                 cheetah_afsr_errors = CHAFSR_ERRORS;
890         }
891
892         /* Now patch trap tables. */
893         memcpy(tl0_fecc, cheetah_fecc_trap_vector, (8 * 4));
894         memcpy(tl1_fecc, cheetah_fecc_trap_vector_tl1, (8 * 4));
895         memcpy(tl0_cee, cheetah_cee_trap_vector, (8 * 4));
896         memcpy(tl1_cee, cheetah_cee_trap_vector_tl1, (8 * 4));
897         memcpy(tl0_iae, cheetah_deferred_trap_vector, (8 * 4));
898         memcpy(tl1_iae, cheetah_deferred_trap_vector_tl1, (8 * 4));
899         memcpy(tl0_dae, cheetah_deferred_trap_vector, (8 * 4));
900         memcpy(tl1_dae, cheetah_deferred_trap_vector_tl1, (8 * 4));
901         if (tlb_type == cheetah_plus) {
902                 memcpy(tl0_dcpe, cheetah_plus_dcpe_trap_vector, (8 * 4));
903                 memcpy(tl1_dcpe, cheetah_plus_dcpe_trap_vector_tl1, (8 * 4));
904                 memcpy(tl0_icpe, cheetah_plus_icpe_trap_vector, (8 * 4));
905                 memcpy(tl1_icpe, cheetah_plus_icpe_trap_vector_tl1, (8 * 4));
906         }
907         flushi(PAGE_OFFSET);
908 }
909
910 static void cheetah_flush_ecache(void)
911 {
912         unsigned long flush_base = ecache_flush_physbase;
913         unsigned long flush_linesize = ecache_flush_linesize;
914         unsigned long flush_size = ecache_flush_size;
915
916         __asm__ __volatile__("1: subcc  %0, %4, %0\n\t"
917                              "   bne,pt %%xcc, 1b\n\t"
918                              "    ldxa  [%2 + %0] %3, %%g0\n\t"
919                              : "=&r" (flush_size)
920                              : "0" (flush_size), "r" (flush_base),
921                                "i" (ASI_PHYS_USE_EC), "r" (flush_linesize));
922 }
923
924 static void cheetah_flush_ecache_line(unsigned long physaddr)
925 {
926         unsigned long alias;
927
928         physaddr &= ~(8UL - 1UL);
929         physaddr = (ecache_flush_physbase +
930                     (physaddr & ((ecache_flush_size>>1UL) - 1UL)));
931         alias = physaddr + (ecache_flush_size >> 1UL);
932         __asm__ __volatile__("ldxa [%0] %2, %%g0\n\t"
933                              "ldxa [%1] %2, %%g0\n\t"
934                              "membar #Sync"
935                              : /* no outputs */
936                              : "r" (physaddr), "r" (alias),
937                                "i" (ASI_PHYS_USE_EC));
938 }
939
940 /* Unfortunately, the diagnostic access to the I-cache tags we need to
941  * use to clear the thing interferes with I-cache coherency transactions.
942  *
943  * So we must only flush the I-cache when it is disabled.
944  */
945 static void __cheetah_flush_icache(void)
946 {
947         unsigned int icache_size, icache_line_size;
948         unsigned long addr;
949
950         icache_size = local_cpu_data().icache_size;
951         icache_line_size = local_cpu_data().icache_line_size;
952
953         /* Clear the valid bits in all the tags. */
954         for (addr = 0; addr < icache_size; addr += icache_line_size) {
955                 __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
956                                      "membar #Sync"
957                                      : /* no outputs */
958                                      : "r" (addr | (2 << 3)),
959                                        "i" (ASI_IC_TAG));
960         }
961 }
962
963 static void cheetah_flush_icache(void)
964 {
965         unsigned long dcu_save;
966
967         /* Save current DCU, disable I-cache. */
968         __asm__ __volatile__("ldxa [%%g0] %1, %0\n\t"
969                              "or %0, %2, %%g1\n\t"
970                              "stxa %%g1, [%%g0] %1\n\t"
971                              "membar #Sync"
972                              : "=r" (dcu_save)
973                              : "i" (ASI_DCU_CONTROL_REG), "i" (DCU_IC)
974                              : "g1");
975
976         __cheetah_flush_icache();
977
978         /* Restore DCU register */
979         __asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
980                              "membar #Sync"
981                              : /* no outputs */
982                              : "r" (dcu_save), "i" (ASI_DCU_CONTROL_REG));
983 }
984
985 static void cheetah_flush_dcache(void)
986 {
987         unsigned int dcache_size, dcache_line_size;
988         unsigned long addr;
989
990         dcache_size = local_cpu_data().dcache_size;
991         dcache_line_size = local_cpu_data().dcache_line_size;
992
993         for (addr = 0; addr < dcache_size; addr += dcache_line_size) {
994                 __asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
995                                      "membar #Sync"
996                                      : /* no outputs */
997                                      : "r" (addr), "i" (ASI_DCACHE_TAG));
998         }
999 }
1000
1001 /* In order to make the even parity correct we must do two things.
1002  * First, we clear DC_data_parity and set DC_utag to an appropriate value.
1003  * Next, we clear out all 32-bytes of data for that line.  Data of
1004  * all-zero + tag parity value of zero == correct parity.
1005  */
1006 static void cheetah_plus_zap_dcache_parity(void)
1007 {
1008         unsigned int dcache_size, dcache_line_size;
1009         unsigned long addr;
1010
1011         dcache_size = local_cpu_data().dcache_size;
1012         dcache_line_size = local_cpu_data().dcache_line_size;
1013
1014         for (addr = 0; addr < dcache_size; addr += dcache_line_size) {
1015                 unsigned long tag = (addr >> 14);
1016                 unsigned long line;
1017
1018                 __asm__ __volatile__("membar    #Sync\n\t"
1019                                      "stxa      %0, [%1] %2\n\t"
1020                                      "membar    #Sync"
1021                                      : /* no outputs */
1022                                      : "r" (tag), "r" (addr),
1023                                        "i" (ASI_DCACHE_UTAG));
1024                 for (line = addr; line < addr + dcache_line_size; line += 8)
1025                         __asm__ __volatile__("membar    #Sync\n\t"
1026                                              "stxa      %%g0, [%0] %1\n\t"
1027                                              "membar    #Sync"
1028                                              : /* no outputs */
1029                                              : "r" (line),
1030                                                "i" (ASI_DCACHE_DATA));
1031         }
1032 }
1033
1034 /* Conversion tables used to frob Cheetah AFSR syndrome values into
1035  * something palatable to the memory controller driver get_unumber
1036  * routine.
1037  */
1038 #define MT0     137
1039 #define MT1     138
1040 #define MT2     139
1041 #define NONE    254
1042 #define MTC0    140
1043 #define MTC1    141
1044 #define MTC2    142
1045 #define MTC3    143
1046 #define C0      128
1047 #define C1      129
1048 #define C2      130
1049 #define C3      131
1050 #define C4      132
1051 #define C5      133
1052 #define C6      134
1053 #define C7      135
1054 #define C8      136
1055 #define M2      144
1056 #define M3      145
1057 #define M4      146
1058 #define M       147
1059 static unsigned char cheetah_ecc_syntab[] = {
1060 /*00*/NONE, C0, C1, M2, C2, M2, M3, 47, C3, M2, M2, 53, M2, 41, 29, M,
1061 /*01*/C4, M, M, 50, M2, 38, 25, M2, M2, 33, 24, M2, 11, M, M2, 16,
1062 /*02*/C5, M, M, 46, M2, 37, 19, M2, M, 31, 32, M, 7, M2, M2, 10,
1063 /*03*/M2, 40, 13, M2, 59, M, M2, 66, M, M2, M2, 0, M2, 67, 71, M,
1064 /*04*/C6, M, M, 43, M, 36, 18, M, M2, 49, 15, M, 63, M2, M2, 6,
1065 /*05*/M2, 44, 28, M2, M, M2, M2, 52, 68, M2, M2, 62, M2, M3, M3, M4,
1066 /*06*/M2, 26, 106, M2, 64, M, M2, 2, 120, M, M2, M3, M, M3, M3, M4,
1067 /*07*/116, M2, M2, M3, M2, M3, M, M4, M2, 58, 54, M2, M, M4, M4, M3,
1068 /*08*/C7, M2, M, 42, M, 35, 17, M2, M, 45, 14, M2, 21, M2, M2, 5,
1069 /*09*/M, 27, M, M, 99, M, M, 3, 114, M2, M2, 20, M2, M3, M3, M,
1070 /*0a*/M2, 23, 113, M2, 112, M2, M, 51, 95, M, M2, M3, M2, M3, M3, M2,
1071 /*0b*/103, M, M2, M3, M2, M3, M3, M4, M2, 48, M, M, 73, M2, M, M3,
1072 /*0c*/M2, 22, 110, M2, 109, M2, M, 9, 108, M2, M, M3, M2, M3, M3, M,
1073 /*0d*/102, M2, M, M, M2, M3, M3, M, M2, M3, M3, M2, M, M4, M, M3,
1074 /*0e*/98, M, M2, M3, M2, M, M3, M4, M2, M3, M3, M4, M3, M, M, M,
1075 /*0f*/M2, M3, M3, M, M3, M, M, M, 56, M4, M, M3, M4, M, M, M,
1076 /*10*/C8, M, M2, 39, M, 34, 105, M2, M, 30, 104, M, 101, M, M, 4,
1077 /*11*/M, M, 100, M, 83, M, M2, 12, 87, M, M, 57, M2, M, M3, M,
1078 /*12*/M2, 97, 82, M2, 78, M2, M2, 1, 96, M, M, M, M, M, M3, M2,
1079 /*13*/94, M, M2, M3, M2, M, M3, M, M2, M, 79, M, 69, M, M4, M,
1080 /*14*/M2, 93, 92, M, 91, M, M2, 8, 90, M2, M2, M, M, M, M, M4,
1081 /*15*/89, M, M, M3, M2, M3, M3, M, M, M, M3, M2, M3, M2, M, M3,
1082 /*16*/86, M, M2, M3, M2, M, M3, M, M2, M, M3, M, M3, M, M, M3,
1083 /*17*/M, M, M3, M2, M3, M2, M4, M, 60, M, M2, M3, M4, M, M, M2,
1084 /*18*/M2, 88, 85, M2, 84, M, M2, 55, 81, M2, M2, M3, M2, M3, M3, M4,
1085 /*19*/77, M, M, M, M2, M3, M, M, M2, M3, M3, M4, M3, M2, M, M,
1086 /*1a*/74, M, M2, M3, M, M, M3, M, M, M, M3, M, M3, M, M4, M3,
1087 /*1b*/M2, 70, 107, M4, 65, M2, M2, M, 127, M, M, M, M2, M3, M3, M,
1088 /*1c*/80, M2, M2, 72, M, 119, 118, M, M2, 126, 76, M, 125, M, M4, M3,
1089 /*1d*/M2, 115, 124, M, 75, M, M, M3, 61, M, M4, M, M4, M, M, M,
1090 /*1e*/M, 123, 122, M4, 121, M4, M, M3, 117, M2, M2, M3, M4, M3, M, M,
1091 /*1f*/111, M, M, M, M4, M3, M3, M, M, M, M3, M, M3, M2, M, M
1092 };
1093 static unsigned char cheetah_mtag_syntab[] = {
1094        NONE, MTC0,
1095        MTC1, NONE,
1096        MTC2, NONE,
1097        NONE, MT0,
1098        MTC3, NONE,
1099        NONE, MT1,
1100        NONE, MT2,
1101        NONE, NONE
1102 };
1103
1104 /* Return the highest priority error conditon mentioned. */
1105 static inline unsigned long cheetah_get_hipri(unsigned long afsr)
1106 {
1107         unsigned long tmp = 0;
1108         int i;
1109
1110         for (i = 0; cheetah_error_table[i].mask; i++) {
1111                 if ((tmp = (afsr & cheetah_error_table[i].mask)) != 0UL)
1112                         return tmp;
1113         }
1114         return tmp;
1115 }
1116
1117 static const char *cheetah_get_string(unsigned long bit)
1118 {
1119         int i;
1120
1121         for (i = 0; cheetah_error_table[i].mask; i++) {
1122                 if ((bit & cheetah_error_table[i].mask) != 0UL)
1123                         return cheetah_error_table[i].name;
1124         }
1125         return "???";
1126 }
1127
1128 static void cheetah_log_errors(struct pt_regs *regs, struct cheetah_err_info *info,
1129                                unsigned long afsr, unsigned long afar, int recoverable)
1130 {
1131         unsigned long hipri;
1132         char unum[256];
1133
1134         printk("%s" "ERROR(%d): Cheetah error trap taken afsr[%016lx] afar[%016lx] TL1(%d)\n",
1135                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1136                afsr, afar,
1137                (afsr & CHAFSR_TL1) ? 1 : 0);
1138         printk("%s" "ERROR(%d): TPC[%lx] TNPC[%lx] O7[%lx] TSTATE[%lx]\n",
1139                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1140                regs->tpc, regs->tnpc, regs->u_regs[UREG_I7], regs->tstate);
1141         printk("%s" "ERROR(%d): ",
1142                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id());
1143         printk("TPC<%pS>\n", (void *) regs->tpc);
1144         printk("%s" "ERROR(%d): M_SYND(%lx),  E_SYND(%lx)%s%s\n",
1145                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1146                (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT,
1147                (afsr & CHAFSR_E_SYNDROME) >> CHAFSR_E_SYNDROME_SHIFT,
1148                (afsr & CHAFSR_ME) ? ", Multiple Errors" : "",
1149                (afsr & CHAFSR_PRIV) ? ", Privileged" : "");
1150         hipri = cheetah_get_hipri(afsr);
1151         printk("%s" "ERROR(%d): Highest priority error (%016lx) \"%s\"\n",
1152                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1153                hipri, cheetah_get_string(hipri));
1154
1155         /* Try to get unumber if relevant. */
1156 #define ESYND_ERRORS    (CHAFSR_IVC | CHAFSR_IVU | \
1157                          CHAFSR_CPC | CHAFSR_CPU | \
1158                          CHAFSR_UE  | CHAFSR_CE  | \
1159                          CHAFSR_EDC | CHAFSR_EDU  | \
1160                          CHAFSR_UCC | CHAFSR_UCU  | \
1161                          CHAFSR_WDU | CHAFSR_WDC)
1162 #define MSYND_ERRORS    (CHAFSR_EMC | CHAFSR_EMU)
1163         if (afsr & ESYND_ERRORS) {
1164                 int syndrome;
1165                 int ret;
1166
1167                 syndrome = (afsr & CHAFSR_E_SYNDROME) >> CHAFSR_E_SYNDROME_SHIFT;
1168                 syndrome = cheetah_ecc_syntab[syndrome];
1169                 ret = sprintf_dimm(syndrome, afar, unum, sizeof(unum));
1170                 if (ret != -1)
1171                         printk("%s" "ERROR(%d): AFAR E-syndrome [%s]\n",
1172                                (recoverable ? KERN_WARNING : KERN_CRIT),
1173                                smp_processor_id(), unum);
1174         } else if (afsr & MSYND_ERRORS) {
1175                 int syndrome;
1176                 int ret;
1177
1178                 syndrome = (afsr & CHAFSR_M_SYNDROME) >> CHAFSR_M_SYNDROME_SHIFT;
1179                 syndrome = cheetah_mtag_syntab[syndrome];
1180                 ret = sprintf_dimm(syndrome, afar, unum, sizeof(unum));
1181                 if (ret != -1)
1182                         printk("%s" "ERROR(%d): AFAR M-syndrome [%s]\n",
1183                                (recoverable ? KERN_WARNING : KERN_CRIT),
1184                                smp_processor_id(), unum);
1185         }
1186
1187         /* Now dump the cache snapshots. */
1188         printk("%s" "ERROR(%d): D-cache idx[%x] tag[%016llx] utag[%016llx] stag[%016llx]\n",
1189                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1190                (int) info->dcache_index,
1191                info->dcache_tag,
1192                info->dcache_utag,
1193                info->dcache_stag);
1194         printk("%s" "ERROR(%d): D-cache data0[%016llx] data1[%016llx] data2[%016llx] data3[%016llx]\n",
1195                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1196                info->dcache_data[0],
1197                info->dcache_data[1],
1198                info->dcache_data[2],
1199                info->dcache_data[3]);
1200         printk("%s" "ERROR(%d): I-cache idx[%x] tag[%016llx] utag[%016llx] stag[%016llx] "
1201                "u[%016llx] l[%016llx]\n",
1202                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1203                (int) info->icache_index,
1204                info->icache_tag,
1205                info->icache_utag,
1206                info->icache_stag,
1207                info->icache_upper,
1208                info->icache_lower);
1209         printk("%s" "ERROR(%d): I-cache INSN0[%016llx] INSN1[%016llx] INSN2[%016llx] INSN3[%016llx]\n",
1210                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1211                info->icache_data[0],
1212                info->icache_data[1],
1213                info->icache_data[2],
1214                info->icache_data[3]);
1215         printk("%s" "ERROR(%d): I-cache INSN4[%016llx] INSN5[%016llx] INSN6[%016llx] INSN7[%016llx]\n",
1216                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1217                info->icache_data[4],
1218                info->icache_data[5],
1219                info->icache_data[6],
1220                info->icache_data[7]);
1221         printk("%s" "ERROR(%d): E-cache idx[%x] tag[%016llx]\n",
1222                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1223                (int) info->ecache_index, info->ecache_tag);
1224         printk("%s" "ERROR(%d): E-cache data0[%016llx] data1[%016llx] data2[%016llx] data3[%016llx]\n",
1225                (recoverable ? KERN_WARNING : KERN_CRIT), smp_processor_id(),
1226                info->ecache_data[0],
1227                info->ecache_data[1],
1228                info->ecache_data[2],
1229                info->ecache_data[3]);
1230
1231         afsr = (afsr & ~hipri) & cheetah_afsr_errors;
1232         while (afsr != 0UL) {
1233                 unsigned long bit = cheetah_get_hipri(afsr);
1234
1235                 printk("%s" "ERROR: Multiple-error (%016lx) \"%s\"\n",
1236                        (recoverable ? KERN_WARNING : KERN_CRIT),
1237                        bit, cheetah_get_string(bit));
1238
1239                 afsr &= ~bit;
1240         }
1241
1242         if (!recoverable)
1243                 printk(KERN_CRIT "ERROR: This condition is not recoverable.\n");
1244 }
1245
1246 static int cheetah_recheck_errors(struct cheetah_err_info *logp)
1247 {
1248         unsigned long afsr, afar;
1249         int ret = 0;
1250
1251         __asm__ __volatile__("ldxa [%%g0] %1, %0\n\t"
1252                              : "=r" (afsr)
1253                              : "i" (ASI_AFSR));
1254         if ((afsr & cheetah_afsr_errors) != 0) {
1255                 if (logp != NULL) {
1256                         __asm__ __volatile__("ldxa [%%g0] %1, %0\n\t"
1257                                              : "=r" (afar)
1258                                              : "i" (ASI_AFAR));
1259                         logp->afsr = afsr;
1260                         logp->afar = afar;
1261                 }
1262                 ret = 1;
1263         }
1264         __asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
1265                              "membar #Sync\n\t"
1266                              : : "r" (afsr), "i" (ASI_AFSR));
1267
1268         return ret;
1269 }
1270
1271 void cheetah_fecc_handler(struct pt_regs *regs, unsigned long afsr, unsigned long afar)
1272 {
1273         struct cheetah_err_info local_snapshot, *p;
1274         int recoverable;
1275
1276         /* Flush E-cache */
1277         cheetah_flush_ecache();
1278
1279         p = cheetah_get_error_log(afsr);
1280         if (!p) {
1281                 prom_printf("ERROR: Early Fast-ECC error afsr[%016lx] afar[%016lx]\n",
1282                             afsr, afar);
1283                 prom_printf("ERROR: CPU(%d) TPC[%016lx] TNPC[%016lx] TSTATE[%016lx]\n",
1284                             smp_processor_id(), regs->tpc, regs->tnpc, regs->tstate);
1285                 prom_halt();
1286         }
1287
1288         /* Grab snapshot of logged error. */
1289         memcpy(&local_snapshot, p, sizeof(local_snapshot));
1290
1291         /* If the current trap snapshot does not match what the
1292          * trap handler passed along into our args, big trouble.
1293          * In such a case, mark the local copy as invalid.
1294          *
1295          * Else, it matches and we mark the afsr in the non-local
1296          * copy as invalid so we may log new error traps there.
1297          */
1298         if (p->afsr != afsr || p->afar != afar)
1299                 local_snapshot.afsr = CHAFSR_INVALID;
1300         else
1301                 p->afsr = CHAFSR_INVALID;
1302
1303         cheetah_flush_icache();
1304         cheetah_flush_dcache();
1305
1306         /* Re-enable I-cache/D-cache */
1307         __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1308                              "or %%g1, %1, %%g1\n\t"
1309                              "stxa %%g1, [%%g0] %0\n\t"
1310                              "membar #Sync"
1311                              : /* no outputs */
1312                              : "i" (ASI_DCU_CONTROL_REG),
1313                                "i" (DCU_DC | DCU_IC)
1314                              : "g1");
1315
1316         /* Re-enable error reporting */
1317         __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1318                              "or %%g1, %1, %%g1\n\t"
1319                              "stxa %%g1, [%%g0] %0\n\t"
1320                              "membar #Sync"
1321                              : /* no outputs */
1322                              : "i" (ASI_ESTATE_ERROR_EN),
1323                                "i" (ESTATE_ERROR_NCEEN | ESTATE_ERROR_CEEN)
1324                              : "g1");
1325
1326         /* Decide if we can continue after handling this trap and
1327          * logging the error.
1328          */
1329         recoverable = 1;
1330         if (afsr & (CHAFSR_PERR | CHAFSR_IERR | CHAFSR_ISAP))
1331                 recoverable = 0;
1332
1333         /* Re-check AFSR/AFAR.  What we are looking for here is whether a new
1334          * error was logged while we had error reporting traps disabled.
1335          */
1336         if (cheetah_recheck_errors(&local_snapshot)) {
1337                 unsigned long new_afsr = local_snapshot.afsr;
1338
1339                 /* If we got a new asynchronous error, die... */
1340                 if (new_afsr & (CHAFSR_EMU | CHAFSR_EDU |
1341                                 CHAFSR_WDU | CHAFSR_CPU |
1342                                 CHAFSR_IVU | CHAFSR_UE |
1343                                 CHAFSR_BERR | CHAFSR_TO))
1344                         recoverable = 0;
1345         }
1346
1347         /* Log errors. */
1348         cheetah_log_errors(regs, &local_snapshot, afsr, afar, recoverable);
1349
1350         if (!recoverable)
1351                 panic("Irrecoverable Fast-ECC error trap.\n");
1352
1353         /* Flush E-cache to kick the error trap handlers out. */
1354         cheetah_flush_ecache();
1355 }
1356
1357 /* Try to fix a correctable error by pushing the line out from
1358  * the E-cache.  Recheck error reporting registers to see if the
1359  * problem is intermittent.
1360  */
1361 static int cheetah_fix_ce(unsigned long physaddr)
1362 {
1363         unsigned long orig_estate;
1364         unsigned long alias1, alias2;
1365         int ret;
1366
1367         /* Make sure correctable error traps are disabled. */
1368         __asm__ __volatile__("ldxa      [%%g0] %2, %0\n\t"
1369                              "andn      %0, %1, %%g1\n\t"
1370                              "stxa      %%g1, [%%g0] %2\n\t"
1371                              "membar    #Sync"
1372                              : "=&r" (orig_estate)
1373                              : "i" (ESTATE_ERROR_CEEN),
1374                                "i" (ASI_ESTATE_ERROR_EN)
1375                              : "g1");
1376
1377         /* We calculate alias addresses that will force the
1378          * cache line in question out of the E-cache.  Then
1379          * we bring it back in with an atomic instruction so
1380          * that we get it in some modified/exclusive state,
1381          * then we displace it again to try and get proper ECC
1382          * pushed back into the system.
1383          */
1384         physaddr &= ~(8UL - 1UL);
1385         alias1 = (ecache_flush_physbase +
1386                   (physaddr & ((ecache_flush_size >> 1) - 1)));
1387         alias2 = alias1 + (ecache_flush_size >> 1);
1388         __asm__ __volatile__("ldxa      [%0] %3, %%g0\n\t"
1389                              "ldxa      [%1] %3, %%g0\n\t"
1390                              "casxa     [%2] %3, %%g0, %%g0\n\t"
1391                              "ldxa      [%0] %3, %%g0\n\t"
1392                              "ldxa      [%1] %3, %%g0\n\t"
1393                              "membar    #Sync"
1394                              : /* no outputs */
1395                              : "r" (alias1), "r" (alias2),
1396                                "r" (physaddr), "i" (ASI_PHYS_USE_EC));
1397
1398         /* Did that trigger another error? */
1399         if (cheetah_recheck_errors(NULL)) {
1400                 /* Try one more time. */
1401                 __asm__ __volatile__("ldxa [%0] %1, %%g0\n\t"
1402                                      "membar #Sync"
1403                                      : : "r" (physaddr), "i" (ASI_PHYS_USE_EC));
1404                 if (cheetah_recheck_errors(NULL))
1405                         ret = 2;
1406                 else
1407                         ret = 1;
1408         } else {
1409                 /* No new error, intermittent problem. */
1410                 ret = 0;
1411         }
1412
1413         /* Restore error enables. */
1414         __asm__ __volatile__("stxa      %0, [%%g0] %1\n\t"
1415                              "membar    #Sync"
1416                              : : "r" (orig_estate), "i" (ASI_ESTATE_ERROR_EN));
1417
1418         return ret;
1419 }
1420
1421 /* Return non-zero if PADDR is a valid physical memory address. */
1422 static int cheetah_check_main_memory(unsigned long paddr)
1423 {
1424         unsigned long vaddr = PAGE_OFFSET + paddr;
1425
1426         if (vaddr > (unsigned long) high_memory)
1427                 return 0;
1428
1429         return kern_addr_valid(vaddr);
1430 }
1431
1432 void cheetah_cee_handler(struct pt_regs *regs, unsigned long afsr, unsigned long afar)
1433 {
1434         struct cheetah_err_info local_snapshot, *p;
1435         int recoverable, is_memory;
1436
1437         p = cheetah_get_error_log(afsr);
1438         if (!p) {
1439                 prom_printf("ERROR: Early CEE error afsr[%016lx] afar[%016lx]\n",
1440                             afsr, afar);
1441                 prom_printf("ERROR: CPU(%d) TPC[%016lx] TNPC[%016lx] TSTATE[%016lx]\n",
1442                             smp_processor_id(), regs->tpc, regs->tnpc, regs->tstate);
1443                 prom_halt();
1444         }
1445
1446         /* Grab snapshot of logged error. */
1447         memcpy(&local_snapshot, p, sizeof(local_snapshot));
1448
1449         /* If the current trap snapshot does not match what the
1450          * trap handler passed along into our args, big trouble.
1451          * In such a case, mark the local copy as invalid.
1452          *
1453          * Else, it matches and we mark the afsr in the non-local
1454          * copy as invalid so we may log new error traps there.
1455          */
1456         if (p->afsr != afsr || p->afar != afar)
1457                 local_snapshot.afsr = CHAFSR_INVALID;
1458         else
1459                 p->afsr = CHAFSR_INVALID;
1460
1461         is_memory = cheetah_check_main_memory(afar);
1462
1463         if (is_memory && (afsr & CHAFSR_CE) != 0UL) {
1464                 /* XXX Might want to log the results of this operation
1465                  * XXX somewhere... -DaveM
1466                  */
1467                 cheetah_fix_ce(afar);
1468         }
1469
1470         {
1471                 int flush_all, flush_line;
1472
1473                 flush_all = flush_line = 0;
1474                 if ((afsr & CHAFSR_EDC) != 0UL) {
1475                         if ((afsr & cheetah_afsr_errors) == CHAFSR_EDC)
1476                                 flush_line = 1;
1477                         else
1478                                 flush_all = 1;
1479                 } else if ((afsr & CHAFSR_CPC) != 0UL) {
1480                         if ((afsr & cheetah_afsr_errors) == CHAFSR_CPC)
1481                                 flush_line = 1;
1482                         else
1483                                 flush_all = 1;
1484                 }
1485
1486                 /* Trap handler only disabled I-cache, flush it. */
1487                 cheetah_flush_icache();
1488
1489                 /* Re-enable I-cache */
1490                 __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1491                                      "or %%g1, %1, %%g1\n\t"
1492                                      "stxa %%g1, [%%g0] %0\n\t"
1493                                      "membar #Sync"
1494                                      : /* no outputs */
1495                                      : "i" (ASI_DCU_CONTROL_REG),
1496                                      "i" (DCU_IC)
1497                                      : "g1");
1498
1499                 if (flush_all)
1500                         cheetah_flush_ecache();
1501                 else if (flush_line)
1502                         cheetah_flush_ecache_line(afar);
1503         }
1504
1505         /* Re-enable error reporting */
1506         __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1507                              "or %%g1, %1, %%g1\n\t"
1508                              "stxa %%g1, [%%g0] %0\n\t"
1509                              "membar #Sync"
1510                              : /* no outputs */
1511                              : "i" (ASI_ESTATE_ERROR_EN),
1512                                "i" (ESTATE_ERROR_CEEN)
1513                              : "g1");
1514
1515         /* Decide if we can continue after handling this trap and
1516          * logging the error.
1517          */
1518         recoverable = 1;
1519         if (afsr & (CHAFSR_PERR | CHAFSR_IERR | CHAFSR_ISAP))
1520                 recoverable = 0;
1521
1522         /* Re-check AFSR/AFAR */
1523         (void) cheetah_recheck_errors(&local_snapshot);
1524
1525         /* Log errors. */
1526         cheetah_log_errors(regs, &local_snapshot, afsr, afar, recoverable);
1527
1528         if (!recoverable)
1529                 panic("Irrecoverable Correctable-ECC error trap.\n");
1530 }
1531
1532 void cheetah_deferred_handler(struct pt_regs *regs, unsigned long afsr, unsigned long afar)
1533 {
1534         struct cheetah_err_info local_snapshot, *p;
1535         int recoverable, is_memory;
1536
1537 #ifdef CONFIG_PCI
1538         /* Check for the special PCI poke sequence. */
1539         if (pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) {
1540                 cheetah_flush_icache();
1541                 cheetah_flush_dcache();
1542
1543                 /* Re-enable I-cache/D-cache */
1544                 __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1545                                      "or %%g1, %1, %%g1\n\t"
1546                                      "stxa %%g1, [%%g0] %0\n\t"
1547                                      "membar #Sync"
1548                                      : /* no outputs */
1549                                      : "i" (ASI_DCU_CONTROL_REG),
1550                                        "i" (DCU_DC | DCU_IC)
1551                                      : "g1");
1552
1553                 /* Re-enable error reporting */
1554                 __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1555                                      "or %%g1, %1, %%g1\n\t"
1556                                      "stxa %%g1, [%%g0] %0\n\t"
1557                                      "membar #Sync"
1558                                      : /* no outputs */
1559                                      : "i" (ASI_ESTATE_ERROR_EN),
1560                                        "i" (ESTATE_ERROR_NCEEN | ESTATE_ERROR_CEEN)
1561                                      : "g1");
1562
1563                 (void) cheetah_recheck_errors(NULL);
1564
1565                 pci_poke_faulted = 1;
1566                 regs->tpc += 4;
1567                 regs->tnpc = regs->tpc + 4;
1568                 return;
1569         }
1570 #endif
1571
1572         p = cheetah_get_error_log(afsr);
1573         if (!p) {
1574                 prom_printf("ERROR: Early deferred error afsr[%016lx] afar[%016lx]\n",
1575                             afsr, afar);
1576                 prom_printf("ERROR: CPU(%d) TPC[%016lx] TNPC[%016lx] TSTATE[%016lx]\n",
1577                             smp_processor_id(), regs->tpc, regs->tnpc, regs->tstate);
1578                 prom_halt();
1579         }
1580
1581         /* Grab snapshot of logged error. */
1582         memcpy(&local_snapshot, p, sizeof(local_snapshot));
1583
1584         /* If the current trap snapshot does not match what the
1585          * trap handler passed along into our args, big trouble.
1586          * In such a case, mark the local copy as invalid.
1587          *
1588          * Else, it matches and we mark the afsr in the non-local
1589          * copy as invalid so we may log new error traps there.
1590          */
1591         if (p->afsr != afsr || p->afar != afar)
1592                 local_snapshot.afsr = CHAFSR_INVALID;
1593         else
1594                 p->afsr = CHAFSR_INVALID;
1595
1596         is_memory = cheetah_check_main_memory(afar);
1597
1598         {
1599                 int flush_all, flush_line;
1600
1601                 flush_all = flush_line = 0;
1602                 if ((afsr & CHAFSR_EDU) != 0UL) {
1603                         if ((afsr & cheetah_afsr_errors) == CHAFSR_EDU)
1604                                 flush_line = 1;
1605                         else
1606                                 flush_all = 1;
1607                 } else if ((afsr & CHAFSR_BERR) != 0UL) {
1608                         if ((afsr & cheetah_afsr_errors) == CHAFSR_BERR)
1609                                 flush_line = 1;
1610                         else
1611                                 flush_all = 1;
1612                 }
1613
1614                 cheetah_flush_icache();
1615                 cheetah_flush_dcache();
1616
1617                 /* Re-enable I/D caches */
1618                 __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1619                                      "or %%g1, %1, %%g1\n\t"
1620                                      "stxa %%g1, [%%g0] %0\n\t"
1621                                      "membar #Sync"
1622                                      : /* no outputs */
1623                                      : "i" (ASI_DCU_CONTROL_REG),
1624                                      "i" (DCU_IC | DCU_DC)
1625                                      : "g1");
1626
1627                 if (flush_all)
1628                         cheetah_flush_ecache();
1629                 else if (flush_line)
1630                         cheetah_flush_ecache_line(afar);
1631         }
1632
1633         /* Re-enable error reporting */
1634         __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1635                              "or %%g1, %1, %%g1\n\t"
1636                              "stxa %%g1, [%%g0] %0\n\t"
1637                              "membar #Sync"
1638                              : /* no outputs */
1639                              : "i" (ASI_ESTATE_ERROR_EN),
1640                              "i" (ESTATE_ERROR_NCEEN | ESTATE_ERROR_CEEN)
1641                              : "g1");
1642
1643         /* Decide if we can continue after handling this trap and
1644          * logging the error.
1645          */
1646         recoverable = 1;
1647         if (afsr & (CHAFSR_PERR | CHAFSR_IERR | CHAFSR_ISAP))
1648                 recoverable = 0;
1649
1650         /* Re-check AFSR/AFAR.  What we are looking for here is whether a new
1651          * error was logged while we had error reporting traps disabled.
1652          */
1653         if (cheetah_recheck_errors(&local_snapshot)) {
1654                 unsigned long new_afsr = local_snapshot.afsr;
1655
1656                 /* If we got a new asynchronous error, die... */
1657                 if (new_afsr & (CHAFSR_EMU | CHAFSR_EDU |
1658                                 CHAFSR_WDU | CHAFSR_CPU |
1659                                 CHAFSR_IVU | CHAFSR_UE |
1660                                 CHAFSR_BERR | CHAFSR_TO))
1661                         recoverable = 0;
1662         }
1663
1664         /* Log errors. */
1665         cheetah_log_errors(regs, &local_snapshot, afsr, afar, recoverable);
1666
1667         /* "Recoverable" here means we try to yank the page from ever
1668          * being newly used again.  This depends upon a few things:
1669          * 1) Must be main memory, and AFAR must be valid.
1670          * 2) If we trapped from user, OK.
1671          * 3) Else, if we trapped from kernel we must find exception
1672          *    table entry (ie. we have to have been accessing user
1673          *    space).
1674          *
1675          * If AFAR is not in main memory, or we trapped from kernel
1676          * and cannot find an exception table entry, it is unacceptable
1677          * to try and continue.
1678          */
1679         if (recoverable && is_memory) {
1680                 if ((regs->tstate & TSTATE_PRIV) == 0UL) {
1681                         /* OK, usermode access. */
1682                         recoverable = 1;
1683                 } else {
1684                         const struct exception_table_entry *entry;
1685
1686                         entry = search_exception_tables(regs->tpc);
1687                         if (entry) {
1688                                 /* OK, kernel access to userspace. */
1689                                 recoverable = 1;
1690
1691                         } else {
1692                                 /* BAD, privileged state is corrupted. */
1693                                 recoverable = 0;
1694                         }
1695
1696                         if (recoverable) {
1697                                 if (pfn_valid(afar >> PAGE_SHIFT))
1698                                         get_page(pfn_to_page(afar >> PAGE_SHIFT));
1699                                 else
1700                                         recoverable = 0;
1701
1702                                 /* Only perform fixup if we still have a
1703                                  * recoverable condition.
1704                                  */
1705                                 if (recoverable) {
1706                                         regs->tpc = entry->fixup;
1707                                         regs->tnpc = regs->tpc + 4;
1708                                 }
1709                         }
1710                 }
1711         } else {
1712                 recoverable = 0;
1713         }
1714
1715         if (!recoverable)
1716                 panic("Irrecoverable deferred error trap.\n");
1717 }
1718
1719 /* Handle a D/I cache parity error trap.  TYPE is encoded as:
1720  *
1721  * Bit0:        0=dcache,1=icache
1722  * Bit1:        0=recoverable,1=unrecoverable
1723  *
1724  * The hardware has disabled both the I-cache and D-cache in
1725  * the %dcr register.  
1726  */
1727 void cheetah_plus_parity_error(int type, struct pt_regs *regs)
1728 {
1729         if (type & 0x1)
1730                 __cheetah_flush_icache();
1731         else
1732                 cheetah_plus_zap_dcache_parity();
1733         cheetah_flush_dcache();
1734
1735         /* Re-enable I-cache/D-cache */
1736         __asm__ __volatile__("ldxa [%%g0] %0, %%g1\n\t"
1737                              "or %%g1, %1, %%g1\n\t"
1738                              "stxa %%g1, [%%g0] %0\n\t"
1739                              "membar #Sync"
1740                              : /* no outputs */
1741                              : "i" (ASI_DCU_CONTROL_REG),
1742                                "i" (DCU_DC | DCU_IC)
1743                              : "g1");
1744
1745         if (type & 0x2) {
1746                 printk(KERN_EMERG "CPU[%d]: Cheetah+ %c-cache parity error at TPC[%016lx]\n",
1747                        smp_processor_id(),
1748                        (type & 0x1) ? 'I' : 'D',
1749                        regs->tpc);
1750                 printk(KERN_EMERG "TPC<%pS>\n", (void *) regs->tpc);
1751                 panic("Irrecoverable Cheetah+ parity error.");
1752         }
1753
1754         printk(KERN_WARNING "CPU[%d]: Cheetah+ %c-cache parity error at TPC[%016lx]\n",
1755                smp_processor_id(),
1756                (type & 0x1) ? 'I' : 'D',
1757                regs->tpc);
1758         printk(KERN_WARNING "TPC<%pS>\n", (void *) regs->tpc);
1759 }
1760
1761 struct sun4v_error_entry {
1762         u64             err_handle;
1763         u64             err_stick;
1764
1765         u32             err_type;
1766 #define SUN4V_ERR_TYPE_UNDEFINED        0
1767 #define SUN4V_ERR_TYPE_UNCORRECTED_RES  1
1768 #define SUN4V_ERR_TYPE_PRECISE_NONRES   2
1769 #define SUN4V_ERR_TYPE_DEFERRED_NONRES  3
1770 #define SUN4V_ERR_TYPE_WARNING_RES      4
1771
1772         u32             err_attrs;
1773 #define SUN4V_ERR_ATTRS_PROCESSOR       0x00000001
1774 #define SUN4V_ERR_ATTRS_MEMORY          0x00000002
1775 #define SUN4V_ERR_ATTRS_PIO             0x00000004
1776 #define SUN4V_ERR_ATTRS_INT_REGISTERS   0x00000008
1777 #define SUN4V_ERR_ATTRS_FPU_REGISTERS   0x00000010
1778 #define SUN4V_ERR_ATTRS_USER_MODE       0x01000000
1779 #define SUN4V_ERR_ATTRS_PRIV_MODE       0x02000000
1780 #define SUN4V_ERR_ATTRS_RES_QUEUE_FULL  0x80000000
1781
1782         u64             err_raddr;
1783         u32             err_size;
1784         u16             err_cpu;
1785         u16             err_pad;
1786 };
1787
1788 static atomic_t sun4v_resum_oflow_cnt = ATOMIC_INIT(0);
1789 static atomic_t sun4v_nonresum_oflow_cnt = ATOMIC_INIT(0);
1790
1791 static const char *sun4v_err_type_to_str(u32 type)
1792 {
1793         switch (type) {
1794         case SUN4V_ERR_TYPE_UNDEFINED:
1795                 return "undefined";
1796         case SUN4V_ERR_TYPE_UNCORRECTED_RES:
1797                 return "uncorrected resumable";
1798         case SUN4V_ERR_TYPE_PRECISE_NONRES:
1799                 return "precise nonresumable";
1800         case SUN4V_ERR_TYPE_DEFERRED_NONRES:
1801                 return "deferred nonresumable";
1802         case SUN4V_ERR_TYPE_WARNING_RES:
1803                 return "warning resumable";
1804         default:
1805                 return "unknown";
1806         };
1807 }
1808
1809 static void sun4v_log_error(struct pt_regs *regs, struct sun4v_error_entry *ent, int cpu, const char *pfx, atomic_t *ocnt)
1810 {
1811         int cnt;
1812
1813         printk("%s: Reporting on cpu %d\n", pfx, cpu);
1814         printk("%s: err_handle[%llx] err_stick[%llx] err_type[%08x:%s]\n",
1815                pfx,
1816                ent->err_handle, ent->err_stick,
1817                ent->err_type,
1818                sun4v_err_type_to_str(ent->err_type));
1819         printk("%s: err_attrs[%08x:%s %s %s %s %s %s %s %s]\n",
1820                pfx,
1821                ent->err_attrs,
1822                ((ent->err_attrs & SUN4V_ERR_ATTRS_PROCESSOR) ?
1823                 "processor" : ""),
1824                ((ent->err_attrs & SUN4V_ERR_ATTRS_MEMORY) ?
1825                 "memory" : ""),
1826                ((ent->err_attrs & SUN4V_ERR_ATTRS_PIO) ?
1827                 "pio" : ""),
1828                ((ent->err_attrs & SUN4V_ERR_ATTRS_INT_REGISTERS) ?
1829                 "integer-regs" : ""),
1830                ((ent->err_attrs & SUN4V_ERR_ATTRS_FPU_REGISTERS) ?
1831                 "fpu-regs" : ""),
1832                ((ent->err_attrs & SUN4V_ERR_ATTRS_USER_MODE) ?
1833                 "user" : ""),
1834                ((ent->err_attrs & SUN4V_ERR_ATTRS_PRIV_MODE) ?
1835                 "privileged" : ""),
1836                ((ent->err_attrs & SUN4V_ERR_ATTRS_RES_QUEUE_FULL) ?
1837                 "queue-full" : ""));
1838         printk("%s: err_raddr[%016llx] err_size[%u] err_cpu[%u]\n",
1839                pfx,
1840                ent->err_raddr, ent->err_size, ent->err_cpu);
1841
1842         show_regs(regs);
1843
1844         if ((cnt = atomic_read(ocnt)) != 0) {
1845                 atomic_set(ocnt, 0);
1846                 wmb();
1847                 printk("%s: Queue overflowed %d times.\n",
1848                        pfx, cnt);
1849         }
1850 }
1851
1852 /* We run with %pil set to PIL_NORMAL_MAX and PSTATE_IE enabled in %pstate.
1853  * Log the event and clear the first word of the entry.
1854  */
1855 void sun4v_resum_error(struct pt_regs *regs, unsigned long offset)
1856 {
1857         struct sun4v_error_entry *ent, local_copy;
1858         struct trap_per_cpu *tb;
1859         unsigned long paddr;
1860         int cpu;
1861
1862         cpu = get_cpu();
1863
1864         tb = &trap_block[cpu];
1865         paddr = tb->resum_kernel_buf_pa + offset;
1866         ent = __va(paddr);
1867
1868         memcpy(&local_copy, ent, sizeof(struct sun4v_error_entry));
1869
1870         /* We have a local copy now, so release the entry.  */
1871         ent->err_handle = 0;
1872         wmb();
1873
1874         put_cpu();
1875
1876         if (ent->err_type == SUN4V_ERR_TYPE_WARNING_RES) {
1877                 /* If err_type is 0x4, it's a powerdown request.  Do
1878                  * not do the usual resumable error log because that
1879                  * makes it look like some abnormal error.
1880                  */
1881                 printk(KERN_INFO "Power down request...\n");
1882                 kill_cad_pid(SIGINT, 1);
1883                 return;
1884         }
1885
1886         sun4v_log_error(regs, &local_copy, cpu,
1887                         KERN_ERR "RESUMABLE ERROR",
1888                         &sun4v_resum_oflow_cnt);
1889 }
1890
1891 /* If we try to printk() we'll probably make matters worse, by trying
1892  * to retake locks this cpu already holds or causing more errors. So
1893  * just bump a counter, and we'll report these counter bumps above.
1894  */
1895 void sun4v_resum_overflow(struct pt_regs *regs)
1896 {
1897         atomic_inc(&sun4v_resum_oflow_cnt);
1898 }
1899
1900 /* We run with %pil set to PIL_NORMAL_MAX and PSTATE_IE enabled in %pstate.
1901  * Log the event, clear the first word of the entry, and die.
1902  */
1903 void sun4v_nonresum_error(struct pt_regs *regs, unsigned long offset)
1904 {
1905         struct sun4v_error_entry *ent, local_copy;
1906         struct trap_per_cpu *tb;
1907         unsigned long paddr;
1908         int cpu;
1909
1910         cpu = get_cpu();
1911
1912         tb = &trap_block[cpu];
1913         paddr = tb->nonresum_kernel_buf_pa + offset;
1914         ent = __va(paddr);
1915
1916         memcpy(&local_copy, ent, sizeof(struct sun4v_error_entry));
1917
1918         /* We have a local copy now, so release the entry.  */
1919         ent->err_handle = 0;
1920         wmb();
1921
1922         put_cpu();
1923
1924 #ifdef CONFIG_PCI
1925         /* Check for the special PCI poke sequence. */
1926         if (pci_poke_in_progress && pci_poke_cpu == cpu) {
1927                 pci_poke_faulted = 1;
1928                 regs->tpc += 4;
1929                 regs->tnpc = regs->tpc + 4;
1930                 return;
1931         }
1932 #endif
1933
1934         sun4v_log_error(regs, &local_copy, cpu,
1935                         KERN_EMERG "NON-RESUMABLE ERROR",
1936                         &sun4v_nonresum_oflow_cnt);
1937
1938         panic("Non-resumable error.");
1939 }
1940
1941 /* If we try to printk() we'll probably make matters worse, by trying
1942  * to retake locks this cpu already holds or causing more errors. So
1943  * just bump a counter, and we'll report these counter bumps above.
1944  */
1945 void sun4v_nonresum_overflow(struct pt_regs *regs)
1946 {
1947         /* XXX Actually even this can make not that much sense.  Perhaps
1948          * XXX we should just pull the plug and panic directly from here?
1949          */
1950         atomic_inc(&sun4v_nonresum_oflow_cnt);
1951 }
1952
1953 unsigned long sun4v_err_itlb_vaddr;
1954 unsigned long sun4v_err_itlb_ctx;
1955 unsigned long sun4v_err_itlb_pte;
1956 unsigned long sun4v_err_itlb_error;
1957
1958 void sun4v_itlb_error_report(struct pt_regs *regs, int tl)
1959 {
1960         if (tl > 1)
1961                 dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
1962
1963         printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n",
1964                regs->tpc, tl);
1965         printk(KERN_EMERG "SUN4V-ITLB: TPC<%pS>\n", (void *) regs->tpc);
1966         printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
1967         printk(KERN_EMERG "SUN4V-ITLB: O7<%pS>\n",
1968                (void *) regs->u_regs[UREG_I7]);
1969         printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] "
1970                "pte[%lx] error[%lx]\n",
1971                sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
1972                sun4v_err_itlb_pte, sun4v_err_itlb_error);
1973
1974         prom_halt();
1975 }
1976
1977 unsigned long sun4v_err_dtlb_vaddr;
1978 unsigned long sun4v_err_dtlb_ctx;
1979 unsigned long sun4v_err_dtlb_pte;
1980 unsigned long sun4v_err_dtlb_error;
1981
1982 void sun4v_dtlb_error_report(struct pt_regs *regs, int tl)
1983 {
1984         if (tl > 1)
1985                 dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
1986
1987         printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n",
1988                regs->tpc, tl);
1989         printk(KERN_EMERG "SUN4V-DTLB: TPC<%pS>\n", (void *) regs->tpc);
1990         printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
1991         printk(KERN_EMERG "SUN4V-DTLB: O7<%pS>\n",
1992                (void *) regs->u_regs[UREG_I7]);
1993         printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] "
1994                "pte[%lx] error[%lx]\n",
1995                sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,
1996                sun4v_err_dtlb_pte, sun4v_err_dtlb_error);
1997
1998         prom_halt();
1999 }
2000
2001 void hypervisor_tlbop_error(unsigned long err, unsigned long op)
2002 {
2003         printk(KERN_CRIT "SUN4V: TLB hv call error %lu for op %lu\n",
2004                err, op);
2005 }
2006
2007 void hypervisor_tlbop_error_xcall(unsigned long err, unsigned long op)
2008 {
2009         printk(KERN_CRIT "SUN4V: XCALL TLB hv call error %lu for op %lu\n",
2010                err, op);
2011 }
2012
2013 void do_fpe_common(struct pt_regs *regs)
2014 {
2015         if (regs->tstate & TSTATE_PRIV) {
2016                 regs->tpc = regs->tnpc;
2017                 regs->tnpc += 4;
2018         } else {
2019                 unsigned long fsr = current_thread_info()->xfsr[0];
2020                 siginfo_t info;
2021
2022                 if (test_thread_flag(TIF_32BIT)) {
2023                         regs->tpc &= 0xffffffff;
2024                         regs->tnpc &= 0xffffffff;
2025                 }
2026                 info.si_signo = SIGFPE;
2027                 info.si_errno = 0;
2028                 info.si_addr = (void __user *)regs->tpc;
2029                 info.si_trapno = 0;
2030                 info.si_code = __SI_FAULT;
2031                 if ((fsr & 0x1c000) == (1 << 14)) {
2032                         if (fsr & 0x10)
2033                                 info.si_code = FPE_FLTINV;
2034                         else if (fsr & 0x08)
2035                                 info.si_code = FPE_FLTOVF;
2036                         else if (fsr & 0x04)
2037                                 info.si_code = FPE_FLTUND;
2038                         else if (fsr & 0x02)
2039                                 info.si_code = FPE_FLTDIV;
2040                         else if (fsr & 0x01)
2041                                 info.si_code = FPE_FLTRES;
2042                 }
2043                 force_sig_info(SIGFPE, &info, current);
2044         }
2045 }
2046
2047 void do_fpieee(struct pt_regs *regs)
2048 {
2049         if (notify_die(DIE_TRAP, "fpu exception ieee", regs,
2050                        0, 0x24, SIGFPE) == NOTIFY_STOP)
2051                 return;
2052
2053         do_fpe_common(regs);
2054 }
2055
2056 extern int do_mathemu(struct pt_regs *, struct fpustate *);
2057
2058 void do_fpother(struct pt_regs *regs)
2059 {
2060         struct fpustate *f = FPUSTATE;
2061         int ret = 0;
2062
2063         if (notify_die(DIE_TRAP, "fpu exception other", regs,
2064                        0, 0x25, SIGFPE) == NOTIFY_STOP)
2065                 return;
2066
2067         switch ((current_thread_info()->xfsr[0] & 0x1c000)) {
2068         case (2 << 14): /* unfinished_FPop */
2069         case (3 << 14): /* unimplemented_FPop */
2070                 ret = do_mathemu(regs, f);
2071                 break;
2072         }
2073         if (ret)
2074                 return;
2075         do_fpe_common(regs);
2076 }
2077
2078 void do_tof(struct pt_regs *regs)
2079 {
2080         siginfo_t info;
2081
2082         if (notify_die(DIE_TRAP, "tagged arithmetic overflow", regs,
2083                        0, 0x26, SIGEMT) == NOTIFY_STOP)
2084                 return;
2085
2086         if (regs->tstate & TSTATE_PRIV)
2087                 die_if_kernel("Penguin overflow trap from kernel mode", regs);
2088         if (test_thread_flag(TIF_32BIT)) {
2089                 regs->tpc &= 0xffffffff;
2090                 regs->tnpc &= 0xffffffff;
2091         }
2092         info.si_signo = SIGEMT;
2093         info.si_errno = 0;
2094         info.si_code = EMT_TAGOVF;
2095         info.si_addr = (void __user *)regs->tpc;
2096         info.si_trapno = 0;
2097         force_sig_info(SIGEMT, &info, current);
2098 }
2099
2100 void do_div0(struct pt_regs *regs)
2101 {
2102         siginfo_t info;
2103
2104         if (notify_die(DIE_TRAP, "integer division by zero", regs,
2105                        0, 0x28, SIGFPE) == NOTIFY_STOP)
2106                 return;
2107
2108         if (regs->tstate & TSTATE_PRIV)
2109                 die_if_kernel("TL0: Kernel divide by zero.", regs);
2110         if (test_thread_flag(TIF_32BIT)) {
2111                 regs->tpc &= 0xffffffff;
2112                 regs->tnpc &= 0xffffffff;
2113         }
2114         info.si_signo = SIGFPE;
2115         info.si_errno = 0;
2116         info.si_code = FPE_INTDIV;
2117         info.si_addr = (void __user *)regs->tpc;
2118         info.si_trapno = 0;
2119         force_sig_info(SIGFPE, &info, current);
2120 }
2121
2122 static void instruction_dump(unsigned int *pc)
2123 {
2124         int i;
2125
2126         if ((((unsigned long) pc) & 3))
2127                 return;
2128
2129         printk("Instruction DUMP:");
2130         for (i = -3; i < 6; i++)
2131                 printk("%c%08x%c",i?' ':'<',pc[i],i?' ':'>');
2132         printk("\n");
2133 }
2134
2135 static void user_instruction_dump(unsigned int __user *pc)
2136 {
2137         int i;
2138         unsigned int buf[9];
2139         
2140         if ((((unsigned long) pc) & 3))
2141                 return;
2142                 
2143         if (copy_from_user(buf, pc - 3, sizeof(buf)))
2144                 return;
2145
2146         printk("Instruction DUMP:");
2147         for (i = 0; i < 9; i++)
2148                 printk("%c%08x%c",i==3?' ':'<',buf[i],i==3?' ':'>');
2149         printk("\n");
2150 }
2151
2152 void show_stack(struct task_struct *tsk, unsigned long *_ksp)
2153 {
2154         unsigned long fp, thread_base, ksp;
2155         struct thread_info *tp;
2156         int count = 0;
2157
2158         ksp = (unsigned long) _ksp;
2159         if (!tsk)
2160                 tsk = current;
2161         tp = task_thread_info(tsk);
2162         if (ksp == 0UL) {
2163                 if (tsk == current)
2164                         asm("mov %%fp, %0" : "=r" (ksp));
2165                 else
2166                         ksp = tp->ksp;
2167         }
2168         if (tp == current_thread_info())
2169                 flushw_all();
2170
2171         fp = ksp + STACK_BIAS;
2172         thread_base = (unsigned long) tp;
2173
2174         printk("Call Trace:\n");
2175         do {
2176                 struct sparc_stackf *sf;
2177                 struct pt_regs *regs;
2178                 unsigned long pc;
2179
2180                 if (!kstack_valid(tp, fp))
2181                         break;
2182                 sf = (struct sparc_stackf *) fp;
2183                 regs = (struct pt_regs *) (sf + 1);
2184
2185                 if (kstack_is_trap_frame(tp, regs)) {
2186                         if (!(regs->tstate & TSTATE_PRIV))
2187                                 break;
2188                         pc = regs->tpc;
2189                         fp = regs->u_regs[UREG_I6] + STACK_BIAS;
2190                 } else {
2191                         pc = sf->callers_pc;
2192                         fp = (unsigned long)sf->fp + STACK_BIAS;
2193                 }
2194
2195                 printk(" [%016lx] %pS\n", pc, (void *) pc);
2196         } while (++count < 16);
2197 }
2198
2199 void dump_stack(void)
2200 {
2201         show_stack(current, NULL);
2202 }
2203
2204 EXPORT_SYMBOL(dump_stack);
2205
2206 static inline int is_kernel_stack(struct task_struct *task,
2207                                   struct reg_window *rw)
2208 {
2209         unsigned long rw_addr = (unsigned long) rw;
2210         unsigned long thread_base, thread_end;
2211
2212         if (rw_addr < PAGE_OFFSET) {
2213                 if (task != &init_task)
2214                         return 0;
2215         }
2216
2217         thread_base = (unsigned long) task_stack_page(task);
2218         thread_end = thread_base + sizeof(union thread_union);
2219         if (rw_addr >= thread_base &&
2220             rw_addr < thread_end &&
2221             !(rw_addr & 0x7UL))
2222                 return 1;
2223
2224         return 0;
2225 }
2226
2227 static inline struct reg_window *kernel_stack_up(struct reg_window *rw)
2228 {
2229         unsigned long fp = rw->ins[6];
2230
2231         if (!fp)
2232                 return NULL;
2233
2234         return (struct reg_window *) (fp + STACK_BIAS);
2235 }
2236
2237 void die_if_kernel(char *str, struct pt_regs *regs)
2238 {
2239         static int die_counter;
2240         int count = 0;
2241         
2242         /* Amuse the user. */
2243         printk(
2244 "              \\|/ ____ \\|/\n"
2245 "              \"@'/ .. \\`@\"\n"
2246 "              /_| \\__/ |_\\\n"
2247 "                 \\__U_/\n");
2248
2249         printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);
2250         notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);
2251         __asm__ __volatile__("flushw");
2252         show_regs(regs);
2253         add_taint(TAINT_DIE);
2254         if (regs->tstate & TSTATE_PRIV) {
2255                 struct reg_window *rw = (struct reg_window *)
2256                         (regs->u_regs[UREG_FP] + STACK_BIAS);
2257
2258                 /* Stop the back trace when we hit userland or we
2259                  * find some badly aligned kernel stack.
2260                  */
2261                 while (rw &&
2262                        count++ < 30&&
2263                        is_kernel_stack(current, rw)) {
2264                         printk("Caller[%016lx]: %pS\n", rw->ins[7],
2265                                (void *) rw->ins[7]);
2266
2267                         rw = kernel_stack_up(rw);
2268                 }
2269                 instruction_dump ((unsigned int *) regs->tpc);
2270         } else {
2271                 if (test_thread_flag(TIF_32BIT)) {
2272                         regs->tpc &= 0xffffffff;
2273                         regs->tnpc &= 0xffffffff;
2274                 }
2275                 user_instruction_dump ((unsigned int __user *) regs->tpc);
2276         }
2277         if (regs->tstate & TSTATE_PRIV)
2278                 do_exit(SIGKILL);
2279         do_exit(SIGSEGV);
2280 }
2281 EXPORT_SYMBOL(die_if_kernel);
2282
2283 #define VIS_OPCODE_MASK ((0x3 << 30) | (0x3f << 19))
2284 #define VIS_OPCODE_VAL  ((0x2 << 30) | (0x36 << 19))
2285
2286 extern int handle_popc(u32 insn, struct pt_regs *regs);
2287 extern int handle_ldf_stq(u32 insn, struct pt_regs *regs);
2288
2289 void do_illegal_instruction(struct pt_regs *regs)
2290 {
2291         unsigned long pc = regs->tpc;
2292         unsigned long tstate = regs->tstate;
2293         u32 insn;
2294         siginfo_t info;
2295
2296         if (notify_die(DIE_TRAP, "illegal instruction", regs,
2297                        0, 0x10, SIGILL) == NOTIFY_STOP)
2298                 return;
2299
2300         if (tstate & TSTATE_PRIV)
2301                 die_if_kernel("Kernel illegal instruction", regs);
2302         if (test_thread_flag(TIF_32BIT))
2303                 pc = (u32)pc;
2304         if (get_user(insn, (u32 __user *) pc) != -EFAULT) {
2305                 if ((insn & 0xc1ffc000) == 0x81700000) /* POPC */ {
2306                         if (handle_popc(insn, regs))
2307                                 return;
2308                 } else if ((insn & 0xc1580000) == 0xc1100000) /* LDQ/STQ */ {
2309                         if (handle_ldf_stq(insn, regs))
2310                                 return;
2311                 } else if (tlb_type == hypervisor) {
2312                         if ((insn & VIS_OPCODE_MASK) == VIS_OPCODE_VAL) {
2313                                 if (!vis_emul(regs, insn))
2314                                         return;
2315                         } else {
2316                                 struct fpustate *f = FPUSTATE;
2317
2318                                 /* XXX maybe verify XFSR bits like
2319                                  * XXX do_fpother() does?
2320                                  */
2321                                 if (do_mathemu(regs, f))
2322                                         return;
2323                         }
2324                 }
2325         }
2326         info.si_signo = SIGILL;
2327         info.si_errno = 0;
2328         info.si_code = ILL_ILLOPC;
2329         info.si_addr = (void __user *)pc;
2330         info.si_trapno = 0;
2331         force_sig_info(SIGILL, &info, current);
2332 }
2333
2334 extern void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn);
2335
2336 void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr)
2337 {
2338         siginfo_t info;
2339
2340         if (notify_die(DIE_TRAP, "memory address unaligned", regs,
2341                        0, 0x34, SIGSEGV) == NOTIFY_STOP)
2342                 return;
2343
2344         if (regs->tstate & TSTATE_PRIV) {
2345                 kernel_unaligned_trap(regs, *((unsigned int *)regs->tpc));
2346                 return;
2347         }
2348         info.si_signo = SIGBUS;
2349         info.si_errno = 0;
2350         info.si_code = BUS_ADRALN;
2351         info.si_addr = (void __user *)sfar;
2352         info.si_trapno = 0;
2353         force_sig_info(SIGBUS, &info, current);
2354 }
2355
2356 void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_ctx)
2357 {
2358         siginfo_t info;
2359
2360         if (notify_die(DIE_TRAP, "memory address unaligned", regs,
2361                        0, 0x34, SIGSEGV) == NOTIFY_STOP)
2362                 return;
2363
2364         if (regs->tstate & TSTATE_PRIV) {
2365                 kernel_unaligned_trap(regs, *((unsigned int *)regs->tpc));
2366                 return;
2367         }
2368         info.si_signo = SIGBUS;
2369         info.si_errno = 0;
2370         info.si_code = BUS_ADRALN;
2371         info.si_addr = (void __user *) addr;
2372         info.si_trapno = 0;
2373         force_sig_info(SIGBUS, &info, current);
2374 }
2375
2376 void do_privop(struct pt_regs *regs)
2377 {
2378         siginfo_t info;
2379
2380         if (notify_die(DIE_TRAP, "privileged operation", regs,
2381                        0, 0x11, SIGILL) == NOTIFY_STOP)
2382                 return;
2383
2384         if (test_thread_flag(TIF_32BIT)) {
2385                 regs->tpc &= 0xffffffff;
2386                 regs->tnpc &= 0xffffffff;
2387         }
2388         info.si_signo = SIGILL;
2389         info.si_errno = 0;
2390         info.si_code = ILL_PRVOPC;
2391         info.si_addr = (void __user *)regs->tpc;
2392         info.si_trapno = 0;
2393         force_sig_info(SIGILL, &info, current);
2394 }
2395
2396 void do_privact(struct pt_regs *regs)
2397 {
2398         do_privop(regs);
2399 }
2400
2401 /* Trap level 1 stuff or other traps we should never see... */
2402 void do_cee(struct pt_regs *regs)
2403 {
2404         die_if_kernel("TL0: Cache Error Exception", regs);
2405 }
2406
2407 void do_cee_tl1(struct pt_regs *regs)
2408 {
2409         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2410         die_if_kernel("TL1: Cache Error Exception", regs);
2411 }
2412
2413 void do_dae_tl1(struct pt_regs *regs)
2414 {
2415         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2416         die_if_kernel("TL1: Data Access Exception", regs);
2417 }
2418
2419 void do_iae_tl1(struct pt_regs *regs)
2420 {
2421         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2422         die_if_kernel("TL1: Instruction Access Exception", regs);
2423 }
2424
2425 void do_div0_tl1(struct pt_regs *regs)
2426 {
2427         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2428         die_if_kernel("TL1: DIV0 Exception", regs);
2429 }
2430
2431 void do_fpdis_tl1(struct pt_regs *regs)
2432 {
2433         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2434         die_if_kernel("TL1: FPU Disabled", regs);
2435 }
2436
2437 void do_fpieee_tl1(struct pt_regs *regs)
2438 {
2439         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2440         die_if_kernel("TL1: FPU IEEE Exception", regs);
2441 }
2442
2443 void do_fpother_tl1(struct pt_regs *regs)
2444 {
2445         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2446         die_if_kernel("TL1: FPU Other Exception", regs);
2447 }
2448
2449 void do_ill_tl1(struct pt_regs *regs)
2450 {
2451         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2452         die_if_kernel("TL1: Illegal Instruction Exception", regs);
2453 }
2454
2455 void do_irq_tl1(struct pt_regs *regs)
2456 {
2457         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2458         die_if_kernel("TL1: IRQ Exception", regs);
2459 }
2460
2461 void do_lddfmna_tl1(struct pt_regs *regs)
2462 {
2463         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2464         die_if_kernel("TL1: LDDF Exception", regs);
2465 }
2466
2467 void do_stdfmna_tl1(struct pt_regs *regs)
2468 {
2469         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2470         die_if_kernel("TL1: STDF Exception", regs);
2471 }
2472
2473 void do_paw(struct pt_regs *regs)
2474 {
2475         die_if_kernel("TL0: Phys Watchpoint Exception", regs);
2476 }
2477
2478 void do_paw_tl1(struct pt_regs *regs)
2479 {
2480         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2481         die_if_kernel("TL1: Phys Watchpoint Exception", regs);
2482 }
2483
2484 void do_vaw(struct pt_regs *regs)
2485 {
2486         die_if_kernel("TL0: Virt Watchpoint Exception", regs);
2487 }
2488
2489 void do_vaw_tl1(struct pt_regs *regs)
2490 {
2491         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2492         die_if_kernel("TL1: Virt Watchpoint Exception", regs);
2493 }
2494
2495 void do_tof_tl1(struct pt_regs *regs)
2496 {
2497         dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
2498         die_if_kernel("TL1: Tag Overflow Exception", regs);
2499 }
2500
2501 void do_getpsr(struct pt_regs *regs)
2502 {
2503         regs->u_regs[UREG_I0] = tstate_to_psr(regs->tstate);
2504         regs->tpc   = regs->tnpc;
2505         regs->tnpc += 4;
2506         if (test_thread_flag(TIF_32BIT)) {
2507                 regs->tpc &= 0xffffffff;
2508                 regs->tnpc &= 0xffffffff;
2509         }
2510 }
2511
2512 struct trap_per_cpu trap_block[NR_CPUS];
2513 EXPORT_SYMBOL(trap_block);
2514
2515 /* This can get invoked before sched_init() so play it super safe
2516  * and use hard_smp_processor_id().
2517  */
2518 void notrace init_cur_cpu_trap(struct thread_info *t)
2519 {
2520         int cpu = hard_smp_processor_id();
2521         struct trap_per_cpu *p = &trap_block[cpu];
2522
2523         p->thread = t;
2524         p->pgd_paddr = 0;
2525 }
2526
2527 extern void thread_info_offsets_are_bolixed_dave(void);
2528 extern void trap_per_cpu_offsets_are_bolixed_dave(void);
2529 extern void tsb_config_offsets_are_bolixed_dave(void);
2530
2531 /* Only invoked on boot processor. */
2532 void __init trap_init(void)
2533 {
2534         /* Compile time sanity check. */
2535         BUILD_BUG_ON(TI_TASK != offsetof(struct thread_info, task) ||
2536                      TI_FLAGS != offsetof(struct thread_info, flags) ||
2537                      TI_CPU != offsetof(struct thread_info, cpu) ||
2538                      TI_FPSAVED != offsetof(struct thread_info, fpsaved) ||
2539                      TI_KSP != offsetof(struct thread_info, ksp) ||
2540                      TI_FAULT_ADDR != offsetof(struct thread_info,
2541                                                fault_address) ||
2542                      TI_KREGS != offsetof(struct thread_info, kregs) ||
2543                      TI_UTRAPS != offsetof(struct thread_info, utraps) ||
2544                      TI_EXEC_DOMAIN != offsetof(struct thread_info,
2545                                                 exec_domain) ||
2546                      TI_REG_WINDOW != offsetof(struct thread_info,
2547                                                reg_window) ||
2548                      TI_RWIN_SPTRS != offsetof(struct thread_info,
2549                                                rwbuf_stkptrs) ||
2550                      TI_GSR != offsetof(struct thread_info, gsr) ||
2551                      TI_XFSR != offsetof(struct thread_info, xfsr) ||
2552                      TI_PRE_COUNT != offsetof(struct thread_info,
2553                                               preempt_count) ||
2554                      TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
2555                      TI_SYS_NOERROR != offsetof(struct thread_info,
2556                                                 syscall_noerror) ||
2557                      TI_RESTART_BLOCK != offsetof(struct thread_info,
2558                                                   restart_block) ||
2559                      TI_KUNA_REGS != offsetof(struct thread_info,
2560                                               kern_una_regs) ||
2561                      TI_KUNA_INSN != offsetof(struct thread_info,
2562                                               kern_una_insn) ||
2563                      TI_FPREGS != offsetof(struct thread_info, fpregs) ||
2564                      (TI_FPREGS & (64 - 1)));
2565
2566         BUILD_BUG_ON(TRAP_PER_CPU_THREAD != offsetof(struct trap_per_cpu,
2567                                                      thread) ||
2568                      (TRAP_PER_CPU_PGD_PADDR !=
2569                       offsetof(struct trap_per_cpu, pgd_paddr)) ||
2570                      (TRAP_PER_CPU_CPU_MONDO_PA !=
2571                       offsetof(struct trap_per_cpu, cpu_mondo_pa)) ||
2572                      (TRAP_PER_CPU_DEV_MONDO_PA !=
2573                       offsetof(struct trap_per_cpu, dev_mondo_pa)) ||
2574                      (TRAP_PER_CPU_RESUM_MONDO_PA !=
2575                       offsetof(struct trap_per_cpu, resum_mondo_pa)) ||
2576                      (TRAP_PER_CPU_RESUM_KBUF_PA !=
2577                       offsetof(struct trap_per_cpu, resum_kernel_buf_pa)) ||
2578                      (TRAP_PER_CPU_NONRESUM_MONDO_PA !=
2579                       offsetof(struct trap_per_cpu, nonresum_mondo_pa)) ||
2580                      (TRAP_PER_CPU_NONRESUM_KBUF_PA !=
2581                       offsetof(struct trap_per_cpu, nonresum_kernel_buf_pa)) ||
2582                      (TRAP_PER_CPU_FAULT_INFO !=
2583                       offsetof(struct trap_per_cpu, fault_info)) ||
2584                      (TRAP_PER_CPU_CPU_MONDO_BLOCK_PA !=
2585                       offsetof(struct trap_per_cpu, cpu_mondo_block_pa)) ||
2586                      (TRAP_PER_CPU_CPU_LIST_PA !=
2587                       offsetof(struct trap_per_cpu, cpu_list_pa)) ||
2588                      (TRAP_PER_CPU_TSB_HUGE !=
2589                       offsetof(struct trap_per_cpu, tsb_huge)) ||
2590                      (TRAP_PER_CPU_TSB_HUGE_TEMP !=
2591                       offsetof(struct trap_per_cpu, tsb_huge_temp)) ||
2592                      (TRAP_PER_CPU_IRQ_WORKLIST_PA !=
2593                       offsetof(struct trap_per_cpu, irq_worklist_pa)) ||
2594                      (TRAP_PER_CPU_CPU_MONDO_QMASK !=
2595                       offsetof(struct trap_per_cpu, cpu_mondo_qmask)) ||
2596                      (TRAP_PER_CPU_DEV_MONDO_QMASK !=
2597                       offsetof(struct trap_per_cpu, dev_mondo_qmask)) ||
2598                      (TRAP_PER_CPU_RESUM_QMASK !=
2599                       offsetof(struct trap_per_cpu, resum_qmask)) ||
2600                      (TRAP_PER_CPU_NONRESUM_QMASK !=
2601                       offsetof(struct trap_per_cpu, nonresum_qmask)) ||
2602                      (TRAP_PER_CPU_PER_CPU_BASE !=
2603                       offsetof(struct trap_per_cpu, __per_cpu_base)));
2604
2605         BUILD_BUG_ON((TSB_CONFIG_TSB !=
2606                       offsetof(struct tsb_config, tsb)) ||
2607                      (TSB_CONFIG_RSS_LIMIT !=
2608                       offsetof(struct tsb_config, tsb_rss_limit)) ||
2609                      (TSB_CONFIG_NENTRIES !=
2610                       offsetof(struct tsb_config, tsb_nentries)) ||
2611                      (TSB_CONFIG_REG_VAL !=
2612                       offsetof(struct tsb_config, tsb_reg_val)) ||
2613                      (TSB_CONFIG_MAP_VADDR !=
2614                       offsetof(struct tsb_config, tsb_map_vaddr)) ||
2615                      (TSB_CONFIG_MAP_PTE !=
2616                       offsetof(struct tsb_config, tsb_map_pte)));
2617
2618         /* Attach to the address space of init_task.  On SMP we
2619          * do this in smp.c:smp_callin for other cpus.
2620          */
2621         atomic_inc(&init_mm.mm_count);
2622         current->active_mm = &init_mm;
2623 }