summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/mp_machdep.c
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2010-11-04 08:51:45 +0000
committeravg <avg@FreeBSD.org>2010-11-04 08:51:45 +0000
commit18175daafce6733afb1b9a5739461f91eebddac0 (patch)
tree839812957b76fc936643910f6773c7364af7d89b /sys/amd64/amd64/mp_machdep.c
parentfd55e0e68b0492c2a6afef17be172d4f7ea44398 (diff)
downloadFreeBSD-src-18175daafce6733afb1b9a5739461f91eebddac0.zip
FreeBSD-src-18175daafce6733afb1b9a5739461f91eebddac0.tar.gz
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
Diffstat (limited to 'sys/amd64/amd64/mp_machdep.c')
-rw-r--r--sys/amd64/amd64/mp_machdep.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 3868428..f2951da 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -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;
}
OpenPOWER on IntegriCloud