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
This commit is contained in:
Mark Johnston 2021-02-08 14:42:54 -05:00
parent 7da3bfc20c
commit b577047027

View File

@ -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;