2019-08-07 17:35:23 +03:00
|
|
|
#! /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"
|
2019-11-28 18:35:24 +03:00
|
|
|
if test $use_containers = "yes"; then
|
|
|
|
if has "docker" || has "podman"; then
|
|
|
|
container=$($python $source_path/tests/docker/docker.py probe)
|
|
|
|
fi
|
2019-08-07 17:35:23 +03:00
|
|
|
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"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: $(cross_cc_alpha="alpha-linux-gnu-gcc")
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_arm="arm-linux-gnueabihf-gcc"}
|
|
|
|
: ${cross_cc_cflags_armeb="-mbig-endian"}
|
2021-02-08 08:46:21 +03:00
|
|
|
: ${cross_cc_hexagon="hexagon-unknown-linux-musl-clang"}
|
|
|
|
: ${cross_cc_cflags_hexagon="-mv67 -O2 -static"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: ${cross_cc_hppa="hppa-linux-gnu-gcc"}
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_i386="i386-pc-linux-gnu-gcc"}
|
|
|
|
: ${cross_cc_cflags_i386="-m32"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: ${cross_cc_m68k="m68k-linux-gnu-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")
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_ppc="powerpc-linux-gnu-gcc"}
|
|
|
|
: ${cross_cc_cflags_ppc="-m32"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: ${cross_cc_ppc64="powerpc64-linux-gnu-gcc"}
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_ppc64le="powerpc64le-linux-gnu-gcc"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: $(cross_cc_riscv64="riscv64-linux-gnu-gcc")
|
|
|
|
: ${cross_cc_s390x="s390x-linux-gnu-gcc"}
|
|
|
|
: $(cross_cc_sh4="sh4-linux-gnu-gcc")
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_cflags_sparc="-m32 -mv8plus -mcpu=ultrasparc"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: ${cross_cc_sparc64="sparc64-linux-gnu-gcc"}
|
2019-08-07 17:35:23 +03:00
|
|
|
: ${cross_cc_cflags_sparc64="-m64 -mcpu=ultrasparc"}
|
2020-07-01 16:56:43 +03:00
|
|
|
: ${cross_cc_x86_64="x86_64-pc-linux-gnu-gcc"}
|
|
|
|
: ${cross_cc_cflags_x86_64="-m64"}
|
2019-08-07 17:35:23 +03:00
|
|
|
|
|
|
|
for target in $target_list; do
|
|
|
|
arch=${target%%-*}
|
|
|
|
case $arch in
|
|
|
|
arm|armeb)
|
|
|
|
arches=arm
|
|
|
|
;;
|
|
|
|
aarch64|aarch64_be)
|
|
|
|
arches="aarch64 arm"
|
|
|
|
;;
|
|
|
|
mips*)
|
|
|
|
arches=mips
|
|
|
|
;;
|
|
|
|
ppc*)
|
|
|
|
arches=ppc
|
|
|
|
;;
|
|
|
|
sh4|sh4eb)
|
|
|
|
arches=sh4
|
|
|
|
;;
|
|
|
|
x86_64)
|
|
|
|
arches="x86_64 i386"
|
|
|
|
;;
|
|
|
|
xtensa|xtensaeb)
|
|
|
|
arches=xtensa
|
|
|
|
;;
|
2021-02-08 08:46:21 +03:00
|
|
|
alpha|cris|hexagon|hppa|i386|lm32|microblaze|microblazeel|m68k|openrisc|riscv64|s390x|sh4|sparc64)
|
2019-08-07 17:35:23 +03:00
|
|
|
arches=$target
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
container_image=
|
|
|
|
case $target in
|
|
|
|
aarch64-*)
|
|
|
|
# We don't have any bigendian build tools so we only use this for AArch64
|
2020-05-20 17:05:36 +03:00
|
|
|
container_image=debian-arm64-test-cross
|
|
|
|
container_cross_cc=aarch64-linux-gnu-gcc-10
|
2019-08-07 17:35:23 +03:00
|
|
|
;;
|
|
|
|
alpha-*)
|
|
|
|
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_image=debian-armhf-cross
|
|
|
|
container_cross_cc=arm-linux-gnueabihf-gcc
|
|
|
|
;;
|
|
|
|
cris-*)
|
|
|
|
container_image=fedora-cris-cross
|
|
|
|
container_cross_cc=cris-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
hppa-*)
|
|
|
|
container_image=debian-hppa-cross
|
|
|
|
container_cross_cc=hppa-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
i386-*)
|
|
|
|
container_image=fedora-i386-cross
|
|
|
|
container_cross_cc=gcc
|
|
|
|
;;
|
|
|
|
m68k-*)
|
|
|
|
container_image=debian-m68k-cross
|
|
|
|
container_cross_cc=m68k-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
mips64el-*)
|
|
|
|
container_image=debian-mips64el-cross
|
|
|
|
container_cross_cc=mips64el-linux-gnuabi64-gcc
|
|
|
|
;;
|
|
|
|
mips64-*)
|
|
|
|
container_image=debian-mips64-cross
|
|
|
|
container_cross_cc=mips64-linux-gnuabi64-gcc
|
|
|
|
;;
|
|
|
|
mipsel-*)
|
|
|
|
container_image=debian-mipsel-cross
|
|
|
|
container_cross_cc=mipsel-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
mips-*)
|
|
|
|
container_image=debian-mips-cross
|
|
|
|
container_cross_cc=mips-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
ppc-*|ppc64abi32-*)
|
|
|
|
container_image=debian-powerpc-cross
|
|
|
|
container_cross_cc=powerpc-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
ppc64-*)
|
|
|
|
container_image=debian-ppc64-cross
|
|
|
|
container_cross_cc=powerpc64-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
ppc64le-*)
|
|
|
|
container_image=debian-ppc64el-cross
|
|
|
|
container_cross_cc=powerpc64le-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
riscv64-*)
|
|
|
|
container_image=debian-riscv64-cross
|
|
|
|
container_cross_cc=riscv64-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
s390x-*)
|
|
|
|
container_image=debian-s390x-cross
|
|
|
|
container_cross_cc=s390x-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
sh4-*)
|
|
|
|
container_image=debian-sh4-cross
|
|
|
|
container_cross_cc=sh4-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
sparc64-*)
|
|
|
|
container_image=debian-sparc64-cross
|
|
|
|
container_cross_cc=sparc64-linux-gnu-gcc
|
|
|
|
;;
|
|
|
|
xtensa*-softmmu)
|
|
|
|
container_image=debian-xtensa-cross
|
|
|
|
|
|
|
|
# default to the dc232b cpu
|
2020-07-09 17:13:26 +03:00
|
|
|
container_cross_cc=/opt/2020.07/xtensa-dc232b-elf/bin/xtensa-dc232b-elf-gcc
|
2019-08-07 17:35:23 +03:00
|
|
|
;;
|
|
|
|
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
|
|
|
|
case $target in
|
|
|
|
*-linux-user | *-bsd-user)
|
|
|
|
echo "CONFIG_USER_ONLY=y" >> $config_target_mak
|
2020-09-21 17:34:47 +03:00
|
|
|
echo "QEMU=$PWD/qemu-$arch" >> $config_target_mak
|
2019-08-07 17:35:23 +03:00
|
|
|
;;
|
|
|
|
*-softmmu)
|
|
|
|
echo "CONFIG_SOFTMMU=y" >> $config_target_mak
|
2020-09-21 17:34:47 +03:00
|
|
|
echo "QEMU=$PWD/qemu-system-$arch" >> $config_target_mak
|
2019-08-07 17:35:23 +03:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
eval "target_compiler_cflags=\${cross_cc_cflags_$arch}"
|
|
|
|
echo "CROSS_CC_GUEST_CFLAGS=$target_compiler_cflags" >> $config_target_mak
|
|
|
|
|
|
|
|
got_cross_cc=no
|
|
|
|
for i in $arch $arches; do
|
|
|
|
if eval test "x\${cross_cc_$i+yes}" != xyes; then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
|
|
|
eval "target_compiler=\${cross_cc_$i}"
|
|
|
|
if ! has $target_compiler; then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
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
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
|
|
|
else
|
|
|
|
echo "CROSS_CC_GUEST_STATIC=y" >> $config_target_mak
|
|
|
|
fi
|
|
|
|
echo "CROSS_CC_GUEST=$target_compiler" >> $config_target_mak
|
2020-02-03 12:09:27 +03:00
|
|
|
|
|
|
|
# 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
|
2020-02-03 12:09:28 +03:00
|
|
|
if do_compiler "$target_compiler" $target_compiler_cflags \
|
2020-02-25 15:47:09 +03:00
|
|
|
-march=armv8.3-a -o $TMPE $TMPC; then
|
2020-02-03 12:09:28 +03:00
|
|
|
echo "CROSS_CC_HAS_ARMV8_3=y" >> $config_target_mak
|
|
|
|
fi
|
2020-10-21 20:37:49 +03:00
|
|
|
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
|
2021-02-12 21:49:02 +03:00
|
|
|
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
|
2020-02-03 12:09:27 +03:00
|
|
|
;;
|
target/ppc: Fix bcdsub. emulation when result overflows
The commit d03b174a83 (target/ppc: simplify bcdadd/sub functions)
meant to simplify some of the code but it inadvertently altered the
way the CR6 field is set after the operation has overflowed.
The CR6 bits are set based on the *unbounded* result of the operation,
so we need to look at the result before returning from bcd_add_mag,
otherwise we will look at 0 when it overflows.
Consider the following subtraction:
v0 = 0x9999999999999999999999999999999c (maximum positive BCD value)
v1 = 0x0000000000000000000000000000001d (negative one BCD value)
bcdsub. v0,v0,v1,0
The Power ISA 2.07B says:
If the unbounded result is greater than zero, do the following.
If PS=0, the sign code of the result is set to 0b1100.
If PS=1, the sign code of the result is set to 0b1111.
If the operation overflows, CR field 6 is set to 0b0101. Otherwise,
CR field 6 is set to 0b0100.
POWER9 hardware:
vr0 = 0x0000000000000000000000000000000c (positive zero BCD value)
cr6 = 0b0101 (0x5) (positive, overflow)
QEMU:
vr0 = 0x0000000000000000000000000000000c (positive zero BCD value)
cr6 = 0b0011 (0x3) (zero, overflow) <--- wrong
This patch reverts the part of d03b174a83 that introduced the
problem and adds a test-case to avoid further regressions:
before:
$ make run-tcg-tests-ppc64le-linux-user
(...)
TEST bcdsub on ppc64le
bcdsub: qemu/tests/tcg/ppc64le/bcdsub.c:58: test_bcdsub_gt:
Assertion `(cr >> 4) == ((1 << 2) | (1 << 0))' failed.
Fixes: d03b174a83 (target/ppc: simplify bcdadd/sub functions)
Reported-by: Paul Clarke <pc@us.ibm.com>
Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
Message-Id: <20210222194035.2723056-1-farosas@linux.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2021-02-22 22:40:35 +03:00
|
|
|
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
|
|
|
|
;;
|
2020-02-03 12:09:27 +03:00
|
|
|
esac
|
|
|
|
|
2019-08-07 17:35:23 +03:00
|
|
|
enabled_cross_compilers="$enabled_cross_compilers $target_compiler"
|
|
|
|
got_cross_cc=yes
|
|
|
|
break
|
|
|
|
done
|
|
|
|
|
|
|
|
if test $got_cross_cc = no && test "$container" != no && test -n "$container_image"; then
|
|
|
|
echo "DOCKER_IMAGE=$container_image" >> $config_target_mak
|
|
|
|
echo "DOCKER_CROSS_CC_GUEST=$container_cross_cc" >> $config_target_mak
|
|
|
|
fi
|
|
|
|
done
|