aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r--arch/arm/kernel/traps.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 908915675edc..24095601359b 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -32,13 +32,6 @@
32#include "ptrace.h" 32#include "ptrace.h"
33#include "signal.h" 33#include "signal.h"
34 34
35const char *processor_modes[]=
36{ "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
37 "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
38 "USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "UK6_32" , "ABT_32" ,
39 "UK8_32" , "UK9_32" , "UK10_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
40};
41
42static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; 35static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
43 36
44#ifdef CONFIG_DEBUG_USER 37#ifdef CONFIG_DEBUG_USER
@@ -289,7 +282,10 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
289 regs->ARM_pc -= correction; 282 regs->ARM_pc -= correction;
290 283
291 pc = (void __user *)instruction_pointer(regs); 284 pc = (void __user *)instruction_pointer(regs);
292 if (thumb_mode(regs)) { 285
286 if (processor_mode(regs) == SVC_MODE) {
287 instr = *(u32 *) pc;
288 } else if (thumb_mode(regs)) {
293 get_user(instr, (u16 __user *)pc); 289 get_user(instr, (u16 __user *)pc);
294 } else { 290 } else {
295 get_user(instr, (u32 __user *)pc); 291 get_user(instr, (u32 __user *)pc);
@@ -337,12 +333,11 @@ asmlinkage void do_unexp_fiq (struct pt_regs *regs)
337 * It never returns, and never tries to sync. We hope that we can at least 333 * It never returns, and never tries to sync. We hope that we can at least
338 * dump out some state information... 334 * dump out some state information...
339 */ 335 */
340asmlinkage void bad_mode(struct pt_regs *regs, int reason, int proc_mode) 336asmlinkage void bad_mode(struct pt_regs *regs, int reason)
341{ 337{
342 console_verbose(); 338 console_verbose();
343 339
344 printk(KERN_CRIT "Bad mode in %s handler detected: mode %s\n", 340 printk(KERN_CRIT "Bad mode in %s handler detected\n", handler[reason]);
345 handler[reason], processor_modes[proc_mode]);
346 341
347 die("Oops - bad mode", regs, 0); 342 die("Oops - bad mode", regs, 0);
348 local_irq_disable(); 343 local_irq_disable();