diff options
author | Paul Mundt <lethal@linux-sh.org> | 2007-03-08 05:41:21 -0500 |
---|---|---|
committer | Paul Mundt <lethal@hera.kernel.org> | 2007-05-06 22:10:53 -0400 |
commit | fa69151173b1fc6fa3ced0edd5c2ea83b5d32bc1 (patch) | |
tree | e7af97ccddc06d54dd6d6982a64cbf4982693379 /arch/sh/kernel/traps.c | |
parent | 45ed285b54930767937deb0eaf718b1d08c3c475 (diff) |
sh: generic BUG() support.
Wire up GENERIC_BUG for SH. This moves off of the special bug
frame and on to the generic struct bug_entry. Roughly the same
semantics are retained, and we can kill off some of the verbose
BUG() reporting code.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/traps.c')
-rw-r--r-- | arch/sh/kernel/traps.c | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index e9f168f60f95..77107838271f 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/kallsyms.h> | 19 | #include <linux/kallsyms.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/bug.h> | ||
21 | #include <linux/debug_locks.h> | 22 | #include <linux/debug_locks.h> |
22 | #include <linux/limits.h> | 23 | #include <linux/limits.h> |
23 | #include <asm/system.h> | 24 | #include <asm/system.h> |
@@ -130,40 +131,6 @@ static int die_if_no_fixup(const char * str, struct pt_regs * regs, long err) | |||
130 | return -EFAULT; | 131 | return -EFAULT; |
131 | } | 132 | } |
132 | 133 | ||
133 | #ifdef CONFIG_BUG | ||
134 | #ifdef CONFIG_DEBUG_BUGVERBOSE | ||
135 | static inline void do_bug_verbose(struct pt_regs *regs) | ||
136 | { | ||
137 | struct bug_frame f; | ||
138 | long len; | ||
139 | |||
140 | if (__copy_from_user(&f, (const void __user *)regs->pc, | ||
141 | sizeof(struct bug_frame))) | ||
142 | return; | ||
143 | |||
144 | len = __strnlen_user(f.file, PATH_MAX) - 1; | ||
145 | if (unlikely(len < 0 || len >= PATH_MAX)) | ||
146 | f.file = "<bad filename>"; | ||
147 | len = __strnlen_user(f.func, PATH_MAX) - 1; | ||
148 | if (unlikely(len < 0 || len >= PATH_MAX)) | ||
149 | f.func = "<bad function>"; | ||
150 | |||
151 | printk(KERN_ALERT "kernel BUG in %s() at %s:%d!\n", | ||
152 | f.func, f.file, f.line); | ||
153 | } | ||
154 | #else | ||
155 | static inline void do_bug_verbose(struct pt_regs *regs) | ||
156 | { | ||
157 | } | ||
158 | #endif /* CONFIG_DEBUG_BUGVERBOSE */ | ||
159 | |||
160 | void handle_BUG(struct pt_regs *regs) | ||
161 | { | ||
162 | do_bug_verbose(regs); | ||
163 | die("Kernel BUG", regs, TRAPA_BUG_OPCODE & 0xff); | ||
164 | } | ||
165 | #endif /* CONFIG_BUG */ | ||
166 | |||
167 | /* | 134 | /* |
168 | * handle an instruction that does an unaligned memory access by emulating the | 135 | * handle an instruction that does an unaligned memory access by emulating the |
169 | * desired behaviour | 136 | * desired behaviour |
@@ -888,6 +855,25 @@ void __init trap_init(void) | |||
888 | per_cpu_trap_init(); | 855 | per_cpu_trap_init(); |
889 | } | 856 | } |
890 | 857 | ||
858 | #ifdef CONFIG_BUG | ||
859 | void handle_BUG(struct pt_regs *regs) | ||
860 | { | ||
861 | enum bug_trap_type tt; | ||
862 | tt = report_bug(regs->pc); | ||
863 | if (tt == BUG_TRAP_TYPE_WARN) { | ||
864 | regs->pc += 2; | ||
865 | return; | ||
866 | } | ||
867 | |||
868 | die("Kernel BUG", regs, TRAPA_BUG_OPCODE & 0xff); | ||
869 | } | ||
870 | |||
871 | int is_valid_bugaddr(unsigned long addr) | ||
872 | { | ||
873 | return addr >= PAGE_OFFSET; | ||
874 | } | ||
875 | #endif | ||
876 | |||
891 | void show_trace(struct task_struct *tsk, unsigned long *sp, | 877 | void show_trace(struct task_struct *tsk, unsigned long *sp, |
892 | struct pt_regs *regs) | 878 | struct pt_regs *regs) |
893 | { | 879 | { |