blob: 092f657bd5cac450e43f4e9e52432a510bceea47 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
commit f87e1f30a39055cdb3b10964a805a9b5e41e6a77
Author: Jim Harris <james.r.harris@intel.com>
Date: Mon Apr 14 22:59:44 2014 -0700
FreeBSD: ensure cpuctl(4) driver is loaded.
Also do a couple of sanity checks on some of the apic cpuid parsing.
This just ensures we get a sensible error messages rather than an
FPE if some logic bug is found in the apic parsing code.
diff --git cpucounters.cpp cpucounters.cpp
index df8a802..0a9fc26 100644
--- cpucounters.cpp
+++ cpucounters.cpp
@@ -63,6 +63,8 @@ int convertUnknownToInt(size_t size, char* value);
#endif
#if defined (__FreeBSD__)
+#include <sys/param.h>
+#include <sys/module.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/sem.h>
@@ -735,11 +737,23 @@ PCM::PCM() :
std::cerr << "Unable to get kern.smp.cpus from sysctl." << std::endl;
return;
}
+
+ if (modfind("cpuctl") == -1)
+ {
+ std::cout << "cpuctl(4) not loaded." << std::endl;
+ return;
+ }
do_cpuid(1, cpuid_args.data);
apic_ids_per_package = (cpuid_args.data[1] & 0x00FF0000) >> 16;
+ if (apic_ids_per_package == 0)
+ {
+ std::cout << "apic_ids_per_package == 0" << std::endl;
+ return;
+ }
+
cpuid_count(0xb, 0x0, cpuid_args.data);
if ((cpuid_args.data[2] & 0xFF00) == 0x100)
@@ -747,6 +761,12 @@ PCM::PCM() :
else
apic_ids_per_core = 1;
+ if (apic_ids_per_core == 0)
+ {
+ std::cout << "apic_ids_per_core == 0" << std::endl;
+ return;
+ }
+
for (int i = 0; i < num_cores; i++)
{
char cpuctl_name[64];
|