diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0010-x86-mce-Do-not-overwrite-MCi_STATUS-in-mce_no_way_ou.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.9.21/0010-x86-mce-Do-not-overwrite-MCi_STATUS-in-mce_no_way_ou.patch | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0010-x86-mce-Do-not-overwrite-MCi_STATUS-in-mce_no_way_ou.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0010-x86-mce-Do-not-overwrite-MCi_STATUS-in-mce_no_way_ou.patch new file mode 100644 index 00000000..d00a4886 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.9.21/0010-x86-mce-Do-not-overwrite-MCi_STATUS-in-mce_no_way_ou.patch @@ -0,0 +1,81 @@ +From 754013b3067881c493df74f91ad34099c3a32c61 Mon Sep 17 00:00:00 2001 +From: Borislav Petkov <bp@suse.de> +Date: Fri, 22 Jun 2018 11:54:28 +0200 +Subject: [PATCH 10/10] x86/mce: Do not overwrite MCi_STATUS in + mce_no_way_out() + +commit 1f74c8a64798e2c488f86efc97e308b85fb7d7aa upstream. + +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 +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + arch/x86/kernel/cpu/mcheck/mce.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c +index 4711e1c..bf6013d 100644 +--- a/arch/x86/kernel/cpu/mcheck/mce.c ++++ b/arch/x86/kernel/cpu/mcheck/mce.c +@@ -779,23 +779,25 @@ EXPORT_SYMBOL_GPL(machine_check_poll); + static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp, + struct pt_regs *regs) + { +- int i, ret = 0; + char *tmp; ++ int i; + + for (i = 0; i < mca_cfg.banks; i++) { + m->status = mce_rdmsrl(msr_ops.status(i)); +- if (m->status & MCI_STATUS_VAL) { +- __set_bit(i, validp); +- if (quirk_no_way_out) +- quirk_no_way_out(i, m, regs); +- } ++ if (!(m->status & MCI_STATUS_VAL)) ++ continue; ++ ++ __set_bit(i, validp); ++ if (quirk_no_way_out) ++ quirk_no_way_out(i, m, regs); + + if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) { ++ mce_read_aux(m, i); + *msg = tmp; +- ret = 1; ++ return 1; + } + } +- return ret; ++ return 0; + } + + /* +-- +2.7.4 + |