diff options
Diffstat (limited to 'arch/sh/kernel/traps_32.c')
-rw-r--r-- | arch/sh/kernel/traps_32.c | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index b8f5a51841e..5f513a64ded 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
@@ -16,13 +16,11 @@ | |||
16 | #include <linux/hardirq.h> | 16 | #include <linux/hardirq.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
19 | #include <linux/module.h> | ||
20 | #include <linux/kallsyms.h> | 19 | #include <linux/kallsyms.h> |
21 | #include <linux/io.h> | 20 | #include <linux/io.h> |
22 | #include <linux/bug.h> | 21 | #include <linux/bug.h> |
23 | #include <linux/debug_locks.h> | 22 | #include <linux/debug_locks.h> |
24 | #include <linux/kdebug.h> | 23 | #include <linux/kdebug.h> |
25 | #include <linux/kexec.h> | ||
26 | #include <linux/limits.h> | 24 | #include <linux/limits.h> |
27 | #include <linux/sysfs.h> | 25 | #include <linux/sysfs.h> |
28 | #include <linux/uaccess.h> | 26 | #include <linux/uaccess.h> |
@@ -48,75 +46,6 @@ | |||
48 | #define TRAP_ILLEGAL_SLOT_INST 13 | 46 | #define TRAP_ILLEGAL_SLOT_INST 13 |
49 | #endif | 47 | #endif |
50 | 48 | ||
51 | static DEFINE_SPINLOCK(die_lock); | ||
52 | |||
53 | void die(const char * str, struct pt_regs * regs, long err) | ||
54 | { | ||
55 | static int die_counter; | ||
56 | |||
57 | oops_enter(); | ||
58 | |||
59 | spin_lock_irq(&die_lock); | ||
60 | console_verbose(); | ||
61 | bust_spinlocks(1); | ||
62 | |||
63 | printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); | ||
64 | print_modules(); | ||
65 | show_regs(regs); | ||
66 | |||
67 | printk("Process: %s (pid: %d, stack limit = %p)\n", current->comm, | ||
68 | task_pid_nr(current), task_stack_page(current) + 1); | ||
69 | |||
70 | if (!user_mode(regs) || in_interrupt()) | ||
71 | dump_mem("Stack: ", regs->regs[15], THREAD_SIZE + | ||
72 | (unsigned long)task_stack_page(current)); | ||
73 | |||
74 | notify_die(DIE_OOPS, str, regs, err, 255, SIGSEGV); | ||
75 | |||
76 | bust_spinlocks(0); | ||
77 | add_taint(TAINT_DIE); | ||
78 | spin_unlock_irq(&die_lock); | ||
79 | oops_exit(); | ||
80 | |||
81 | if (kexec_should_crash(current)) | ||
82 | crash_kexec(regs); | ||
83 | |||
84 | if (in_interrupt()) | ||
85 | panic("Fatal exception in interrupt"); | ||
86 | |||
87 | if (panic_on_oops) | ||
88 | panic("Fatal exception"); | ||
89 | |||
90 | do_exit(SIGSEGV); | ||
91 | } | ||
92 | |||
93 | static inline void die_if_kernel(const char *str, struct pt_regs *regs, | ||
94 | long err) | ||
95 | { | ||
96 | if (!user_mode(regs)) | ||
97 | die(str, regs, err); | ||
98 | } | ||
99 | |||
100 | /* | ||
101 | * try and fix up kernelspace address errors | ||
102 | * - userspace errors just cause EFAULT to be returned, resulting in SEGV | ||
103 | * - kernel/userspace interfaces cause a jump to an appropriate handler | ||
104 | * - other kernel errors are bad | ||
105 | */ | ||
106 | static void die_if_no_fixup(const char * str, struct pt_regs * regs, long err) | ||
107 | { | ||
108 | if (!user_mode(regs)) { | ||
109 | const struct exception_table_entry *fixup; | ||
110 | fixup = search_exception_tables(regs->pc); | ||
111 | if (fixup) { | ||
112 | regs->pc = fixup->fixup; | ||
113 | return; | ||
114 | } | ||
115 | |||
116 | die(str, regs, err); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | static inline void sign_extend(unsigned int count, unsigned char *dst) | 49 | static inline void sign_extend(unsigned int count, unsigned char *dst) |
121 | { | 50 | { |
122 | #ifdef __LITTLE_ENDIAN__ | 51 | #ifdef __LITTLE_ENDIAN__ |