Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[pandora-kernel.git] / arch / mips / kernel / traps.c
index f9165d1..426cced 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/bootmem.h>
 #include <linux/interrupt.h>
 #include <linux/ptrace.h>
+#include <linux/kgdb.h>
+#include <linux/kdebug.h>
 
 #include <asm/bootinfo.h>
 #include <asm/branch.h>
@@ -71,7 +73,6 @@ extern asmlinkage void handle_reserved(void);
 extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
        struct mips_fpu_struct *ctx, int has_fpu);
 
-void (*board_watchpoint_handler)(struct pt_regs *regs);
 void (*board_be_init)(void);
 int (*board_be_handler)(struct pt_regs *regs, int is_fixup);
 void (*board_nmi_handler_setup)(void);
@@ -249,11 +250,11 @@ static void __show_regs(const struct pt_regs *regs)
        /*
         * Saved cp0 registers
         */
-       printk("epc   : %0*lx ", field, regs->cp0_epc);
-       print_symbol("%s ", regs->cp0_epc);
+       printk("epc   : %0*lx %pS\n", field, regs->cp0_epc,
+              (void *) regs->cp0_epc);
        printk("    %s\n", print_tainted());
-       printk("ra    : %0*lx ", field, regs->regs[31]);
-       print_symbol("%s\n", regs->regs[31]);
+       printk("ra    : %0*lx %pS\n", field, regs->regs[31],
+              (void *) regs->regs[31]);
 
        printk("Status: %08x    ", (uint32_t) regs->cp0_status);
 
@@ -426,6 +427,10 @@ asmlinkage void do_be(struct pt_regs *regs)
        printk(KERN_ALERT "%s bus error, epc == %0*lx, ra == %0*lx\n",
               data ? "Data" : "Instruction",
               field, regs->cp0_epc, field, regs->regs[31]);
+       if (notify_die(DIE_OOPS, "bus error", regs, SIGBUS, 0, 0)
+           == NOTIFY_STOP)
+               return;
+
        die_if_kernel("Oops", regs);
        force_sig(SIGBUS, current);
 }
@@ -624,6 +629,9 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
 {
        siginfo_t info;
 
+       if (notify_die(DIE_FP, "FP exception", regs, SIGFPE, 0, 0)
+           == NOTIFY_STOP)
+               return;
        die_if_kernel("FP exception in kernel code", regs);
 
        if (fcr31 & FPU_CSR_UNI_X) {
@@ -683,6 +691,9 @@ static void do_trap_or_bp(struct pt_regs *regs, unsigned int code,
        siginfo_t info;
        char b[40];
 
+       if (notify_die(DIE_TRAP, str, regs, code, 0, 0) == NOTIFY_STOP)
+               return;
+
        /*
         * A short test says that IRIX 5.3 sends SIGTRAP for all trap
         * insns, even for trap and break codes that indicate arithmetic
@@ -763,6 +774,10 @@ asmlinkage void do_ri(struct pt_regs *regs)
        unsigned int opcode = 0;
        int status = -1;
 
+       if (notify_die(DIE_RI, "RI Fault", regs, SIGSEGV, 0, 0)
+           == NOTIFY_STOP)
+               return;
+
        die_if_kernel("Reserved instruction in kernel code", regs);
 
        if (unlikely(compute_return_epc(regs) < 0))
@@ -892,11 +907,6 @@ asmlinkage void do_mdmx(struct pt_regs *regs)
 
 asmlinkage void do_watch(struct pt_regs *regs)
 {
-       if (board_watchpoint_handler) {
-               (*board_watchpoint_handler)(regs);
-               return;
-       }
-
        /*
         * We use the watch exception where available to detect stack
         * overflows.
@@ -1543,6 +1553,11 @@ void __init trap_init(void)
        extern char except_vec4;
        unsigned long i;
 
+#if defined(CONFIG_KGDB)
+       if (kgdb_early_setup)
+               return; /* Already done */
+#endif
+
        if (cpu_has_veic || cpu_has_vint)
                ebase = (unsigned long) alloc_bootmem_low_pages(0x200 + VECTORSPACING*64);
        else