]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
arch/tile: fix up some minor trap handling issues
authorChris Metcalf <cmetcalf@tilera.com>
Thu, 29 Mar 2012 19:23:54 +0000 (15:23 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Mon, 2 Apr 2012 16:12:52 +0000 (12:12 -0400)
We now respond to MEM_ERROR traps (e.g. an atomic instruction to
non-cacheable memory) with a SIGBUS.

We also no longer generate a console crash message if a user
process die due to a SIGTRAP.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
arch/tile/kernel/intvec_64.S
arch/tile/kernel/traps.c

index 2c181c864ef7d043acb11b03975cda3dc7c2efd6..005535d108c130b9039e7eb399d9c721e94a33ab 100644 (file)
@@ -1178,7 +1178,7 @@ STD_ENTRY(fill_ra_stack)
 #define do_hardwall_trap bad_intr
 #endif
 
-       int_hand     INT_MEM_ERROR, MEM_ERROR, bad_intr
+       int_hand     INT_MEM_ERROR, MEM_ERROR, do_trap
        int_hand     INT_SINGLE_STEP_3, SINGLE_STEP_3, bad_intr
 #if CONFIG_KERNEL_PL == 2
        int_hand     INT_SINGLE_STEP_2, SINGLE_STEP_2, gx_singlestep_handle
index 32acfd9e23d0a05efba5b93c7fccb9711044bd84..73cff814ac57252065ca8086185f2fc7bb87c012 100644 (file)
@@ -200,7 +200,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,
 {
        siginfo_t info = { 0 };
        int signo, code;
-       unsigned long address;
+       unsigned long address = 0;
        bundle_bits instr;
 
        /* Re-enable interrupts. */
@@ -223,6 +223,10 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,
        }
 
        switch (fault_num) {
+       case INT_MEM_ERROR:
+               signo = SIGBUS;
+               code = BUS_OBJERR;
+               break;
        case INT_ILL:
                if (copy_from_user(&instr, (void __user *)regs->pc,
                                   sizeof(instr))) {
@@ -312,7 +316,8 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,
        info.si_addr = (void __user *)address;
        if (signo == SIGILL)
                info.si_trapno = fault_num;
-       trace_unhandled_signal("trap", regs, address, signo);
+       if (signo != SIGTRAP)
+               trace_unhandled_signal("trap", regs, address, signo);
        force_sig_info(signo, &info, current);
 }