b17ab4705c
For both ldnt1 and stnt1, the meaning of the Rn and Rm are different from ld1 and st1: the vector and integer registers are reversed, and the integer register 31 refers to XZR instead of SP. Secondly, the 64-bit version of ldnt1 was being interpreted as 32-bit unpacked unscaled offset instead of 64-bit unscaled offset, which discarded the upper 32 bits of the address coming from the vector argument. Thirdly, validate that the memory element size is in range for the vector element size for ldnt1. For ld1, we do this via independent decode patterns, but for ldnt1 we need to do it manually. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/826 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20220308031655.240710-1-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
355 lines
12 KiB
Bash
Executable File
355 lines
12 KiB
Bash
Executable File
#! /bin/sh
|
|
|
|
if test -z "$source_path"; then
|
|
echo Do not invoke this script directly. It is called
|
|
echo automatically by configure.
|
|
exit 1
|
|
fi
|
|
|
|
write_c_skeleton() {
|
|
cat > $TMPC <<EOF
|
|
int main(void) { return 0; }
|
|
EOF
|
|
}
|
|
|
|
has() {
|
|
command -v "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
do_compiler() {
|
|
# Run the compiler, capturing its output to the log. First argument
|
|
# is compiler binary to execute.
|
|
local compiler="$1"
|
|
shift
|
|
if test -n "$BASH_VERSION"; then eval '
|
|
echo >>config.log "
|
|
funcs: ${FUNCNAME[*]}
|
|
lines: ${BASH_LINENO[*]}"
|
|
'; fi
|
|
echo $compiler "$@" >> config.log
|
|
$compiler "$@" >> config.log 2>&1 || return $?
|
|
}
|
|
|
|
|
|
TMPDIR1="config-temp"
|
|
TMPC="${TMPDIR1}/qemu-conf.c"
|
|
TMPE="${TMPDIR1}/qemu-conf.exe"
|
|
|
|
container="no"
|
|
if test $use_containers = "yes"; then
|
|
if has "docker" || has "podman"; then
|
|
container=$($python $source_path/tests/docker/docker.py probe)
|
|
fi
|
|
fi
|
|
|
|
# cross compilers defaults, can be overridden with --cross-cc-ARCH
|
|
: ${cross_cc_aarch64="aarch64-linux-gnu-gcc"}
|
|
: ${cross_cc_aarch64_be="$cross_cc_aarch64"}
|
|
: ${cross_cc_cflags_aarch64_be="-mbig-endian"}
|
|
: ${cross_cc_alpha="alpha-linux-gnu-gcc"}
|
|
: ${cross_cc_arm="arm-linux-gnueabihf-gcc"}
|
|
: ${cross_cc_cflags_armeb="-mbig-endian"}
|
|
: ${cross_cc_hexagon="hexagon-unknown-linux-musl-clang"}
|
|
: ${cross_cc_cflags_hexagon="-mv67 -O2 -static"}
|
|
: ${cross_cc_hppa="hppa-linux-gnu-gcc"}
|
|
: ${cross_cc_i386="i686-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_i386="-m32"}
|
|
: ${cross_cc_m68k="m68k-linux-gnu-gcc"}
|
|
: ${cross_cc_microblaze="microblaze-linux-musl-gcc"}
|
|
: ${cross_cc_mips64el="mips64el-linux-gnuabi64-gcc"}
|
|
: ${cross_cc_mips64="mips64-linux-gnuabi64-gcc"}
|
|
: ${cross_cc_mipsel="mipsel-linux-gnu-gcc"}
|
|
: ${cross_cc_mips="mips-linux-gnu-gcc"}
|
|
: ${cross_cc_nios2="nios2-linux-gnu-gcc"}
|
|
: ${cross_cc_ppc="powerpc-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_ppc="-m32"}
|
|
: ${cross_cc_ppc64="powerpc64-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_ppc64="-m64 -mbig-endian"}
|
|
: ${cross_cc_ppc64le="$cross_cc_ppc64"}
|
|
: ${cross_cc_cflags_ppc64le="-m64 -mlittle-endian"}
|
|
: ${cross_cc_riscv64="riscv64-linux-gnu-gcc"}
|
|
: ${cross_cc_s390x="s390x-linux-gnu-gcc"}
|
|
: ${cross_cc_sh4="sh4-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_sparc="-m32 -mv8plus -mcpu=ultrasparc"}
|
|
: ${cross_cc_sparc64="sparc64-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_sparc64="-m64 -mcpu=ultrasparc"}
|
|
: ${cross_cc_x86_64="x86_64-linux-gnu-gcc"}
|
|
: ${cross_cc_cflags_x86_64="-m64"}
|
|
|
|
# tricore is special as it doesn't have a compiler
|
|
: ${cross_as_tricore="tricore-as"}
|
|
: ${cross_ld_tricore="tricore-ld"}
|
|
|
|
for target in $target_list; do
|
|
arch=${target%%-*}
|
|
|
|
# reset all container fields
|
|
container_image=
|
|
container_hosts=
|
|
container_cross_cc=
|
|
container_cross_as=
|
|
container_cross_ld=
|
|
|
|
# suppress clang
|
|
supress_clang=
|
|
|
|
case $target in
|
|
aarch64-*)
|
|
# We don't have any bigendian build tools so we only use this for AArch64
|
|
container_hosts="x86_64 aarch64"
|
|
container_image=debian-arm64-cross
|
|
container_cross_cc=aarch64-linux-gnu-gcc-10
|
|
;;
|
|
alpha-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-alpha-cross
|
|
container_cross_cc=alpha-linux-gnu-gcc
|
|
;;
|
|
arm-*)
|
|
# We don't have any bigendian build tools so we only use this for ARM
|
|
container_hosts="x86_64 aarch64"
|
|
container_image=debian-armhf-cross
|
|
container_cross_cc=arm-linux-gnueabihf-gcc
|
|
;;
|
|
cris-*)
|
|
container_hosts=x86_64
|
|
container_image=fedora-cris-cross
|
|
container_cross_cc=cris-linux-gnu-gcc
|
|
;;
|
|
hexagon-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-hexagon-cross
|
|
container_cross_cc=hexagon-unknown-linux-musl-clang
|
|
;;
|
|
hppa-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-hppa-cross
|
|
container_cross_cc=hppa-linux-gnu-gcc
|
|
;;
|
|
i386-*)
|
|
container_hosts=x86_64
|
|
container_image=fedora-i386-cross
|
|
container_cross_cc=gcc
|
|
supress_clang=yes
|
|
;;
|
|
m68k-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-m68k-cross
|
|
container_cross_cc=m68k-linux-gnu-gcc
|
|
;;
|
|
microblaze-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-microblaze-cross
|
|
container_cross_cc=microblaze-linux-musl-gcc
|
|
;;
|
|
mips64el-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-mips64el-cross
|
|
container_cross_cc=mips64el-linux-gnuabi64-gcc
|
|
;;
|
|
mips64-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-mips64-cross
|
|
container_cross_cc=mips64-linux-gnuabi64-gcc
|
|
;;
|
|
mipsel-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-mipsel-cross
|
|
container_cross_cc=mipsel-linux-gnu-gcc
|
|
;;
|
|
mips-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-mips-cross
|
|
container_cross_cc=mips-linux-gnu-gcc
|
|
;;
|
|
nios2-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-nios2-cross
|
|
container_cross_cc=nios2-linux-gnu-gcc
|
|
;;
|
|
ppc-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-powerpc-test-cross
|
|
container_cross_cc=powerpc-linux-gnu-gcc-10
|
|
;;
|
|
ppc64-*|ppc64le-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-powerpc-test-cross
|
|
container_cross_cc=${target%%-*}-linux-gnu-gcc-10
|
|
container_cross_cc=powerpc${container_cross_cc#ppc}
|
|
;;
|
|
riscv64-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-riscv64-test-cross
|
|
container_cross_cc=riscv64-linux-gnu-gcc
|
|
;;
|
|
s390x-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-s390x-cross
|
|
container_cross_cc=s390x-linux-gnu-gcc
|
|
;;
|
|
sh4-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-sh4-cross
|
|
container_cross_cc=sh4-linux-gnu-gcc
|
|
;;
|
|
sparc64-*)
|
|
container_hosts=x86_64
|
|
container_image=debian-sparc64-cross
|
|
container_cross_cc=sparc64-linux-gnu-gcc
|
|
;;
|
|
tricore-softmmu)
|
|
container_hosts=x86_64
|
|
container_image=debian-tricore-cross
|
|
container_cross_as=tricore-as
|
|
container_cross_ld=tricore-ld
|
|
;;
|
|
x86_64-*)
|
|
container_hosts="aarch64 ppc64el x86_64"
|
|
container_image=debian-amd64-cross
|
|
container_cross_cc=x86_64-linux-gnu-gcc
|
|
supress_clang=yes
|
|
;;
|
|
xtensa*-softmmu)
|
|
container_hosts=x86_64
|
|
container_image=debian-xtensa-cross
|
|
|
|
# default to the dc232b cpu
|
|
container_cross_cc=/opt/2020.07/xtensa-dc232b-elf/bin/xtensa-dc232b-elf-gcc
|
|
;;
|
|
esac
|
|
|
|
config_target_mak=tests/tcg/config-$target.mak
|
|
|
|
echo "# Automatically generated by configure - do not modify" > $config_target_mak
|
|
echo "TARGET_NAME=$arch" >> $config_target_mak
|
|
echo "target=$target" >> $config_target_mak
|
|
case $target in
|
|
*-linux-user)
|
|
echo "CONFIG_USER_ONLY=y" >> $config_target_mak
|
|
echo "CONFIG_LINUX_USER=y" >> $config_target_mak
|
|
echo "QEMU=$PWD/qemu-$arch" >> $config_target_mak
|
|
;;
|
|
*-bsd-user)
|
|
echo "CONFIG_USER_ONLY=y" >> $config_target_mak
|
|
echo "CONFIG_BSD_USER=y" >> $config_target_mak
|
|
echo "QEMU=$PWD/qemu-$arch" >> $config_target_mak
|
|
;;
|
|
*-softmmu)
|
|
echo "CONFIG_SOFTMMU=y" >> $config_target_mak
|
|
echo "QEMU=$PWD/qemu-system-$arch" >> $config_target_mak
|
|
;;
|
|
esac
|
|
|
|
eval "target_compiler_cflags=\${cross_cc_cflags_$arch}"
|
|
echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
|
|
|
|
got_cross_cc=no
|
|
|
|
if eval test "x\"\${cross_cc_$arch}\"" != xyes; then
|
|
eval "target_compiler=\"\${cross_cc_$arch}\""
|
|
|
|
if has $target_compiler; then
|
|
if test "$supress_clang" = yes &&
|
|
$target_compiler --version | grep -qi "clang"; then
|
|
got_cross_cc=no
|
|
else
|
|
write_c_skeleton
|
|
if ! do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-o $TMPE $TMPC -static ; then
|
|
# For host systems we might get away with building without -static
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-o $TMPE $TMPC ; then
|
|
got_cross_cc=yes
|
|
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
|
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
|
|
fi
|
|
else
|
|
got_cross_cc=yes
|
|
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
|
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Special handling for assembler only tests
|
|
eval "target_as=\"\${cross_as_$arch}\""
|
|
eval "target_ld=\"\${cross_ld_$arch}\""
|
|
if has $target_as && has $target_ld; then
|
|
case $target in
|
|
tricore-softmmu)
|
|
echo "CROSS_CC_GUEST=$target_as" >> $config_target_mak
|
|
echo "CROSS_AS_GUEST=$target_as" >> $config_target_mak
|
|
echo "CROSS_LD_GUEST=$target_ld" >> $config_target_mak
|
|
got_cross_cc=yes
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|
|
|
|
if test $got_cross_cc = yes; then
|
|
# Test for compiler features for optional tests. We only do this
|
|
# for cross compilers because ensuring the docker containers based
|
|
# compilers is a requirememt for adding a new test that needs a
|
|
# compiler feature.
|
|
|
|
case $target in
|
|
aarch64-*)
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-march=armv8.1-a+sve -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_SVE=y" >> $config_target_mak
|
|
fi
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-march=armv8.1-a+sve2 -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_SVE2=y" >> $config_target_mak
|
|
fi
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-march=armv8.3-a -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
|
|
fi
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-mbranch-protection=standard -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_ARMV8_BTI=y" >> $config_target_mak
|
|
fi
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-march=armv8.5-a+memtag -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_ARMV8_MTE=y" >> $config_target_mak
|
|
fi
|
|
;;
|
|
ppc*)
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-mpower8-vector -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_POWER8_VECTOR=y" >> $config_target_mak
|
|
fi
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-mpower10 -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_POWER10=y" >> $config_target_mak
|
|
fi
|
|
;;
|
|
i386-linux-user)
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
|
-Werror -fno-pie -o $TMPE $TMPC; then
|
|
echo "CROSS_CC_HAS_I386_NOPIE=y" >> $config_target_mak
|
|
fi
|
|
;;
|
|
esac
|
|
elif test $got_cross_cc = no && test "$container" != no && \
|
|
test -n "$container_image"; then
|
|
for host in $container_hosts; do
|
|
if test "$host" = "$cpu"; then
|
|
echo "DOCKER_IMAGE=$container_image" >> $config_target_mak
|
|
echo "DOCKER_CROSS_CC_GUEST=$container_cross_cc" >> \
|
|
$config_target_mak
|
|
if test -n "$container_cross_as"; then
|
|
echo "DOCKER_CROSS_AS_GUEST=$container_cross_as" >> \
|
|
$config_target_mak
|
|
fi
|
|
if test -n "$container_cross_ld"; then
|
|
echo "DOCKER_CROSS_LD_GUEST=$container_cross_ld" >> \
|
|
$config_target_mak
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
done
|