ARC: unaligned access emulation error handling consolidation
authorVineet Gupta <vgupta@synopsys.com>
Thu, 4 Apr 2013 09:07:52 +0000 (14:37 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Tue, 7 May 2013 08:13:55 +0000 (13:43 +0530)
If CONFIG_ARC_MISALIGN_ACCESS is not enabled, or if the fixup fails,
call the same error handler: same signal/si_code to user (SIGBUS)

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/kernel/entry.S
arch/arc/kernel/traps.c

index 91eeab8..666a486 100644 (file)
@@ -393,12 +393,12 @@ ARC_ENTRY EV_TLBProtV
 #ifdef  CONFIG_ARC_MISALIGN_ACCESS
        SAVE_CALLEE_SAVED_USER
        mov r3, sp              ; callee_regs
-#endif
 
        bl  do_misaligned_access
 
-#ifdef  CONFIG_ARC_MISALIGN_ACCESS
        DISCARD_CALLEE_SAVED_USER
+#else
+       bl  do_misaligned_error
 #endif
 
        b   ret_from_exception
index 74839d1..0471d9c 100644 (file)
@@ -84,6 +84,7 @@ DO_ERROR_INFO(SIGILL, "Invalid Extn Insn", do_extension_fault, ILL_ILLOPC)
 DO_ERROR_INFO(SIGILL, "Illegal Insn (or Seq)", insterror_is_error, ILL_ILLOPC)
 DO_ERROR_INFO(SIGBUS, "Invalid Mem Access", do_memory_error, BUS_ADRERR)
 DO_ERROR_INFO(SIGTRAP, "Breakpoint Set", trap_is_brkpt, TRAP_BRKPT)
+DO_ERROR_INFO(SIGBUS, "Misaligned Access", do_misaligned_error, BUS_ADRALN)
 
 #ifdef CONFIG_ARC_MISALIGN_ACCESS
 /*
@@ -92,21 +93,11 @@ DO_ERROR_INFO(SIGTRAP, "Breakpoint Set", trap_is_brkpt, TRAP_BRKPT)
 int do_misaligned_access(unsigned long cause, unsigned long address,
                         struct pt_regs *regs, struct callee_regs *cregs)
 {
-       if (misaligned_fixup(address, regs, cause, cregs) != 0) {
-               siginfo_t info;
-
-               info.si_signo = SIGBUS;
-               info.si_errno = 0;
-               info.si_code = BUS_ADRALN;
-               info.si_addr = (void __user *)address;
-               return handle_exception(cause, "Misaligned Access", regs,
-                                         &info);
-       }
+       if (misaligned_fixup(address, regs, cause, cregs) != 0)
+               return do_misaligned_error(cause, address, regs);
+
        return 0;
 }
-
-#else
-DO_ERROR_INFO(SIGSEGV, "Misaligned Access", do_misaligned_access, SEGV_ACCERR)
 #endif
 
 /*