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