|
@@ -330,6 +330,7 @@ void show_regs(struct pt_regs *regs)
|
|
|
void show_registers(struct pt_regs *regs)
|
|
|
{
|
|
|
const int field = 2 * sizeof(unsigned long);
|
|
|
+ mm_segment_t old_fs = get_fs();
|
|
|
|
|
|
__show_regs(regs);
|
|
|
print_modules();
|
|
@@ -344,9 +345,13 @@ void show_registers(struct pt_regs *regs)
|
|
|
printk("*HwTLS: %0*lx\n", field, tls);
|
|
|
}
|
|
|
|
|
|
+ if (!user_mode(regs))
|
|
|
+ /* Necessary for getting the correct stack content */
|
|
|
+ set_fs(KERNEL_DS);
|
|
|
show_stacktrace(current, regs);
|
|
|
show_code((unsigned int __user *) regs->cp0_epc);
|
|
|
printk("\n");
|
|
|
+ set_fs(old_fs);
|
|
|
}
|
|
|
|
|
|
static int regs_to_trapnr(struct pt_regs *regs)
|
|
@@ -1488,10 +1493,14 @@ int register_nmi_notifier(struct notifier_block *nb)
|
|
|
|
|
|
void __noreturn nmi_exception_handler(struct pt_regs *regs)
|
|
|
{
|
|
|
+ char str[100];
|
|
|
+
|
|
|
raw_notifier_call_chain(&nmi_chain, 0, regs);
|
|
|
bust_spinlocks(1);
|
|
|
- printk("NMI taken!!!!\n");
|
|
|
- die("NMI", regs);
|
|
|
+ snprintf(str, 100, "CPU%d NMI taken, CP0_EPC=%lx\n",
|
|
|
+ smp_processor_id(), regs->cp0_epc);
|
|
|
+ regs->cp0_epc = read_c0_errorepc();
|
|
|
+ die(str, regs);
|
|
|
}
|
|
|
|
|
|
#define VECTORSPACING 0x100 /* for EI/VI mode */
|