]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/cris/arch-v10/kernel/traps.c
Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi into...
[mirror_ubuntu-artful-kernel.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 11#include <linux/ptrace.h>
7c0f6ba6 12#include <linux/uaccess.h>
b17b0153
IM
13#include <linux/sched/debug.h>
14
556dcee7 15#include <arch/sv_addr_ag.h>
b1a154db 16#include <arch/system.h>
1da177e4 17
1e4cc2c8
JN
18void
19show_registers(struct pt_regs *regs)
1da177e4 20{
1e4cc2c8
JN
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 */
1da177e4
LT
27 unsigned long usp = rdusp();
28
1e4cc2c8
JN
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",
1da177e4 33 regs->r0, regs->r1, regs->r2, regs->r3);
1e4cc2c8
JN
34
35 printk(" r4: %08lx r5: %08lx r6: %08lx r7: %08lx\n",
1da177e4 36 regs->r4, regs->r5, regs->r6, regs->r7);
1e4cc2c8
JN
37
38 printk(" r8: %08lx r9: %08lx r10: %08lx r11: %08lx\n",
1da177e4 39 regs->r8, regs->r9, regs->r10, regs->r11);
1e4cc2c8
JN
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",
1da177e4
LT
47 current->comm, current->pid, (unsigned long)current);
48
49 /*
1e4cc2c8
JN
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;
1da177e4 55
1e4cc2c8 56 show_stack(NULL, (unsigned long *)usp);
1da177e4 57
1e4cc2c8
JN
58 /*
59 * If the previous stack-dump wasn't a kernel one, dump the
60 * kernel stack now.
61 */
1da177e4 62 if (usp != 0)
1e4cc2c8
JN
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])) {
83bad_value:
84 printk(" Bad IP value.");
85 break;
86 }
1da177e4
LT
87
88 if (i == 0)
1e4cc2c8 89 printk("(%02x) ", c);
1da177e4 90 else
1e4cc2c8
JN
91 printk("%02x ", c);
92 }
93 printk("\n");
94 }
1da177e4
LT
95}
96
1da177e4 97void
1e4cc2c8 98arch_enable_nmi(void)
1da177e4 99{
1e4cc2c8 100 asm volatile ("setf m");
1da177e4
LT
101}
102
1e4cc2c8
JN
103extern void (*nmi_handler)(struct pt_regs *);
104void handle_nmi(struct pt_regs *regs)
1da177e4 105{
1e4cc2c8
JN
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 ;
1da177e4 114}
059163ca 115
1e4cc2c8
JN
116#ifdef CONFIG_DEBUG_BUGVERBOSE
117void
118handle_BUG(struct pt_regs *regs)
059163ca 119{
1e4cc2c8
JN
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);
059163ca 132}
1e4cc2c8 133#endif