diff options
author | Mark Johnston <markj@FreeBSD.org> | 2021-02-08 19:42:54 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2021-02-15 19:47:04 +0000 |
commit | dadf603f0f7b54c65fa5f16f552ae6da12f8210b (patch) | |
tree | b037acc5d0bf2a4a4745295cef70869f1775f267 | |
parent | cedb8de26ccc46a9b8215dad58f411b93d101db5 (diff) | |
download | src-dadf603f0f7b54c65fa5f16f552ae6da12f8210b.tar.gz src-dadf603f0f7b54c65fa5f16f552ae6da12f8210b.zip |
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)
-rw-r--r-- | sys/x86/x86/mca.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c index d1488ff0ff82..1d2cc56e117d 100644 --- a/sys/x86/x86/mca.c +++ b/sys/x86/x86/mca.c @@ -913,6 +913,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. */ @@ -957,6 +971,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; |