1
0
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:
Andriy Gapon 2010-11-04 08:51:45 +00:00
parent 4ad7c12b2c
commit 3b50d59fef
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214774
2 changed files with 16 additions and 10 deletions

View File

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

View File

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