static int crash_nmi_callback(struct pt_regs *regs, int cpu)
{
+ struct pt_regs fixed_regs;
local_irq_disable();
+
+ /* CPU does not save ss and esp on stack if execution is already
+ * running in kernel mode at the time of NMI occurrence. This code
+ * fixes it.
+ */
+ if (!user_mode(regs)) {
+ memcpy(&fixed_regs, regs, sizeof(*regs));
+ fixed_regs.esp = (unsigned long)&(regs->esp);
+ __asm__ __volatile__("xorl %eax, %eax;");
+ __asm__ __volatile__ ("movw %%ss, %%ax;" :"=a"(fixed_regs.xss));
+ regs = &fixed_regs;
+ }
crash_save_this_cpu(regs, cpu);
disable_local_APIC();
atomic_dec(&waiting_for_crash_ipi);