The branch main has been updated by markj:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b5770470276268acef21368b3e77a325df883500

commit b5770470276268acef21368b3e77a325df883500
Author:     Mark Johnston <ma...@freebsd.org>
AuthorDate: 2021-02-08 19:42:54 +0000
Commit:     Mark Johnston <ma...@freebsd.org>
CommitDate: 2021-02-08 19:42:54 +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)
    MFC after:      1 week
---
 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;
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to