diff --git a/ci/docker/s390x-unknown-linux-gnu/Dockerfile b/ci/docker/s390x-unknown-linux-gnu/Dockerfile
index 49a277d884f56b42a2b36a8f38a7d6fafb7ebb44..861f4f9b00ee00b6b0d07ebdd5b354653f5807bb 100644
--- a/ci/docker/s390x-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/s390x-unknown-linux-gnu/Dockerfile
@@ -1,12 +1,18 @@
 FROM ubuntu:17.10
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates \
-        gcc-s390x-linux-gnu libc6-dev-s390x-cross
+        curl ca-certificates \
+        gcc libc6-dev \
+        gcc-s390x-linux-gnu libc6-dev-s390x-cross \
+        qemu-system-s390x \
+        cpio
+
+COPY linux-s390x.sh /
+RUN bash /linux-s390x.sh
+
+COPY test-runner-linux /
 
 ENV CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_LINKER=s390x-linux-gnu-gcc \
-    # TODO: in theory we should execute this, but qemu segfaults immediately :(
-    # CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER="qemu-s390x -L /usr/s390x-linux-gnu" \
-    CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER=true \
+    CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER="/test-runner-linux s390x" \
     CC_s390x_unknown_linux_gnu=s390x-linux-gnu-gcc \
     PATH=$PATH:/rust/bin
diff --git a/ci/linux-s390x.sh b/ci/linux-s390x.sh
new file mode 100644
index 0000000000000000000000000000000000000000..972abeec569ece97403449f0abd2a424c14f0805
--- /dev/null
+++ b/ci/linux-s390x.sh
@@ -0,0 +1,18 @@
+set -ex
+
+mkdir -m 777 /qemu
+cd /qemu
+
+curl -LO https://github.com/qemu/qemu/raw/master/pc-bios/s390-ccw.img
+curl -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/kernel.debian
+curl -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/initrd.debian
+
+mv kernel.debian kernel
+mv initrd.debian initrd.gz
+
+mkdir init
+cd init
+gunzip -c ../initrd.gz | cpio -id
+rm ../initrd.gz
+cp /usr/s390x-linux-gnu/lib/libgcc_s.so.1 usr/lib/
+chmod a+w .
diff --git a/ci/test-runner-linux b/ci/test-runner-linux
new file mode 100755
index 0000000000000000000000000000000000000000..7a84b9d438fe5e7e57d63354af2933540ae95f52
--- /dev/null
+++ b/ci/test-runner-linux
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+set -e
+
+arch=$1
+prog=$2
+
+cd /qemu/init
+cp -f $2 prog
+find . | cpio --create --format='newc' --quiet | gzip > ../initrd.gz
+cd ..
+
+timeout 30s qemu-system-$arch \
+  -m 1024 \
+  -nographic \
+  -kernel kernel \
+  -initrd initrd.gz \
+  -append init=/prog > output || true
+
+# remove kernel messages
+tr -d '\r' < output | egrep -v '^\['
+
+grep PASSED output > /dev/null