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
|
@ -469,59 +469,119 @@ else
|
||||||
echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
|
echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$cpu" in
|
# Normalise host CPU name to the values used by Meson cross files and in source
|
||||||
riscv*)
|
# directories, and set multilib cflags. The canonicalization isn't really
|
||||||
host_arch=riscv ;;
|
# necessary, because the architectures that we check for should not hit the
|
||||||
x32)
|
# 'uname -m' case, but better safe than sorry in case --cpu= is used.
|
||||||
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.
|
|
||||||
# Note that this case should only have supported host CPUs, not guests.
|
# 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
|
case "$cpu" in
|
||||||
|
aarch64)
|
||||||
|
host_arch=aarch64
|
||||||
|
linux_arch=arm64
|
||||||
|
;;
|
||||||
|
|
||||||
armv*b|armv*l|arm)
|
armv*b|armv*l|arm)
|
||||||
cpu="arm" ;;
|
cpu=arm
|
||||||
|
host_arch=arm
|
||||||
|
linux_arch=arm
|
||||||
|
;;
|
||||||
|
|
||||||
i386|i486|i586|i686)
|
i386|i486|i586|i686)
|
||||||
cpu="i386"
|
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)
|
x32)
|
||||||
cpu="x86_64"
|
cpu="x86_64"
|
||||||
CPU_CFLAGS="-mx32" ;;
|
host_arch=x86_64
|
||||||
|
linux_arch=x86
|
||||||
|
CPU_CFLAGS="-mx32"
|
||||||
|
;;
|
||||||
x86_64|amd64)
|
x86_64|amd64)
|
||||||
cpu="x86_64"
|
cpu="x86_64"
|
||||||
|
host_arch=x86_64
|
||||||
|
linux_arch=x86
|
||||||
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
|
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
|
||||||
# If we truly care, we should simply detect this case at
|
# If we truly care, we should simply detect this case at
|
||||||
# runtime and generate the fallback to serial emulation.
|
# runtime and generate the fallback to serial emulation.
|
||||||
CPU_CFLAGS="-m64 -mcx16" ;;
|
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" ;;
|
|
||||||
esac
|
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() {
|
check_py_version() {
|
||||||
# We require python >= 3.7.
|
# We require python >= 3.7.
|
||||||
# NB: a True python conditional creates a non-zero return code (Failure)
|
# NB: a True python conditional creates a non-zero return code (Failure)
|
||||||
|
@ -812,7 +872,7 @@ default_target_list=""
|
||||||
mak_wilds=""
|
mak_wilds=""
|
||||||
|
|
||||||
if [ "$linux_user" != no ]; then
|
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
|
linux_user=yes
|
||||||
elif [ "$linux_user" = yes ]; then
|
elif [ "$linux_user" = yes ]; then
|
||||||
error_exit "linux-user not supported on this architecture"
|
error_exit "linux-user not supported on this architecture"
|
||||||
|
@ -1717,41 +1777,10 @@ echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
|
||||||
echo "CC=$cc" >> $config_host_mak
|
echo "CC=$cc" >> $config_host_mak
|
||||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||||
|
|
||||||
# use included Linux headers
|
# use included Linux headers for KVM architectures
|
||||||
if test "$linux" = "yes" ; then
|
if test "$linux" = "yes" && test -n "$linux_arch"; 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
|
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
for target in $target_list; do
|
for target in $target_list; do
|
||||||
target_dir="$target"
|
target_dir="$target"
|
||||||
|
|
Loading…
Reference in New Issue