/* Fault was in user mode and we need to take some action */
        if ((m.cs & 3) == 3) {
-               ist_begin_non_atomic(regs);
-               local_irq_enable();
- 
-               if (kill_it || do_memory_failure(&m))
-                       force_sig(SIGBUS);
-               local_irq_disable();
-               ist_end_non_atomic();
+               /* If this triggers there is no way to recover. Die hard. */
+               BUG_ON(!on_thread_stack() || !user_mode(regs));
+ 
+               current->mce_addr = m.addr;
+               current->mce_status = m.mcgstatus;
+               current->mce_kill_me.func = kill_me_maybe;
+               if (kill_it)
+                       current->mce_kill_me.func = kill_me_now;
+               task_work_add(current, ¤t->mce_kill_me, true);
        } else {
 -              if (!fixup_exception(regs, X86_TRAP_MC, 0, 0))
 -                      mce_panic("Failed kernel mode recovery", &m, msg);
 +              /*
 +               * Handle an MCE which has happened in kernel space but from
 +               * which the kernel can recover: ex_has_fault_handler() has
 +               * already verified that the rIP at which the error happened is
 +               * a rIP from which the kernel can recover (by jumping to
 +               * recovery code specified in _ASM_EXTABLE_FAULT()) and the
 +               * corresponding exception handler which would do that is the
 +               * proper one.
 +               */
 +              if (m.kflags & MCE_IN_KERNEL_RECOV) {
-                       if (!fixup_exception(regs, X86_TRAP_MC, error_code, 0))
++                      if (!fixup_exception(regs, X86_TRAP_MC, 0, 0))
 +                              mce_panic("Failed kernel mode recovery", &m, msg);
 +              }
        }
- 
- out_ist:
-       ist_exit(regs);
  }
  EXPORT_SYMBOL_GPL(do_machine_check);
- NOKPROBE_SYMBOL(do_machine_check);
  
  #ifndef CONFIG_MEMORY_FAILURE
  int memory_failure(unsigned long pfn, int flags)