e81c9efba0
Doublequote the eval arguments to ensure whitespace is preserved, so a cpu_brand of "Genuine Intel(R) CPU T2500 @ 2.00GHz" is not converted down to "Genuine Intel(R) CPU T2500 @ 2.00GHz"
244 lines
7.9 KiB
Text
Executable file
244 lines
7.9 KiB
Text
Executable file
# $NetBSD: subr_NetBSD,v 1.11 2009/03/12 23:57:28 abs Exp $
|
|
|
|
AWK=awk
|
|
SED=sed
|
|
|
|
display_hw_details()
|
|
{
|
|
cat <<END
|
|
OS : '$(uname)'
|
|
OS version : '$(uname -r)'
|
|
hw.model : '$hw_model'
|
|
hw.machine : '$hw_machine'
|
|
hw.machine_arch : '$hw_machine_arch'
|
|
CPU : '$cpu'
|
|
END
|
|
extract_x86_cpu_vars
|
|
echo "$cpu_details"
|
|
}
|
|
|
|
extract_hw_details()
|
|
{
|
|
hw_model=$(sysctl -n hw.model | $SED 's/^ *//')
|
|
hw_machine=$(sysctl -n hw.machine)
|
|
hw_machine_arch=$(sysctl -n hw.machine_arch)
|
|
if [ "$hw_machine_arch" = i386 -o "$hw_machine_arch" = x86_64 ] ; then
|
|
if [ -x /usr/sbin/cpuctl ] ; then
|
|
cpu_details="$(cpuctl identify 0 | grep ^cpu0:)"
|
|
else
|
|
cpu_details="$(grep ^cpu0: /var/run/dmesg.boot)"
|
|
fi
|
|
eval "$(extract_x86_cpu_vars)"
|
|
fi
|
|
|
|
# We're almost certainly crosscompiling
|
|
if [ -n "$MACHINE" -a $hw_machine != "$MACHINE" ]; then
|
|
echo
|
|
exit
|
|
fi
|
|
}
|
|
|
|
extract_x86_cpu_vars()
|
|
{
|
|
# Set: cpu_feature_FOO=1 for each 'FOO' feature reported
|
|
# cpu_name="NAME" taken from the first cpu0: line
|
|
# cpu_brand="BRAND" the CPU branding string
|
|
echo "$cpu_details" | $AWK '
|
|
{ if (/cpu0:/ && !n) { sub("cpu0: ",""); n=1; print "cpu_name=\""$0"\"" } }
|
|
/cpu0: ".*"/ { sub("[^\"]*", ""); print "cpu_brand="$0 }
|
|
/cpu0: features/ {
|
|
sub(".*<","");
|
|
sub(">.*","");
|
|
gsub("[^,A-Z0-9]","_");
|
|
split($0, features, /,/)
|
|
for (f in features)
|
|
print "cpu_feature_"features[f]"=1";
|
|
}
|
|
/cpu0: family/ {
|
|
for (i = 2; i < NF; i = i + 2) {
|
|
f=$(i+1);
|
|
sub(/^0/, "", f);
|
|
print "cpu_"$i"="f
|
|
}
|
|
}
|
|
'
|
|
}
|
|
|
|
determine_arch()
|
|
{
|
|
ARCH=
|
|
# When adding $hw_model tests use maximum context (such as trailing space)
|
|
case $hw_machine_arch in
|
|
|
|
alpha)
|
|
# cpu0 at mainbus0: ID 0 (primary), 21164A-0 (unknown ...
|
|
case "$(egrep '^cpu0 ' /var/run/dmesg.boot)" in
|
|
*[\(\ ]2106[46][-A\ \)]*) ARCH="-mcpu=21064" ;;
|
|
*[\(\ ]21164[-\ \)]*) ARCH="-mcpu=21164" ;;
|
|
*[\(\ ]21164A[-\ \)]*) ARCH="-mcpu=21164a" ;;
|
|
*[\(\ ]21264[-\ \)]*) ARCH="-mcpu=21264" ;;
|
|
*[\(\ ]21264[AB][-\ \)]*) ARCH="-mcpu=21264a" ;;
|
|
*\ PCA56-2) ARCH="-mcpu=21164pc" ;;
|
|
esac
|
|
;;
|
|
|
|
arm | arm32) case $hw_model in
|
|
ARM610*) ARCH="-mcpu=arm610" ;; # risc pc
|
|
ARM710*) ARCH="-mcpu=arm710" ;; # risc pc
|
|
i80321\ *) ARCH="-mcpu=xscale" ;; # iyonix
|
|
SA-110*)
|
|
case $hw_machine in # arm32 split post 1.5
|
|
cats|shark|hpcarm|netwinder)
|
|
ARCH="-mcpu=strongarm110" ;;
|
|
acorn32)
|
|
ARCH="-march=armv3m -mtune=strongarm" ;;
|
|
*)
|
|
# memorybus in strongarm risc pc machines cannot support
|
|
# certain strongarm instructions, but in 1.5 and earlier
|
|
# all strongarm machines are 'arm32', so uname and sysctl
|
|
# no use
|
|
if egrep -q 'ofbus0|footbridge0' /var/run/dmesg.boot \
|
|
2>/dev/null ; then
|
|
ARCH="-mcpu=strongarm110" # shark/cats
|
|
else
|
|
ARCH="-march=armv3m -mtune=strongarm" # risc pc
|
|
fi
|
|
esac ;;
|
|
esac ;;
|
|
|
|
hppa)
|
|
case "$(egrep '^cpu0 ' /var/run/dmesg.boot)" in
|
|
*\ PA7100\ *) ARCH="-march=1.1 -mschedule=7100" ;; # untested
|
|
*\ PA7150\ *) ARCH="-march=1.1 -mschedule=7100" ;; # untested
|
|
*\ PA7100LC\ *) ARCH="-march=1.1 -mschedule=7100LC" ;; # untested
|
|
*\ PA7200\ *) ARCH="-march=1.1 -mschedule=7200" ;; # untested
|
|
*\ PA7300LC\ *) ARCH="-march=1.1 -mschedule=7300" ;; # B180L
|
|
*\ PA8*) ARCH="-march=2.0 -mschedule=8000" ;; # untested
|
|
esac
|
|
;;
|
|
|
|
i386 | x86_64)
|
|
include subr_x86 # this provides map_x86_brand_string()
|
|
ARCH=$(map_x86_brand_string)
|
|
if [ -z "$ARCH" ] ; then
|
|
case "$cpu_name" in
|
|
'AMD Athlon 64 X2 (686-class)'*) ARCH='-march=athlon64' ;;
|
|
'AMD Athlon 64 or Athlon 64 FX or Opteron '*) ARCH='-march=opteron' ;;
|
|
'AMD Athlon 64 or Sempron (686-class)'*) ARCH='-march=athlon64' ;;
|
|
'AMD Athlon Model 4 (Thunderbird) '*) ARCH='-march=athlon-tbird' ;;
|
|
'AMD Dual-Core Opteron or Athlon 64 X2 '*) ARCH='-march=opteron' ;;
|
|
'AMD Family 10h (686-class)'*) ARCH='-march=amdfam10' ;;
|
|
'AMD K6-2 (586-class)'*) ARCH="-march=k6-2" ;;
|
|
|
|
# Intel PIII & earlier - later Intel handled by map_x86_brand_string
|
|
'Intel (686-class)'*) ARCH='-march=pentiumpro' ;;
|
|
'Intel Pentium II (686-class)'*) ARCH='-march=pentium2' ;;
|
|
'Intel Pentium III (686-class)'*) ARCH='-march=pentium3' ;;
|
|
'Intel Pentium III (Katmai) (686-class)'*) ARCH='-march=pentium3' ;;
|
|
'Intel Pentium III Xeon (686-class)'*) ARCH='-march=pentium3' ;;
|
|
|
|
# Fallback classes
|
|
*'(586-class)'*) ARCH='-march=pentium' ;;
|
|
*'(486-class)'*) ARCH='-march=i486' ;;
|
|
esac
|
|
fi
|
|
;;
|
|
|
|
m68k) case $hw_model in # Examples
|
|
*\(68020*|*\ MC68020\ *) ARCH='-m68020' ;; # Untested
|
|
*\(68030*|*\ MC68030\ *) ARCH='-m68030' ;; # Mac LC III
|
|
*\(68040*|*\ MC68040\ *) ARCH='-m68040' ;; # Untested
|
|
*\(68060*|*\ MC68060\ *) ARCH='-m68060' ;; # Upgraded amiga 3000
|
|
esac
|
|
;;
|
|
|
|
mipseb|mipsel)
|
|
# cpu0 at mainbus0: QED R4600 Orion CPU (0x2020) Rev. 2.0 with ...
|
|
case $hw_model in
|
|
Infineon\ ADM5120) ARCH='-march=4kc' ;;
|
|
*)
|
|
case "$(egrep '^cpu0 ' /var/run/dmesg.boot)" in
|
|
*\ MIPS\ R2000\ *) ARCH="-march=r2000" ;;
|
|
*\ MIPS\ R3000\ *) ARCH="-march=r3000" ;;
|
|
*\ MIPS\ R3000A\ *) ARCH="-march=r3000" ;;
|
|
*\ Toshiba\ TX3912\ *) ARCH="-march=r3900" ;;
|
|
*\ Toshiba\ TX392[27]\ *) ARCH="-march=r3900" ;;
|
|
*\ MIPS\ R4000\ *) ARCH="-mtune=r4000 -mips2" ;; # mips3
|
|
*\ MIPS\ R4400\ *) ARCH="-mtune=r4400 -mips2" ;; # mips3
|
|
*\ NEC\ VR4100\ *) ARCH="-mtune=r4100 -mips2" ;; # mips3
|
|
*\ NEC\ VR4300\ *) ARCH="-mtune=r4300 -mips2" ;; # mips3
|
|
*\ QED\ R4600\ *) ARCH="-mtune=r4600 -mips2" ;; # mips3
|
|
*\ MIPS\ R5000\ *) ARCH="-mtune=r5000 -mips2" ;; # mips4
|
|
*\ QED\ RM5200\ *) ARCH="-mtune=r5000 -mips2" ;; # mips4
|
|
*\ MIPS\ R6000\ *) ARCH="-mtune=r6000 -mips2" ;;
|
|
*\ MIPS\ R8000\ *) ARCH="-mtune=r8000 -mips2" ;; # mips4
|
|
*\ MIPS\ R10000\ *) ARCH="-march=mips4 -mabi=32" ;; # mips4
|
|
esac ;;
|
|
esac
|
|
;;
|
|
|
|
powerpc) case $hw_model in # Examples
|
|
601\ *) ARCH='-mcpu=601' ;; # Untested
|
|
602\ *) ARCH='-mcpu=602' ;; # Untested
|
|
603\ *) ARCH='-mcpu=603' ;; # Untested
|
|
603e\ *|603ev\ *) ARCH='-mcpu=603e' ;; # Umax C500 / PM4400
|
|
604\ *) ARCH='-mcpu=604' ;; # Mac 8500
|
|
604e\ *) ARCH='-mcpu=604e' ;; # upgr B&W G3
|
|
604ev\ *) ARCH='-mcpu=604e' ;; # usually 604e
|
|
620\ *) ARCH='-mcpu=620' ;; # Untested
|
|
7400\ *) ARCH='-mcpu=7400' ;; # AGP G4/400 Mac
|
|
740\ *) ARCH='-mcpu=740' ;; # Untested
|
|
7410\ *) ARCH='-mcpu=7400' ;; # powerbook g4
|
|
7447A\ *) ARCH='-mcpu=7450' ;; #
|
|
7450\ *) ARCH='-mcpu=7450' ;; # tibook 550
|
|
750\ *) ARCH='-mcpu=750' ;; # orig. iBook
|
|
|
|
esac ;;
|
|
|
|
sparc | sparc64) case " $hw_model" in # Examples
|
|
*[\ \(]MB86900/1A*) ARCH='-mcpu=cypress' ;; # ss1+
|
|
*[\ \(]L64811*) ARCH='-mcpu=cypress' ;; # sun4/sun4c
|
|
*[\ \(]CY7C601*) ARCH='-mcpu=cypress' ;; # ss2
|
|
*[\ \(]W8601/8701*) ARCH='-mcpu=cypress' ;; # elc
|
|
*[\ \(]MB86904*) ARCH='-mcpu=supersparc' ;; # ss5 usparc
|
|
*[\ \(]MB86907*) ARCH='-mcpu=supersparc' ;; # ss5 usparc
|
|
*[\ \(]TMS390S10*) ARCH='-mcpu=supersparc' ;; # classic "
|
|
*[\ \(]TMS390Z50*) ARCH='-mcpu=supersparc' ;; # ss10/ss20
|
|
*[\ \(]RT620/625*) ARCH='-mcpu=hypersparc' ;; # ss20 ross
|
|
*[\ \(]MB86930*) ARCH='-mcpu=sparclite' ;; # from gcc
|
|
*[\ \(]MB86934*) ARCH='-mcpu=sparclite' ;; # from gcc
|
|
# under 1.5.1 -mcpu=ultrasparc chokes egcs-2.91.66 compiling perl
|
|
*[\ \(]SUNW,UltraSPARC*) ARCH='-mcpu=v9' ;; # Ultra
|
|
esac ;;
|
|
|
|
vax) # No VAX specific gcc optimisations available
|
|
NOARCH=1
|
|
;;
|
|
|
|
esac
|
|
echo $ARCH
|
|
}
|
|
|
|
determine_features()
|
|
{
|
|
FEATURES=
|
|
|
|
case $hw_machine_arch in
|
|
i386 | x86_64)
|
|
if [ -n "$cpu_feature_SSE3" ] ; then
|
|
FEATURES="-mfpmath=sse -msse3"
|
|
elif [ -n "$cpu_feature_SSE2" ] ; then
|
|
FEATURES="-mfpmath=sse -msse2"
|
|
elif [ -n "$cpu_feature_SSE" ] ; then
|
|
FEATURES="-mfpmath=sse -msse"
|
|
fi
|
|
;;
|
|
m68k)
|
|
case "$(egrep '^fpu0 ' /var/run/dmesg.boot)" in
|
|
*\(emulator\)*) FEATURES="-msoft-float" ;;
|
|
*\(no\ math\ support\)*) FEATURES="-msoft-float" ;;
|
|
esac
|
|
;;
|
|
esac
|
|
echo $FEATURES
|
|
}
|