summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.d/containers.yml38
-rw-r--r--.gitlab-ci.d/crossbuilds.yml5
-rw-r--r--.gitlab-ci.yml29
-rw-r--r--.shippable.yml4
-rw-r--r--.travis.yml66
-rwxr-xr-xconfigure4
-rw-r--r--docs/conf.py4
-rw-r--r--migration/global_state.c4
-rw-r--r--tests/docker/Makefile.include2
-rw-r--r--tests/docker/dockerfiles/debian-tricore-cross.docker2
-rw-r--r--tests/docker/dockerfiles/debian-win32-cross.docker38
-rw-r--r--tests/docker/dockerfiles/debian-win64-cross.docker45
-rw-r--r--tests/docker/dockerfiles/debian9-mxe.docker21
-rw-r--r--tests/docker/dockerfiles/debian9.docker32
-rw-r--r--tests/docker/dockerfiles/fedora-win32-cross.docker42
-rw-r--r--tests/docker/dockerfiles/fedora-win64-cross.docker38
-rw-r--r--tests/qemu-iotests/iotests.py2
17 files changed, 142 insertions, 234 deletions
diff --git a/.gitlab-ci.d/containers.yml b/.gitlab-ci.d/containers.yml
index 8c89efeb6d..11d079ea58 100644
--- a/.gitlab-ci.d/containers.yml
+++ b/.gitlab-ci.d/containers.yml
@@ -48,18 +48,6 @@ amd64-debian11-container:
variables:
NAME: debian11
-amd64-debian9-container:
- <<: *container_job_definition
- variables:
- NAME: debian9
-
-amd64-debian9-mxe-container:
- <<: *container_job_definition
- stage: containers-layer2
- needs: ['amd64-debian9-container']
- variables:
- NAME: debian9-mxe
-
alpha-debian-cross-container:
<<: *container_job_definition
stage: containers-layer2
@@ -210,24 +198,10 @@ sparc64-debian-cross-container:
tricore-debian-cross-container:
<<: *container_job_definition
stage: containers-layer2
- needs: ['amd64-debian9-container']
+ needs: ['amd64-debian10-container']
variables:
NAME: debian-tricore-cross
-win32-debian-cross-container:
- <<: *container_job_definition
- stage: containers-layer3
- needs: ['amd64-debian9-mxe-container']
- variables:
- NAME: debian-win32-cross
-
-win64-debian-cross-container:
- <<: *container_job_definition
- stage: containers-layer3
- needs: ['amd64-debian9-mxe-container']
- variables:
- NAME: debian-win64-cross
-
xtensa-debian-cross-container:
<<: *container_job_definition
variables:
@@ -248,6 +222,16 @@ i386-fedora-cross-container:
variables:
NAME: fedora-i386-cross
+win32-fedora-cross-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-win32-cross
+
+win64-fedora-cross-container:
+ <<: *container_job_definition
+ variables:
+ NAME: fedora-win64-cross
+
amd64-ubuntu1804-container:
<<: *container_job_definition
variables:
diff --git a/.gitlab-ci.d/crossbuilds.yml b/.gitlab-ci.d/crossbuilds.yml
index 4ec7226b5c..03ebfabb3f 100644
--- a/.gitlab-ci.d/crossbuilds.yml
+++ b/.gitlab-ci.d/crossbuilds.yml
@@ -2,6 +2,7 @@
.cross_system_build_job_template: &cross_system_build_job_definition
stage: build
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:latest
+ timeout: 80m
script:
- mkdir build
- cd build
@@ -105,9 +106,9 @@ cross-s390x-user:
cross-win32-system:
<<: *cross_system_build_job_definition
variables:
- IMAGE: debian-win32-cross
+ IMAGE: fedora-win32-cross
cross-win64-system:
<<: *cross_system_build_job_definition
variables:
- IMAGE: debian-win64-cross
+ IMAGE: fedora-win64-cross
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a18e18b57e..a51c89554f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,6 @@
stages:
- containers
- containers-layer2
- - containers-layer3
- build
- test
@@ -245,6 +244,17 @@ build-user:
CONFIGURE_ARGS: --disable-tools --disable-system
MAKE_CHECK_ARGS: check-tcg
+# Run check-tcg against linux-user (with plugins)
+# we skip sparc64-linux-user until it has been fixed somewhat
+# we skip cris-linux-user as it doesn't use the common run loop
+build-user-plugins:
+ <<: *native_build_job_definition
+ variables:
+ IMAGE: debian-all-test-cross
+ CONFIGURE_ARGS: --disable-tools --disable-system --enable-plugins --enable-debug-tcg --target-list-exclude=sparc64-linux-user,cris-linux-user
+ MAKE_CHECK_ARGS: check-tcg
+ timeout: 1h 30m
+
build-clang:
<<: *native_build_job_definition
variables:
@@ -260,9 +270,24 @@ build-deprecated:
variables:
IMAGE: debian-all-test-cross
CONFIGURE_ARGS: --disable-docs --disable-tools
- MAKE_CHECK_ARGS: check-tcg
+ MAKE_CHECK_ARGS: build-tcg
TARGETS: ppc64abi32-linux-user tilegx-linux-user lm32-softmmu
unicore32-softmmu
+ artifacts:
+ expire_in: 2 days
+ paths:
+ - build
+
+# We split the check-tcg step as test failures are expected but we still
+# want to catch the build breaking.
+check-deprecated:
+ <<: *native_test_job_definition
+ needs:
+ - job: build-deprecated
+ artifacts: true
+ variables:
+ IMAGE: debian-all-test-cross
+ MAKE_CHECK_ARGS: check-tcg
allow_failure: true
build-oss-fuzz:
diff --git a/.shippable.yml b/.shippable.yml
index 0b4fd6df1d..14350e6de8 100644
--- a/.shippable.yml
+++ b/.shippable.yml
@@ -7,10 +7,6 @@ env:
matrix:
- IMAGE=debian-amd64
TARGET_LIST=x86_64-softmmu,x86_64-linux-user
- - IMAGE=debian-win32-cross
- TARGET_LIST=arm-softmmu,i386-softmmu
- - IMAGE=debian-win64-cross
- TARGET_LIST=aarch64-softmmu,sparc64-softmmu,x86_64-softmmu
- IMAGE=debian-armel-cross
TARGET_LIST=arm-softmmu,arm-linux-user,armeb-linux-user
- IMAGE=debian-armhf-cross
diff --git a/.travis.yml b/.travis.yml
index bd9a6fc06c..519e62432d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,7 @@
# Additional builds with specific requirements for a full VM need to
# be added as additional matrix: entries later on
os: linux
-dist: xenial
+dist: focal
language: c
compiler:
- gcc
@@ -10,7 +10,7 @@ cache:
# There is one cache per branch and compiler version.
# characteristics of each job are used to identify the cache:
# - OS name (currently only linux)
- # - OS distribution (for Linux, xenial, trusty, or precise)
+ # - OS distribution (for Linux, bionic or focal)
# - Names and values of visible environment variables set in .travis.yml or Settings panel
timeout: 1200
ccache: true
@@ -27,7 +27,7 @@ addons:
- libattr1-dev
- libbrlapi-dev
- libcap-ng-dev
- - libgcc-4.8-dev
+ - libgcc-7-dev
- libgnutls28-dev
- libgtk-3-dev
- libiscsi-dev
@@ -123,20 +123,6 @@ jobs:
- CONFIG="--disable-system --static"
- CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-default"
-
- # we split the system builds as it takes a while to build them all
- - name: "GCC (main-softmmu)"
- env:
- - CONFIG="--disable-user --target-list=${MAIN_SOFTMMU_TARGETS}"
- - CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-default"
-
-
- - name: "GCC (other-softmmu)"
- env:
- - CONFIG="--disable-user --target-list-exclude=${MAIN_SOFTMMU_TARGETS}"
- - CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-default"
-
-
# Just build tools and run minimal unit and softfloat checks
- name: "GCC check-unit and check-softfloat"
env:
@@ -224,8 +210,10 @@ jobs:
# gprof/gcov are GCC features
- name: "GCC gprof/gcov"
+ dist: bionic
env:
- - CONFIG="--enable-gprof --enable-gcov --disable-pie --target-list=${MAIN_SOFTMMU_TARGETS}"
+ - CONFIG="--enable-gprof --enable-gcov --disable-libssh
+ --target-list=${MAIN_SOFTMMU_TARGETS}"
after_success:
- ${SRC_DIR}/scripts/travis/coverage-summary.sh
@@ -265,25 +253,9 @@ jobs:
- TEST_CMD=""
- # Python builds
- - name: "GCC Python 3.5 (x86_64-softmmu)"
- env:
- - CONFIG="--target-list=x86_64-softmmu"
- - CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-default"
- language: python
- python: 3.5
-
-
- - name: "GCC Python 3.6 (x86_64-softmmu)"
- env:
- - CONFIG="--target-list=x86_64-softmmu"
- - CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-default"
- language: python
- python: 3.6
-
-
# Using newer GCC with sanitizers
- name: "GCC9 with sanitizers (softmmu)"
+ dist: bionic
addons:
apt:
update: true
@@ -299,7 +271,7 @@ jobs:
- libattr1-dev
- libbrlapi-dev
- libcap-ng-dev
- - libgnutls-dev
+ - libgnutls28-dev
- libgtk-3-dev
- libiscsi-dev
- liblttng-ust-dev
@@ -307,14 +279,13 @@ jobs:
- libncurses5-dev
- libnss3-dev
- libpixman-1-dev
- - libpng12-dev
+ - libpng-dev
- librados-dev
- libsdl2-dev
- libsdl2-image-dev
- libseccomp-dev
- libspice-protocol-dev
- libspice-server-dev
- - libssh-dev
- liburcu-dev
- libusb-1.0-0-dev
- libvte-2.91-dev
@@ -324,11 +295,11 @@ jobs:
compiler: none
env:
- COMPILER_NAME=gcc CXX=g++-9 CC=gcc-9
- - CONFIG="--cc=gcc-9 --cxx=g++-9 --disable-pie --disable-linux-user"
+ - CONFIG="--cc=gcc-9 --cxx=g++-9 --disable-linux-user"
- TEST_CMD=""
before_script:
- mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR}
- - ${SRC_DIR}/configure ${CONFIG} --extra-cflags="-g3 -O0 -Wno-error=stringop-truncation -fsanitize=thread" --extra-ldflags="-fuse-ld=gold" || { cat config.log && exit 1; }
+ - ${SRC_DIR}/configure ${CONFIG} --extra-cflags="-g3 -O0 -fsanitize=thread" || { cat config.log && exit 1; }
# Run check-tcg against linux-user
@@ -340,17 +311,6 @@ jobs:
- CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-debug-tcg"
- # Run check-tcg against linux-user (with plugins)
- # we skip sparc64-linux-user until it has been fixed somewhat
- # we skip cris-linux-user as it doesn't use the common run loop
- - name: "GCC plugins check-tcg (user)"
- env:
- - CONFIG="--disable-system --enable-plugins --enable-debug-tcg --target-list-exclude=sparc64-linux-user,cris-linux-user"
- - TEST_BUILD_CMD="make build-tcg"
- - TEST_CMD="make check-tcg"
- - CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-debug-tcg"
-
-
# Run check-tcg against softmmu targets
- name: "GCC check-tcg (some-softmmu)"
env:
@@ -370,7 +330,7 @@ jobs:
- name: "[aarch64] GCC check-tcg"
arch: arm64
- dist: xenial
+ dist: focal
addons:
apt_packages:
- libaio-dev
@@ -403,7 +363,7 @@ jobs:
- name: "[ppc64] GCC check-tcg"
arch: ppc64le
- dist: xenial
+ dist: focal
addons:
apt_packages:
- libaio-dev
diff --git a/configure b/configure
index ca9b458ea0..a5841241be 100755
--- a/configure
+++ b/configure
@@ -1964,8 +1964,8 @@ fi
# Note that if the Python conditional here evaluates True we will exit
# with status 1 which is a shell 'false' value.
-if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
- error_exit "Cannot use '$python', Python >= 3.5 is required." \
+if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
+ error_exit "Cannot use '$python', Python >= 3.6 is required." \
"Use --python=/path/to/python to specify a supported Python."
fi
diff --git a/docs/conf.py b/docs/conf.py
index 606f623211..00e1b750e2 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -36,9 +36,9 @@ from sphinx.errors import ConfigError
# In newer versions of Sphinx this will display nicely; in older versions
# Sphinx will also produce a Python backtrace but at least the information
# gets printed...
-if sys.version_info < (3,5):
+if sys.version_info < (3,6):
raise ConfigError(
- "QEMU requires a Sphinx that uses Python 3.5 or better\n")
+ "QEMU requires a Sphinx that uses Python 3.6 or better\n")
# The per-manual conf.py will set qemu_docdir for a single-manual build;
# otherwise set it here if this is an entire-manual-set build.
diff --git a/migration/global_state.c b/migration/global_state.c
index 25311479a4..a33947ca32 100644
--- a/migration/global_state.c
+++ b/migration/global_state.c
@@ -44,8 +44,8 @@ void global_state_store_running(void)
{
const char *state = RunState_str(RUN_STATE_RUNNING);
assert(strlen(state) < sizeof(global_state.runstate));
- strncpy((char *)global_state.runstate,
- state, sizeof(global_state.runstate));
+ strpadcpy((char *)global_state.runstate, sizeof(global_state.runstate),
+ state, '\0');
}
bool global_state_received(void)
diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
index 75704268ff..02ec92830b 100644
--- a/tests/docker/Makefile.include
+++ b/tests/docker/Makefile.include
@@ -137,7 +137,7 @@ docker-image-debian-sparc64-cross: docker-image-debian10
docker-image-travis: NOUSER=1
# Specialist build images, sometimes very limited tools
-docker-image-debian-tricore-cross: docker-image-debian9
+docker-image-debian-tricore-cross: docker-image-debian10
docker-image-debian-all-test-cross: docker-image-debian10
docker-image-debian-arm64-test-cross: docker-image-debian11
diff --git a/tests/docker/dockerfiles/debian-tricore-cross.docker b/tests/docker/dockerfiles/debian-tricore-cross.docker
index 769d95c77b..985925134c 100644
--- a/tests/docker/dockerfiles/debian-tricore-cross.docker
+++ b/tests/docker/dockerfiles/debian-tricore-cross.docker
@@ -7,7 +7,7 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
-FROM qemu/debian9
+FROM qemu/debian10
MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
diff --git a/tests/docker/dockerfiles/debian-win32-cross.docker b/tests/docker/dockerfiles/debian-win32-cross.docker
deleted file mode 100644
index b045e821b9..0000000000
--- a/tests/docker/dockerfiles/debian-win32-cross.docker
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# Docker mingw32 cross-compiler target
-#
-# This docker target builds on the debian Stretch MXE base image.
-#
-FROM qemu/debian9-mxe
-
-MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
-
-ENV TARGET i686
-
-ENV PATH $PATH:/usr/lib/mxe/usr/bin:/usr/lib/mxe/usr/$TARGET-w64-mingw32.shared/bin
-
-ENV PKG_CONFIG_PATH \
- $PKG_CONFIG_PATH:/usr/lib/mxe/usr/$TARGET-w64-mingw32.shared/lib/pkgconfig
-
-RUN apt-get update && \
- DEBIAN_FRONTEND=noninteractive eatmydata \
- apt-get install -y --no-install-recommends \
- mxe-$TARGET-w64-mingw32.shared-bzip2 \
- mxe-$TARGET-w64-mingw32.shared-curl \
- mxe-$TARGET-w64-mingw32.shared-glib \
- mxe-$TARGET-w64-mingw32.shared-libgcrypt \
- mxe-$TARGET-w64-mingw32.shared-libusb1 \
- mxe-$TARGET-w64-mingw32.shared-lzo \
- mxe-$TARGET-w64-mingw32.shared-nettle \
- mxe-$TARGET-w64-mingw32.shared-ncurses \
- mxe-$TARGET-w64-mingw32.shared-nsis \
- mxe-$TARGET-w64-mingw32.shared-pixman \
- mxe-$TARGET-w64-mingw32.shared-pkgconf \
- mxe-$TARGET-w64-mingw32.shared-pthreads \
- mxe-$TARGET-w64-mingw32.shared-sdl2 \
- mxe-$TARGET-w64-mingw32.shared-sdl2-mixer \
- mxe-$TARGET-w64-mingw32.shared-sdl2-gfx \
- mxe-$TARGET-w64-mingw32.shared-zlib
-
-# Specify the cross prefix for this image (see tests/docker/common.rc)
-ENV QEMU_CONFIGURE_OPTS --cross-prefix=$TARGET-w64-mingw32.shared-
diff --git a/tests/docker/dockerfiles/debian-win64-cross.docker b/tests/docker/dockerfiles/debian-win64-cross.docker
deleted file mode 100644
index 4cc4a3f365..0000000000
--- a/tests/docker/dockerfiles/debian-win64-cross.docker
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Docker mingw64 cross-compiler target
-#
-# This docker target builds on the debian Stretch MXE base image.
-#
-FROM qemu/debian9-mxe
-
-MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
-
-ENV TARGET x86-64
-
-ENV PATH $PATH:/usr/lib/mxe/usr/$TARGET-w64-mingw32.shared/bin
-
-ENV PKG_CONFIG_PATH \
- $PKG_CONFIG_PATH:/usr/lib/mxe/usr/$TARGET-w64-mingw32.shared/lib/pkgconfig
-
-RUN apt-get update && \
- DEBIAN_FRONTEND=noninteractive eatmydata \
- apt-get install -y --no-install-recommends \
- mxe-$TARGET-w64-mingw32.shared-bzip2 \
- mxe-$TARGET-w64-mingw32.shared-curl \
- mxe-$TARGET-w64-mingw32.shared-glib \
- mxe-$TARGET-w64-mingw32.shared-libgcrypt \
- mxe-$TARGET-w64-mingw32.shared-libusb1 \
- mxe-$TARGET-w64-mingw32.shared-lzo \
- mxe-$TARGET-w64-mingw32.shared-nettle \
- mxe-$TARGET-w64-mingw32.shared-ncurses \
- mxe-$TARGET-w64-mingw32.shared-nsis \
- mxe-$TARGET-w64-mingw32.shared-pixman \
- mxe-$TARGET-w64-mingw32.shared-pkgconf \
- mxe-$TARGET-w64-mingw32.shared-pthreads \
- mxe-$TARGET-w64-mingw32.shared-sdl2 \
- mxe-$TARGET-w64-mingw32.shared-sdl2-mixer \
- mxe-$TARGET-w64-mingw32.shared-sdl2-gfx \
- mxe-$TARGET-w64-mingw32.shared-zlib \
- curl && \
- curl -s -S -o /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/include/WinHvEmulation.h \
- "https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-headers/include/winhvemulation.h?format=raw" && \
- curl -s -S -o /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/include/WinHvPlatform.h \
- "https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-headers/include/winhvplatform.h?format=raw" && \
- curl -s -S -o /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/include/winhvplatformdefs.h \
- "https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-headers/include/winhvplatformdefs.h?format=raw"
-
-# Specify the cross prefix for this image (see tests/docker/common.rc)
-ENV QEMU_CONFIGURE_OPTS --cross-prefix=x86_64-w64-mingw32.shared-
diff --git a/tests/docker/dockerfiles/debian9-mxe.docker b/tests/docker/dockerfiles/debian9-mxe.docker
deleted file mode 100644
index ae2c222a6f..0000000000
--- a/tests/docker/dockerfiles/debian9-mxe.docker
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Docker mingw cross-compiler target
-#
-# This docker target builds on the debian Stretch base image.
-#
-FROM qemu/debian9
-
-MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
-
-RUN DEBIAN_FRONTEND=noninteractive eatmydata \
- apt install -y --no-install-recommends gnupg dirmngr
-
-# Add the foreign architecture we want and install dependencies
-RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C6BF758A33A3A276 && \
- echo "deb http://pkg.mxe.cc/repos/apt stretch main" > /etc/apt/sources.list.d/mxeapt.list
-RUN apt-get update && \
- DEBIAN_FRONTEND=noninteractive eatmydata \
- apt-get install -y --no-install-recommends \
- $(apt-get -s install -y --no-install-recommends gw32.shared-mingw-w64 | egrep "^Inst mxe-x86-64-unknown-" | cut -d\ -f2)
-
-ENV PATH $PATH:/usr/lib/mxe/usr/bin/
diff --git a/tests/docker/dockerfiles/debian9.docker b/tests/docker/dockerfiles/debian9.docker
deleted file mode 100644
index 3edb5147ef..0000000000
--- a/tests/docker/dockerfiles/debian9.docker
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Docker multiarch cross-compiler target
-#
-# This docker target is builds on Debian cross compiler targets to build distro
-# with a selection of cross compilers for building test binaries.
-#
-# On its own you can't build much but the docker-foo-cross targets
-# build on top of the base debian image.
-#
-FROM debian:stretch-slim
-
-# Duplicate deb line as deb-src
-RUN cat /etc/apt/sources.list | sed "s/^deb\ /deb-src /" >> /etc/apt/sources.list
-
-# Install common build utilities
-RUN apt update && \
- DEBIAN_FRONTEND=noninteractive apt install -yy eatmydata && \
- DEBIAN_FRONTEND=noninteractive eatmydata \
- apt install -y --no-install-recommends \
- bc \
- build-essential \
- ca-certificates \
- clang \
- gdb-multiarch \
- gettext \
- git \
- libncurses5-dev \
- pkg-config \
- psmisc \
- python3 \
- python3-setuptools \
- $(apt-get -s build-dep qemu | egrep ^Inst | fgrep '[all]' | cut -d\ -f2)
diff --git a/tests/docker/dockerfiles/fedora-win32-cross.docker b/tests/docker/dockerfiles/fedora-win32-cross.docker
new file mode 100644
index 0000000000..5903e1b0b4
--- /dev/null
+++ b/tests/docker/dockerfiles/fedora-win32-cross.docker
@@ -0,0 +1,42 @@
+FROM fedora:32
+
+# Please keep this list sorted alphabetically
+ENV PACKAGES \
+ bc \
+ bzip2 \
+ diffutils \
+ findutils \
+ gcc \
+ gettext \
+ git \
+ hostname \
+ make \
+ meson \
+ mingw32-bzip2 \
+ mingw32-curl \
+ mingw32-glib2 \
+ mingw32-gmp \
+ mingw32-gnutls \
+ mingw32-gtk3 \
+ mingw32-libjpeg-turbo \
+ mingw32-libpng \
+ mingw32-libtasn1 \
+ mingw32-nettle \
+ mingw32-nsis \
+ mingw32-pixman \
+ mingw32-pkg-config \
+ mingw32-SDL2 \
+ perl \
+ perl-Test-Harness \
+ python3 \
+ python3-PyYAML \
+ python3-setuptools \
+ tar \
+ which
+
+RUN dnf install -y $PACKAGES
+RUN rpm -q $PACKAGES | sort > /packages.txt
+ENV FEATURES mingw
+
+# Specify the cross prefix for this image (see tests/docker/common.rc)
+ENV QEMU_CONFIGURE_OPTS --cross-prefix=i686-w64-mingw32-
diff --git a/tests/docker/dockerfiles/fedora-win64-cross.docker b/tests/docker/dockerfiles/fedora-win64-cross.docker
new file mode 100644
index 0000000000..7f03cd8ffc
--- /dev/null
+++ b/tests/docker/dockerfiles/fedora-win64-cross.docker
@@ -0,0 +1,38 @@
+FROM fedora:32
+
+# Please keep this list sorted alphabetically
+ENV PACKAGES \
+ bc \
+ bzip2 \
+ diffutils \
+ findutils \
+ gcc \
+ gettext \
+ git \
+ hostname \
+ make \
+ meson \
+ mingw64-bzip2 \
+ mingw64-curl \
+ mingw64-glib2 \
+ mingw64-gmp \
+ mingw64-gtk3 \
+ mingw64-libjpeg-turbo \
+ mingw64-libpng \
+ mingw64-libtasn1 \
+ mingw64-pixman \
+ mingw64-pkg-config \
+ perl \
+ perl-Test-Harness \
+ python3 \
+ python3-PyYAML \
+ python3-setuptools \
+ tar \
+ which
+
+RUN dnf install -y $PACKAGES
+RUN rpm -q $PACKAGES | sort > /packages.txt
+ENV FEATURES mingw
+
+# Specify the cross prefix for this image (see tests/docker/common.rc)
+ENV QEMU_CONFIGURE_OPTS --cross-prefix=x86_64-w64-mingw32- --disable-capstone
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 91e4a57126..f48460480a 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -40,8 +40,6 @@ sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
from qemu import qtest
from qemu.qmp import QMPMessage
-assert sys.version_info >= (3, 6)
-
# Use this logger for logging messages directly from the iotests module
logger = logging.getLogger('qemu.iotests')
logger.addHandler(logging.NullHandler())