Skip to content

Commit 1f74c8a

Browse files
suryasaimadhuKAGA-KOKO
authored andcommitted
x86/mce: Do not overwrite MCi_STATUS in mce_no_way_out()
mce_no_way_out() does a quick check during #MC to see whether some of the MCEs logged would require the kernel to panic immediately. And it passes a struct mce where MCi_STATUS gets written. However, after having saved a valid status value, the next iteration of the loop which goes over the MCA banks on the CPU, overwrites the valid status value because we're using struct mce as storage instead of a temporary variable. Which leads to MCE records with an empty status value: mce: [Hardware Error]: CPU 0: Machine Check Exception: 6 Bank 0: 0000000000000000 mce: [Hardware Error]: RIP 10:<ffffffffbd42fbd7> {trigger_mce+0x7/0x10} In order to prevent the loss of the status register value, return immediately when severity is a panic one so that we can panic immediately with the first fatal MCE logged. This is also the intention of this function and not to noodle over the banks while a fatal MCE is already logged. Tony: read the rest of the MCA bank to populate the struct mce fully. Suggested-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: <stable@vger.kernel.org> Link: https://lkml.kernel.org/r/20180622095428.626-8-bp@alien8.de
1 parent 4c5717d commit 1f74c8a

File tree

1 file changed

+10
-8
lines changed
  • arch/x86/kernel/cpu/mcheck

1 file changed

+10
-8
lines changed

arch/x86/kernel/cpu/mcheck/mce.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -772,23 +772,25 @@ EXPORT_SYMBOL_GPL(machine_check_poll);
772772
static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
773773
struct pt_regs *regs)
774774
{
775-
int i, ret = 0;
776775
char *tmp;
776+
int i;
777777

778778
for (i = 0; i < mca_cfg.banks; i++) {
779779
m->status = mce_rdmsrl(msr_ops.status(i));
780-
if (m->status & MCI_STATUS_VAL) {
781-
__set_bit(i, validp);
782-
if (quirk_no_way_out)
783-
quirk_no_way_out(i, m, regs);
784-
}
780+
if (!(m->status & MCI_STATUS_VAL))
781+
continue;
782+
783+
__set_bit(i, validp);
784+
if (quirk_no_way_out)
785+
quirk_no_way_out(i, m, regs);
785786

786787
if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
788+
mce_read_aux(m, i);
787789
*msg = tmp;
788-
ret = 1;
790+
return 1;
789791
}
790792
}
791-
return ret;
793+
return 0;
792794
}
793795

794796
/*

0 commit comments

Comments
 (0)