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:
parent
7da3bfc20c
commit
b577047027
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user