}
});
+sub parse_cpuinfo() {
+ IsSet("CONFIG_EXACT_CPU") && IsSet("CONFIG_LINUX") && open X, "/proc/cpuinfo" || undef;
+ my %pc = ();
+ while (<X>) {
+ chomp;
+ /^$/ && last;
+ /^([^\t]+)\t+:\s*(.*)$/ and $pc{$1}=$2;
+ }
+ close X;
+
+ my $vendor = $pc{'vendor_id'} || "";
+ my $family = $pc{'cpu family'} || 0;
+ my $model = $pc{'model'} || 0;
+ return ($vendor, $family, $model);
+}
+
Test("CPU_ARCH", "Checking for CPU architecture", sub {
my $mach = Get("ARCH");
if ($mach eq "i386") {
Set("CPU_ALLOW_UNALIGNED");
Set("CPU_STRUCT_ALIGN" => 4);
my $arch = "";
- if (IsSet("CONFIG_EXACT_CPU") && IsSet("CONFIG_LINUX") && open X, "/proc/cpuinfo") {
- my %pc = ();
- while (<X>) {
- chomp;
- /^$/ && last;
- /^([^\t]+)\t+:\s*(.*)$/ and $pc{$1}=$2;
- }
- close X;
-
+ if (my ($vendor, $family, $model) = parse_cpuinfo()) {
# Try to understand CPU vendor, family and model [inspired by MPlayer's configure script]
- my $vendor = $pc{'vendor_id'} || "";
- my $family = $pc{'cpu family'} || 0;
- my $model = $pc{'model'} || 0;
if ($vendor eq "AuthenticAMD") {
if ($family >= 6) {
if ($model >= 31 && $gccver >= 3004) { $arch = "athlon64"; }
else { $arch = "athlon"; }
}
} elsif ($vendor eq "GenuineIntel") {
- # We don't recognize Prescott and Nocona cores yet (gcc-3.4+)
- if ($family >= 15 && $gccver >= 3003) { $arch = "pentium4"; }
- elsif ($family >= 6 && $gccver >= 3003) {
- if ($model >= 7) { $arch = "pentium3"; }
+ if ($family >= 15 && $gccver >= 3003) {
+ if ($model >= 4) { $arch = "nocona"; }
+ elsif ($model >= 3) { $arch = "prescott"; }
+ else { $arch = "pentium4"; }
+ } elsif ($family == 6 && $gccver >= 3003) {
+ if (($model == 9 || $model == 13) && $gccver >= 3004) { $arch = "pentium-m"; }
+ elsif ($model >= 7) { $arch = "pentium3"; }
elsif ($model >= 3) { $arch = "pentium2"; }
}
}
$arch = "i${family}86";
}
}
- if ($arch ne "") {
- Log "(using /proc/cpuinfo) ";
- } else {
- Log "(don't understand /proc/cpuinfo) ";
- }
+ Log (($arch ne "") ? "(using /proc/cpuinfo) " : "(don't understand /proc/cpuinfo) ");
}
return $arch ? $arch : "i386";
} elsif ($mach eq "amd64") {
UnSet("CPU_BIG_ENDIAN");
Set("CPU_ALLOW_UNALIGNED");
Set("CPU_STRUCT_ALIGN" => 8);
- return "x86-64";
+ if (my ($vendor, $family, $model) = parse_cpuinfo()) {
+ # In x86-64 world, the detection is somewhat easier so far...
+ if ($vendor eq "AuthenticAMD") {
+ $arch = "athlon64";
+ } elsif ($vendor eq "GenuineIntel") {
+ $arch = "nocona";
+ }
+ Log (($arch ne "") ? "(using /proc/cpuinfo) " : "(don't understand /proc/cpuinfo) ");
+ }
+ return $arch ? $arch : "x86-64";
} else {
return undef;
}