diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2023-08-08 14:03:03 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2023-08-08 20:44:11 +0200 |
commit | 971fac2731e60f2143f35648b14fd2f1b5b2c1af (patch) | |
tree | d3614200ee3b6c7fd378fe582505ef97695bbc2e /configure | |
parent | 50a001222737ca04feb77f9117a623b91d61f2cd (diff) |
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, commit
89e5b7935e9 ("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: 89e5b7935e9 ("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>
Diffstat (limited to 'configure')
-rwxr-xr-x | configure | 165 |
1 files changed, 97 insertions, 68 deletions
@@ -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" ;; - x32) - cpu="x86_64" - CPU_CFLAGS="-mx32" ;; - x86_64|amd64) - cpu="x86_64" - # ??? 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" ;; + 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" ;; + cpu=mips + host_arch=mips + linux_arch=mips + ;; ppc) - CPU_CFLAGS="-m32" ;; + host_arch=ppc + linux_arch=powerpc + CPU_CFLAGS="-m32" + ;; ppc64) - CPU_CFLAGS="-m64 -mbig-endian" ;; + host_arch=ppc64 + linux_arch=powerpc + CPU_CFLAGS="-m64 -mbig-endian" + ;; ppc64le) - cpu="ppc64" - CPU_CFLAGS="-m64 -mlittle-endian" ;; + cpu=ppc64 + host_arch=ppc64 + linux_arch=powerpc + CPU_CFLAGS="-m64 -mlittle-endian" + ;; + + riscv32 | riscv64) + host_arch=riscv + linux_arch=riscv + ;; s390) - CPU_CFLAGS="-m31" ;; + linux_arch=s390 + CPU_CFLAGS="-m31" + ;; s390x) - CPU_CFLAGS="-m64" ;; + host_arch=s390x + linux_arch=s390 + CPU_CFLAGS="-m64" + ;; sparc|sun4[cdmuv]) - cpu="sparc" - CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;; + cpu=sparc + CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" + ;; sparc64) - CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;; + host_arch=sparc64 + CPU_CFLAGS="-m64 -mcpu=ultrasparc" + ;; + + x32) + cpu="x86_64" + 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" + ;; 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 |