configure: unify case statements for CPU canonicalization
The CPU model has to be canonicalized to what Meson wants in the cross file, to what Linux uses for its asm-$ARCH directories, and to what QEMU uses for its user-mode emulation host/$ARCH directories. Do all three in a single case statement, and check that the Linux and QEMU directories actually exist. At a small cost in repeated lines, this ensures that there are no hidden ordering requirements between the case statements. In particular, commit89e5b7935e
("configure: Fix linux-user host detection for riscv64", 2023-08-06) broke ppc64le because it assigned host_arch based on a non-canonicalized version of $cpu. Reported-by: Joel Stanley <joel@jms.id.au> Fixes:89e5b7935e
("configure: Fix linux-user host detection for riscv64", 2023-08-06) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru> Tested-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Michael Tokarev <mjt@tls.msk.ru> Message-ID: <20230808120303.585509-4-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
50a0012227
commit
971fac2731
175
configure
vendored
175
configure
vendored
@ -469,59 +469,119 @@ else
|
||||
echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
|
||||
fi
|
||||
|
||||
case "$cpu" in
|
||||
riscv*)
|
||||
host_arch=riscv ;;
|
||||
x32)
|
||||
host_arch=x86_64 ;;
|
||||
*)
|
||||
host_arch="$cpu" ;;
|
||||
esac
|
||||
|
||||
# Normalise host CPU name and set multilib cflags. The canonicalization
|
||||
# isn't really necessary, because the architectures that we check for
|
||||
# should not hit the 'uname -m' case, but better safe than sorry.
|
||||
# Normalise host CPU name to the values used by Meson cross files and in source
|
||||
# directories, and set multilib cflags. The canonicalization isn't really
|
||||
# necessary, because the architectures that we check for should not hit the
|
||||
# 'uname -m' case, but better safe than sorry in case --cpu= is used.
|
||||
#
|
||||
# Note that this case should only have supported host CPUs, not guests.
|
||||
# Please keep it sorted and synchronized with meson.build's host_arch.
|
||||
host_arch=
|
||||
linux_arch=
|
||||
case "$cpu" in
|
||||
aarch64)
|
||||
host_arch=aarch64
|
||||
linux_arch=arm64
|
||||
;;
|
||||
|
||||
armv*b|armv*l|arm)
|
||||
cpu="arm" ;;
|
||||
cpu=arm
|
||||
host_arch=arm
|
||||
linux_arch=arm
|
||||
;;
|
||||
|
||||
i386|i486|i586|i686)
|
||||
cpu="i386"
|
||||
CPU_CFLAGS="-m32" ;;
|
||||
host_arch=i386
|
||||
linux_arch=x86
|
||||
CPU_CFLAGS="-m32"
|
||||
;;
|
||||
|
||||
loongarch*)
|
||||
cpu=loongarch64
|
||||
host_arch=loongarch64
|
||||
;;
|
||||
|
||||
mips64*)
|
||||
cpu=mips64
|
||||
host_arch=mips
|
||||
linux_arch=mips
|
||||
;;
|
||||
mips*)
|
||||
cpu=mips
|
||||
host_arch=mips
|
||||
linux_arch=mips
|
||||
;;
|
||||
|
||||
ppc)
|
||||
host_arch=ppc
|
||||
linux_arch=powerpc
|
||||
CPU_CFLAGS="-m32"
|
||||
;;
|
||||
ppc64)
|
||||
host_arch=ppc64
|
||||
linux_arch=powerpc
|
||||
CPU_CFLAGS="-m64 -mbig-endian"
|
||||
;;
|
||||
ppc64le)
|
||||
cpu=ppc64
|
||||
host_arch=ppc64
|
||||
linux_arch=powerpc
|
||||
CPU_CFLAGS="-m64 -mlittle-endian"
|
||||
;;
|
||||
|
||||
riscv32 | riscv64)
|
||||
host_arch=riscv
|
||||
linux_arch=riscv
|
||||
;;
|
||||
|
||||
s390)
|
||||
linux_arch=s390
|
||||
CPU_CFLAGS="-m31"
|
||||
;;
|
||||
s390x)
|
||||
host_arch=s390x
|
||||
linux_arch=s390
|
||||
CPU_CFLAGS="-m64"
|
||||
;;
|
||||
|
||||
sparc|sun4[cdmuv])
|
||||
cpu=sparc
|
||||
CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
|
||||
;;
|
||||
sparc64)
|
||||
host_arch=sparc64
|
||||
CPU_CFLAGS="-m64 -mcpu=ultrasparc"
|
||||
;;
|
||||
|
||||
x32)
|
||||
cpu="x86_64"
|
||||
CPU_CFLAGS="-mx32" ;;
|
||||
host_arch=x86_64
|
||||
linux_arch=x86
|
||||
CPU_CFLAGS="-mx32"
|
||||
;;
|
||||
x86_64|amd64)
|
||||
cpu="x86_64"
|
||||
host_arch=x86_64
|
||||
linux_arch=x86
|
||||
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
|
||||
# If we truly care, we should simply detect this case at
|
||||
# runtime and generate the fallback to serial emulation.
|
||||
CPU_CFLAGS="-m64 -mcx16" ;;
|
||||
|
||||
mips*)
|
||||
cpu="mips" ;;
|
||||
|
||||
ppc)
|
||||
CPU_CFLAGS="-m32" ;;
|
||||
ppc64)
|
||||
CPU_CFLAGS="-m64 -mbig-endian" ;;
|
||||
ppc64le)
|
||||
cpu="ppc64"
|
||||
CPU_CFLAGS="-m64 -mlittle-endian" ;;
|
||||
|
||||
s390)
|
||||
CPU_CFLAGS="-m31" ;;
|
||||
s390x)
|
||||
CPU_CFLAGS="-m64" ;;
|
||||
|
||||
sparc|sun4[cdmuv])
|
||||
cpu="sparc"
|
||||
CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
|
||||
sparc64)
|
||||
CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
|
||||
CPU_CFLAGS="-m64 -mcx16"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -n "$host_arch" && {
|
||||
! test -d "$source_path/linux-user/include/host/$host_arch" ||
|
||||
! test -d "$source_path/common-user/host/$host_arch"; }; then
|
||||
error_exit "linux-user/include/host/$host_arch does not exist." \
|
||||
"This is a bug in the configure script, please report it."
|
||||
fi
|
||||
if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arch"; then
|
||||
error_exit "linux-headers/asm-$linux_arch does not exist." \
|
||||
"This is a bug in the configure script, please report it."
|
||||
fi
|
||||
|
||||
check_py_version() {
|
||||
# We require python >= 3.7.
|
||||
# NB: a True python conditional creates a non-zero return code (Failure)
|
||||
@ -812,7 +872,7 @@ default_target_list=""
|
||||
mak_wilds=""
|
||||
|
||||
if [ "$linux_user" != no ]; then
|
||||
if [ "$targetos" = linux ] && [ -d "$source_path/linux-user/include/host/$host_arch" ]; then
|
||||
if [ "$targetos" = linux ] && [ -n "$host_arch" ]; then
|
||||
linux_user=yes
|
||||
elif [ "$linux_user" = yes ]; then
|
||||
error_exit "linux-user not supported on this architecture"
|
||||
@ -1717,40 +1777,9 @@ echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
|
||||
echo "CC=$cc" >> $config_host_mak
|
||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||
|
||||
# use included Linux headers
|
||||
if test "$linux" = "yes" ; then
|
||||
mkdir -p linux-headers
|
||||
case "$cpu" in
|
||||
i386|x86_64)
|
||||
linux_arch=x86
|
||||
;;
|
||||
ppc|ppc64)
|
||||
linux_arch=powerpc
|
||||
;;
|
||||
s390x)
|
||||
linux_arch=s390
|
||||
;;
|
||||
aarch64)
|
||||
linux_arch=arm64
|
||||
;;
|
||||
loongarch*)
|
||||
linux_arch=loongarch
|
||||
;;
|
||||
mips64)
|
||||
linux_arch=mips
|
||||
;;
|
||||
riscv32|riscv64)
|
||||
linux_arch=riscv
|
||||
;;
|
||||
*)
|
||||
# For most CPUs the kernel architecture name and QEMU CPU name match.
|
||||
linux_arch="$cpu"
|
||||
;;
|
||||
esac
|
||||
# For non-KVM architectures we will not have asm headers
|
||||
if [ -e "$source_path/linux-headers/asm-$linux_arch" ]; then
|
||||
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
|
||||
fi
|
||||
# use included Linux headers for KVM architectures
|
||||
if test "$linux" = "yes" && test -n "$linux_arch"; then
|
||||
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
|
||||
fi
|
||||
|
||||
for target in $target_list; do
|
||||
|
Loading…
Reference in New Issue
Block a user