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