diff mbox series

[3/3] configure: unify case statements for CPU canonicalization

Message ID 20230807094807.471646-4-pbonzini@redhat.com
State New
Headers show
Series linux-user, configure: fix CPU canonicalization | expand

Commit Message

Paolo Bonzini Aug. 7, 2023, 9:48 a.m. UTC
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)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 159 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 87 insertions(+), 72 deletions(-)

Comments

Paolo Bonzini Aug. 7, 2023, 1:35 p.m. UTC | #1
On 8/7/23 11:48, Paolo Bonzini wrote:
>     armv*b|armv*l|arm)
>       cpu="arm" ;;

Oops, sent a stale patchset. The only difference is this extra ;;

Paolo
Peter Maydell Aug. 7, 2023, 1:45 p.m. UTC | #2
On Mon, 7 Aug 2023 at 10:49, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> 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)
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 159 +++++++++++++++++++++++++++++-------------------------
>  1 file changed, 87 insertions(+), 72 deletions(-)
>
> diff --git a/configure b/configure
> index 484d38d81f4..fb213412d7c 100755
> --- a/configure
> +++ b/configure
> @@ -469,59 +469,104 @@ 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.
> +#
>  # Note that this case should only have supported host CPUs, not guests.
> +# Please keep it sorted.
> +host_arch=
> +linux_arch=
>  case "$cpu" in
> +  aarch64)
> +    host_arch=aarch64
> +    linux_arch=arm64 ;;
> +
>    armv*b|armv*l|arm)
>      cpu="arm" ;;
> +    host_arch=arm
> +    linux_arch=arm ;;
>
>    i386|i486|i586|i686)
>      cpu="i386"
> +    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
> +    ;;

Can we be consistent within this case statement about whether
the ';;' is on its own line or at the end of the last line of
the case ? We are not fully consistent within the entire
configure script, but mostly we put it on a line of its
own. (I prefer that personally.)

thanks
-- PMM
Paolo Bonzini Aug. 7, 2023, 2:39 p.m. UTC | #3
Il lun 7 ago 2023, 15:45 Peter Maydell <peter.maydell@linaro.org> ha
scritto:

> Can we be consistent within this case statement about whether
> the ';;' is on its own line or at the end of the last line of
> the case ? We are not fully consistent within the entire
> configure script, but mostly we put it on a line of its
> own. (I prefer that personally.)
>

Yes, especially given the nicer diffs.

Paolo


> thanks
> -- PMM
>
>
diff mbox series

Patch

diff --git a/configure b/configure
index 484d38d81f4..fb213412d7c 100755
--- a/configure
+++ b/configure
@@ -469,59 +469,104 @@  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.
+#
 # Note that this case should only have supported host CPUs, not guests.
+# Please keep it sorted.
+host_arch=
+linux_arch=
 case "$cpu" in
+  aarch64)
+    host_arch=aarch64
+    linux_arch=arm64 ;;
+
   armv*b|armv*l|arm)
     cpu="arm" ;;
+    host_arch=arm
+    linux_arch=arm ;;
 
   i386|i486|i586|i686)
     cpu="i386"
+    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"
+    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" ;;
 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 +857,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 +1762,10 @@  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
+# use included Linux headers for KVM architectures
+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
-    fi
+  symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
 fi
 
 for target in $target_list; do