Skip to content

Commit fd8e016

Browse files
RocheWilliamgregkh
authored andcommitted
x86/mce/amd: Check SMCA feature bit before accessing SMCA MSRs
commit 201bc18 upstream. People do effort to inject MCEs into guests in order to simulate/test handling of hardware errors. The real use case behind it is testing the handling of SIGBUS which the memory failure code sends to the process. If that process is QEMU, instead of killing the whole guest, the MCE can be injected into the guest kernel so that latter can attempt proper handling and kill the user *process* in the guest, instead, which caused the MCE. The assumption being here that the whole injection flow can supply enough information that the guest kernel can pinpoint the right process. But that's a different topic... Regardless of virtualization or not, access to SMCA-specific registers like MCA_DESTAT should only be done after having checked the smca feature bit. And there are AMD machines like Bulldozer (the one before Zen1) which do support deferred errors but are not SMCA machines. Therefore, properly check the feature bit before accessing related MSRs. [ bp: Rewrite commit message. ] Fixes: 7cb735d ("x86/mce: Unify AMD DFR handler with MCA Polling") Signed-off-by: William Roche <william.roche@oracle.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20260218163025.1316501-1-william.roche@oracle.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent cc267e4 commit fd8e016

1 file changed

Lines changed: 11 additions & 6 deletions

File tree

  • arch/x86/kernel/cpu/mce

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -875,13 +875,18 @@ void amd_clear_bank(struct mce *m)
875875
{
876876
amd_reset_thr_limit(m->bank);
877877

878-
/* Clear MCA_DESTAT for all deferred errors even those logged in MCA_STATUS. */
879-
if (m->status & MCI_STATUS_DEFERRED)
880-
mce_wrmsrq(MSR_AMD64_SMCA_MCx_DESTAT(m->bank), 0);
878+
if (mce_flags.smca) {
879+
/*
880+
* Clear MCA_DESTAT for all deferred errors even those
881+
* logged in MCA_STATUS.
882+
*/
883+
if (m->status & MCI_STATUS_DEFERRED)
884+
mce_wrmsrq(MSR_AMD64_SMCA_MCx_DESTAT(m->bank), 0);
881885

882-
/* Don't clear MCA_STATUS if MCA_DESTAT was used exclusively. */
883-
if (m->kflags & MCE_CHECK_DFR_REGS)
884-
return;
886+
/* Don't clear MCA_STATUS if MCA_DESTAT was used exclusively. */
887+
if (m->kflags & MCE_CHECK_DFR_REGS)
888+
return;
889+
}
885890

886891
mce_wrmsrq(mca_msr_reg(m->bank, MCA_STATUS), 0);
887892
}

0 commit comments

Comments
 (0)