git: 8eebd9592e3d - stable/13 - mca: Handle inconsistent CMCI capability reporting
Mark Johnston
markj at FreeBSD.org
Mon Feb 15 19:23:57 UTC 2021
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=8eebd9592e3daf80c2c743666614119d6c862186
commit 8eebd9592e3daf80c2c743666614119d6c862186
Author: Mark Johnston <markj at FreeBSD.org>
AuthorDate: 2021-02-08 19:42:54 +0000
Commit: Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-02-15 19:12:41 +0000
mca: Handle inconsistent CMCI capability reporting
A BIOS bug may apparently cause the BSP to report that it does not
implement CMCI, with some APs reporting that they do. In this scenario,
avoid a NULL pointer dereference that occurs in cmci_monitor() because
cmc_state was not allocated by the BSP.
PR: 253272
Reported by: asomers, mmacy
Reviewed by: kib (previous version)
(cherry picked from commit b5770470276268acef21368b3e77a325df883500)
---
sys/x86/x86/mca.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c
index 03100e77d455..801e18073a52 100644
--- a/sys/x86/x86/mca.c
+++ b/sys/x86/x86/mca.c
@@ -1070,6 +1070,20 @@ cmci_monitor(int i)
KASSERT(i < mca_banks, ("CPU %d has more MC banks", PCPU_GET(cpuid)));
+ /*
+ * It is possible for some APs to report CMCI support even if the BSP
+ * does not, apparently due to a BIOS bug.
+ */
+ if (cmc_state == NULL) {
+ if (bootverbose) {
+ printf(
+ "AP %d (%d,%d) reports CMCI support but the BSP does not\n",
+ PCPU_GET(cpuid), PCPU_GET(apic_id),
+ PCPU_GET(acpi_id));
+ }
+ return;
+ }
+
ctl = rdmsr(MSR_MC_CTL2(i));
if (ctl & MC_CTL2_CMCI_EN)
/* Already monitored by another CPU. */
@@ -1114,6 +1128,10 @@ cmci_resume(int i)
KASSERT(i < mca_banks, ("CPU %d has more MC banks", PCPU_GET(cpuid)));
+ /* See cmci_monitor(). */
+ if (cmc_state == NULL)
+ return;
+
/* Ignore banks not monitored by this CPU. */
if (!(PCPU_GET(cmci_mask) & 1 << i))
return;
More information about the dev-commits-src-all
mailing list