c0a501f29bd89dffc8173cf9a0c7fa62b19768ff
[sfrench/cifs-2.6.git] / arch / cris / arch-v10 / kernel / traps.c
1 /*
2  * Helper functions for trap handlers
3  *
4  * Copyright (C) 2000-2007, Axis Communications AB.
5  *
6  * Authors:   Bjorn Wesen
7  *            Hans-Peter Nilsson
8  *
9  */
10
11 #include <linux/ptrace.h>
12 #include <linux/uaccess.h>
13 #include <linux/sched/debug.h>
14
15 #include <arch/sv_addr_ag.h>
16 #include <arch/system.h>
17
18 void
19 show_registers(struct pt_regs *regs)
20 {
21         /*
22          * It's possible to use either the USP register or current->thread.usp.
23          * USP might not correspond to the current process for all cases this
24          * function is called, and current->thread.usp isn't up to date for the
25          * current process. Experience shows that using USP is the way to go.
26          */
27         unsigned long usp = rdusp();
28
29         printk("IRP: %08lx SRP: %08lx DCCR: %08lx USP: %08lx MOF: %08lx\n",
30                regs->irp, regs->srp, regs->dccr, usp, regs->mof);
31
32         printk(" r0: %08lx  r1: %08lx   r2: %08lx  r3: %08lx\n",
33                regs->r0, regs->r1, regs->r2, regs->r3);
34
35         printk(" r4: %08lx  r5: %08lx   r6: %08lx  r7: %08lx\n",
36                regs->r4, regs->r5, regs->r6, regs->r7);
37
38         printk(" r8: %08lx  r9: %08lx  r10: %08lx r11: %08lx\n",
39                regs->r8, regs->r9, regs->r10, regs->r11);
40
41         printk("r12: %08lx r13: %08lx oR10: %08lx  sp: %08lx\n",
42                regs->r12, regs->r13, regs->orig_r10, (long unsigned)regs);
43
44         printk("R_MMU_CAUSE: %08lx\n", (unsigned long)*R_MMU_CAUSE);
45
46         printk("Process %s (pid: %d, stackpage=%08lx)\n",
47                current->comm, current->pid, (unsigned long)current);
48
49         /*
50          * When in-kernel, we also print out the stack and code at the
51          * time of the fault..
52          */
53         if (!user_mode(regs)) {
54                 int i;
55
56                 show_stack(NULL, (unsigned long *)usp);
57
58                 /*
59                  * If the previous stack-dump wasn't a kernel one, dump the
60                  * kernel stack now.
61                  */
62                 if (usp != 0)
63                         show_stack(NULL, NULL);
64
65                 printk("\nCode: ");
66
67                 if (regs->irp < PAGE_OFFSET)
68                         goto bad_value;
69
70                 /*
71                  * Quite often the value at regs->irp doesn't point to the
72                  * interesting instruction, which often is the previous
73                  * instruction. So dump at an offset large enough that the
74                  * instruction decoding should be in sync at the interesting
75                  * point, but small enough to fit on a row. The regs->irp
76                  * location is pointed out in a ksymoops-friendly way by
77                  * wrapping the byte for that address in parenthesises.
78                  */
79                 for (i = -12; i < 12; i++) {
80                         unsigned char c;
81
82                         if (__get_user(c, &((unsigned char *)regs->irp)[i])) {
83 bad_value:
84                                 printk(" Bad IP value.");
85                                 break;
86                         }
87
88                         if (i == 0)
89                                 printk("(%02x) ", c);
90                         else
91                                 printk("%02x ", c);
92                 }
93                 printk("\n");
94         }
95 }
96
97 void
98 arch_enable_nmi(void)
99 {
100         asm volatile ("setf m");
101 }
102
103 extern void (*nmi_handler)(struct pt_regs *);
104 void handle_nmi(struct pt_regs *regs)
105 {
106         if (nmi_handler)
107                 nmi_handler(regs);
108
109         /* Wait until nmi is no longer active. (We enable NMI immediately after
110            returning from this function, and we don't want it happening while
111            exiting from the NMI interrupt handler.) */
112         while (*R_IRQ_MASK0_RD & IO_STATE(R_IRQ_MASK0_RD, nmi_pin, active))
113                 ;
114 }
115
116 #ifdef CONFIG_DEBUG_BUGVERBOSE
117 void
118 handle_BUG(struct pt_regs *regs)
119 {
120         struct bug_frame f;
121         unsigned char c;
122         unsigned long irp = regs->irp;
123
124         if (__copy_from_user(&f, (const void __user *)(irp - 8), sizeof f))
125                 return;
126         if (f.prefix != BUG_PREFIX || f.magic != BUG_MAGIC)
127                 return;
128         if (__get_user(c, f.filename))
129                 f.filename = "<bad filename>";
130
131         printk("kernel BUG at %s:%d!\n", f.filename, f.line);
132 }
133 #endif