mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-08 13:28:05 +00:00
x86 topo_probe: do not probe smp topology if only one cpu is visible
This could lead to a division by zero if hardware is multi-core and/or multi-threaded, but for some (quite unusual) reason FreeBSD sees only one logical processor. This could happen, for example, if neither MADT nor MP Table are presented by BIOS. Also: - assert in topo_probe_0x4 that BSP is accounted for - neither cpu_cores nor cpu_logical should be zero after successful probing, so either being zero is an indication of failed probing Reported by: vwe, Dan Allen <danallen46@airwired.net> Tested by: Dan Allen <danallen46@airwired.net> MFC after: 3 days
This commit is contained in:
parent
4ad7c12b2c
commit
3b50d59fef
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214774
@ -239,6 +239,9 @@ topo_probe_0x4(void)
|
||||
cpu_logical++;
|
||||
}
|
||||
|
||||
KASSERT(cpu_cores >= 1 && cpu_logical >= 1,
|
||||
("topo_probe_0x4 couldn't find BSP"));
|
||||
|
||||
cpu_cores /= cpu_logical;
|
||||
hyperthreading_cpus = cpu_logical;
|
||||
}
|
||||
@ -310,7 +313,9 @@ topo_probe(void)
|
||||
return;
|
||||
|
||||
logical_cpus_mask = 0;
|
||||
if (cpu_vendor_id == CPU_VENDOR_AMD)
|
||||
if (mp_ncpus <= 1)
|
||||
cpu_cores = cpu_logical = 1;
|
||||
else if (cpu_vendor_id == CPU_VENDOR_AMD)
|
||||
topo_probe_amd();
|
||||
else if (cpu_vendor_id == CPU_VENDOR_INTEL) {
|
||||
/*
|
||||
@ -332,10 +337,8 @@ topo_probe(void)
|
||||
* Fallback: assume each logical CPU is in separate
|
||||
* physical package. That is, no multi-core, no SMT.
|
||||
*/
|
||||
if (cpu_cores == 0)
|
||||
cpu_cores = 1;
|
||||
if (cpu_logical == 0)
|
||||
cpu_logical = 1;
|
||||
if (cpu_cores == 0 || cpu_logical == 0)
|
||||
cpu_cores = cpu_logical = 1;
|
||||
cpu_topo_probed = 1;
|
||||
}
|
||||
|
||||
|
@ -286,6 +286,9 @@ topo_probe_0x4(void)
|
||||
cpu_logical++;
|
||||
}
|
||||
|
||||
KASSERT(cpu_cores >= 1 && cpu_logical >= 1,
|
||||
("topo_probe_0x4 couldn't find BSP"));
|
||||
|
||||
cpu_cores /= cpu_logical;
|
||||
hyperthreading_cpus = cpu_logical;
|
||||
}
|
||||
@ -357,7 +360,9 @@ topo_probe(void)
|
||||
return;
|
||||
|
||||
logical_cpus_mask = 0;
|
||||
if (cpu_vendor_id == CPU_VENDOR_AMD)
|
||||
if (mp_ncpus <= 1)
|
||||
cpu_cores = cpu_logical = 1;
|
||||
else if (cpu_vendor_id == CPU_VENDOR_AMD)
|
||||
topo_probe_amd();
|
||||
else if (cpu_vendor_id == CPU_VENDOR_INTEL) {
|
||||
/*
|
||||
@ -379,10 +384,8 @@ topo_probe(void)
|
||||
* Fallback: assume each logical CPU is in separate
|
||||
* physical package. That is, no multi-core, no SMT.
|
||||
*/
|
||||
if (cpu_cores == 0)
|
||||
cpu_cores = 1;
|
||||
if (cpu_logical == 0)
|
||||
cpu_logical = 1;
|
||||
if (cpu_cores == 0 || cpu_logical == 0)
|
||||
cpu_cores = cpu_logical = 1;
|
||||
cpu_topo_probed = 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user