mirror of https://github.com/rust-lang/rust.git
Auto merge of #43226 - alexcrichton:aarch64-ci, r=aidanhs
Add a disabled builder for aarch64 emulated tests This commit adds a disabled builder which will run all tests for the standard library for aarch64 in a QEMU instance. Once we get enough capacity to run this on Travis this can be used to boost our platform coverage of AArch64
This commit is contained in:
commit
bad58f2791
|
@ -490,6 +490,7 @@ valopt musl-root-armhf "" "arm-unknown-linux-musleabihf install directory"
|
||||||
valopt musl-root-armv7 "" "armv7-unknown-linux-musleabihf install directory"
|
valopt musl-root-armv7 "" "armv7-unknown-linux-musleabihf install directory"
|
||||||
valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"
|
valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"
|
||||||
valopt qemu-armhf-rootfs "" "rootfs in qemu testing, you probably don't want to use this"
|
valopt qemu-armhf-rootfs "" "rootfs in qemu testing, you probably don't want to use this"
|
||||||
|
valopt qemu-aarch64-rootfs "" "rootfs in qemu testing, you probably don't want to use this"
|
||||||
valopt experimental-targets "" "experimental LLVM targets to build"
|
valopt experimental-targets "" "experimental LLVM targets to build"
|
||||||
|
|
||||||
if [ -e ${CFG_SRC_DIR}.git ]
|
if [ -e ${CFG_SRC_DIR}.git ]
|
||||||
|
|
|
@ -636,6 +636,11 @@ impl Config {
|
||||||
let target = self.target_config.entry(target).or_insert(Target::default());
|
let target = self.target_config.entry(target).or_insert(Target::default());
|
||||||
target.qemu_rootfs = Some(parse_configure_path(value));
|
target.qemu_rootfs = Some(parse_configure_path(value));
|
||||||
}
|
}
|
||||||
|
"CFG_QEMU_AARCH64_ROOTFS" if value.len() > 0 => {
|
||||||
|
let target = INTERNER.intern_str("aarch64-unknown-linux-gnu");
|
||||||
|
let target = self.target_config.entry(target).or_insert(Target::default());
|
||||||
|
target.qemu_rootfs = Some(parse_configure_path(value));
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,11 +63,11 @@ RUN curl http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-bas
|
||||||
|
|
||||||
# Copy over our init script, which starts up our test server and also a few
|
# Copy over our init script, which starts up our test server and also a few
|
||||||
# other misc tasks.
|
# other misc tasks.
|
||||||
COPY armhf-gnu/rcS rootfs/etc/init.d/rcS
|
COPY scripts/qemu-bare-bones-rcS rootfs/etc/init.d/rcS
|
||||||
RUN chmod +x rootfs/etc/init.d/rcS
|
RUN chmod +x rootfs/etc/init.d/rcS
|
||||||
|
|
||||||
# Helper to quickly fill the entropy pool in the kernel.
|
# Helper to quickly fill the entropy pool in the kernel.
|
||||||
COPY armhf-gnu/addentropy.c /tmp/
|
COPY scripts/qemu-bare-bones-addentropy.c /tmp/addentropy.c
|
||||||
RUN arm-linux-gnueabihf-gcc addentropy.c -o rootfs/addentropy -static
|
RUN arm-linux-gnueabihf-gcc addentropy.c -o rootfs/addentropy -static
|
||||||
|
|
||||||
# TODO: What is this?!
|
# TODO: What is this?!
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
FROM ubuntu:16.04
|
||||||
|
|
||||||
|
RUN apt-get update -y && apt-get install -y --no-install-recommends \
|
||||||
|
bc \
|
||||||
|
bzip2 \
|
||||||
|
ca-certificates \
|
||||||
|
cmake \
|
||||||
|
cpio \
|
||||||
|
curl \
|
||||||
|
file \
|
||||||
|
g++ \
|
||||||
|
gcc-aarch64-linux-gnu \
|
||||||
|
git \
|
||||||
|
libc6-dev \
|
||||||
|
libc6-dev-arm64-cross \
|
||||||
|
make \
|
||||||
|
python2.7 \
|
||||||
|
qemu-system-aarch64 \
|
||||||
|
xz-utils
|
||||||
|
|
||||||
|
ENV ARCH=arm64 \
|
||||||
|
CROSS_COMPILE=aarch64-linux-gnu-
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
# Compile the kernel that we're going to run and be emulating with. This is
|
||||||
|
# basically just done to be compatible with the QEMU target that we're going
|
||||||
|
# to be using when running tests. If any other kernel works or if any
|
||||||
|
# other QEMU target works with some other stock kernel, we can use that too!
|
||||||
|
#
|
||||||
|
# The `config` config file was a previously generated config file for
|
||||||
|
# the kernel. This file was generated by running `make defconfig`
|
||||||
|
# followed by `make menuconfig` and then enabling the IPv6 protocol page.
|
||||||
|
COPY disabled/aarch64-gnu/config /build/.config
|
||||||
|
RUN curl https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.42.tar.xz | \
|
||||||
|
tar xJf - && \
|
||||||
|
cd /build/linux-4.4.42 && \
|
||||||
|
cp /build/.config . && \
|
||||||
|
make -j$(nproc) all && \
|
||||||
|
cp arch/arm64/boot/Image /tmp && \
|
||||||
|
cd /build && \
|
||||||
|
rm -rf linux-4.4.42
|
||||||
|
|
||||||
|
# Compile an instance of busybox as this provides a lightweight system and init
|
||||||
|
# binary which we will boot into. Only trick here is configuring busybox to
|
||||||
|
# build static binaries.
|
||||||
|
RUN curl https://www.busybox.net/downloads/busybox-1.21.1.tar.bz2 | tar xjf - && \
|
||||||
|
cd busybox-1.21.1 && \
|
||||||
|
make defconfig && \
|
||||||
|
sed -i 's/.*CONFIG_STATIC.*/CONFIG_STATIC=y/' .config && \
|
||||||
|
make -j$(nproc) && \
|
||||||
|
make install && \
|
||||||
|
mv _install /tmp/rootfs && \
|
||||||
|
cd /build && \
|
||||||
|
rm -rf busybox-1.12.1
|
||||||
|
|
||||||
|
# Download the ubuntu rootfs, which we'll use as a chroot for all our tests.
|
||||||
|
WORKDIR /tmp
|
||||||
|
RUN mkdir rootfs/ubuntu
|
||||||
|
RUN curl http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04-core-arm64.tar.gz | \
|
||||||
|
tar xzf - -C rootfs/ubuntu && \
|
||||||
|
cd rootfs && mkdir proc sys dev etc etc/init.d
|
||||||
|
|
||||||
|
# Copy over our init script, which starts up our test server and also a few
|
||||||
|
# other misc tasks.
|
||||||
|
COPY scripts/qemu-bare-bones-rcS rootfs/etc/init.d/rcS
|
||||||
|
RUN chmod +x rootfs/etc/init.d/rcS
|
||||||
|
|
||||||
|
# Helper to quickly fill the entropy pool in the kernel.
|
||||||
|
COPY scripts/qemu-bare-bones-addentropy.c /tmp/addentropy.c
|
||||||
|
RUN aarch64-linux-gnu-gcc addentropy.c -o rootfs/addentropy -static
|
||||||
|
|
||||||
|
COPY scripts/dumb-init.sh /scripts/
|
||||||
|
RUN sh /scripts/dumb-init.sh
|
||||||
|
|
||||||
|
COPY scripts/sccache.sh /scripts/
|
||||||
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
|
||||||
|
|
||||||
|
ENV RUST_CONFIGURE_ARGS \
|
||||||
|
--target=aarch64-unknown-linux-gnu \
|
||||||
|
--qemu-aarch64-rootfs=/tmp/rootfs
|
||||||
|
ENV SCRIPT python2.7 ../x.py test --target aarch64-unknown-linux-gnu
|
||||||
|
ENV NO_CHANGE_USER=1
|
File diff suppressed because it is too large
Load Diff
|
@ -469,6 +469,7 @@ mod tests {
|
||||||
// although the reason isn't very clear as to why. For now this test is
|
// although the reason isn't very clear as to why. For now this test is
|
||||||
// ignored there.
|
// ignored there.
|
||||||
#[cfg_attr(target_arch = "arm", ignore)]
|
#[cfg_attr(target_arch = "arm", ignore)]
|
||||||
|
#[cfg_attr(target_arch = "aarch64", ignore)]
|
||||||
fn test_process_mask() {
|
fn test_process_mask() {
|
||||||
unsafe {
|
unsafe {
|
||||||
// Test to make sure that a signal mask does not get inherited.
|
// Test to make sure that a signal mask does not get inherited.
|
||||||
|
|
|
@ -533,9 +533,17 @@ mod tests {
|
||||||
assert!(b > a);
|
assert!(b > a);
|
||||||
assert_eq!(b - a, Duration::new(1, 0));
|
assert_eq!(b - a, Duration::new(1, 0));
|
||||||
|
|
||||||
// let's assume that we're all running computers later than 2000
|
|
||||||
let thirty_years = Duration::new(1, 0) * 60 * 60 * 24 * 365 * 30;
|
let thirty_years = Duration::new(1, 0) * 60 * 60 * 24 * 365 * 30;
|
||||||
|
|
||||||
|
// Right now for CI this test is run in an emulator, and apparently the
|
||||||
|
// aarch64 emulator's sense of time is that we're still living in the
|
||||||
|
// 70s.
|
||||||
|
//
|
||||||
|
// Otherwise let's assume that we're all running computers later than
|
||||||
|
// 2000.
|
||||||
|
if !cfg!(target_arch = "aarch64") {
|
||||||
assert!(a > thirty_years);
|
assert!(a > thirty_years);
|
||||||
|
}
|
||||||
|
|
||||||
// let's assume that we're all running computers earlier than 2090.
|
// let's assume that we're all running computers earlier than 2090.
|
||||||
// Should give us ~70 years to fix this!
|
// Should give us ~70 years to fix this!
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
// ignore-arm
|
// ignore-arm
|
||||||
// ignore-aarch64
|
// ignore-aarch64
|
||||||
// ignore-powerpc
|
// ignore-powerpc
|
||||||
|
// ignore-aarch64
|
||||||
// ignore-wasm
|
// ignore-wasm
|
||||||
// ignore-emscripten
|
// ignore-emscripten
|
||||||
// ignore-windows
|
// ignore-windows
|
||||||
|
|
|
@ -66,7 +66,7 @@ fn spawn_emulator(target: &str,
|
||||||
start_android_emulator(server);
|
start_android_emulator(server);
|
||||||
} else {
|
} else {
|
||||||
let rootfs = rootfs.as_ref().expect("need rootfs on non-android");
|
let rootfs = rootfs.as_ref().expect("need rootfs on non-android");
|
||||||
start_qemu_emulator(rootfs, server, tmpdir);
|
start_qemu_emulator(target, rootfs, server, tmpdir);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the emulator to come online
|
// Wait for the emulator to come online
|
||||||
|
@ -120,7 +120,10 @@ fn start_android_emulator(server: &Path) {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn start_qemu_emulator(rootfs: &Path, server: &Path, tmpdir: &Path) {
|
fn start_qemu_emulator(target: &str,
|
||||||
|
rootfs: &Path,
|
||||||
|
server: &Path,
|
||||||
|
tmpdir: &Path) {
|
||||||
// Generate a new rootfs image now that we've updated the test server
|
// Generate a new rootfs image now that we've updated the test server
|
||||||
// executable. This is the equivalent of:
|
// executable. This is the equivalent of:
|
||||||
//
|
//
|
||||||
|
@ -143,16 +146,36 @@ fn start_qemu_emulator(rootfs: &Path, server: &Path, tmpdir: &Path) {
|
||||||
assert!(t!(child.wait()).success());
|
assert!(t!(child.wait()).success());
|
||||||
|
|
||||||
// Start up the emulator, in the background
|
// Start up the emulator, in the background
|
||||||
|
match target {
|
||||||
|
"arm-unknown-linux-gnueabihf" => {
|
||||||
let mut cmd = Command::new("qemu-system-arm");
|
let mut cmd = Command::new("qemu-system-arm");
|
||||||
cmd.arg("-M").arg("vexpress-a15")
|
cmd.arg("-M").arg("vexpress-a15")
|
||||||
.arg("-m").arg("1024")
|
.arg("-m").arg("1024")
|
||||||
.arg("-kernel").arg("/tmp/zImage")
|
.arg("-kernel").arg("/tmp/zImage")
|
||||||
.arg("-initrd").arg(&rootfs_img)
|
.arg("-initrd").arg(&rootfs_img)
|
||||||
.arg("-dtb").arg("/tmp/vexpress-v2p-ca15-tc1.dtb")
|
.arg("-dtb").arg("/tmp/vexpress-v2p-ca15-tc1.dtb")
|
||||||
.arg("-append").arg("console=ttyAMA0 root=/dev/ram rdinit=/sbin/init init=/sbin/init")
|
.arg("-append")
|
||||||
|
.arg("console=ttyAMA0 root=/dev/ram rdinit=/sbin/init init=/sbin/init")
|
||||||
.arg("-nographic")
|
.arg("-nographic")
|
||||||
.arg("-redir").arg("tcp:12345::12345");
|
.arg("-redir").arg("tcp:12345::12345");
|
||||||
t!(cmd.spawn());
|
t!(cmd.spawn());
|
||||||
|
}
|
||||||
|
"aarch64-unknown-linux-gnu" => {
|
||||||
|
let mut cmd = Command::new("qemu-system-aarch64");
|
||||||
|
cmd.arg("-machine").arg("virt")
|
||||||
|
.arg("-cpu").arg("cortex-a57")
|
||||||
|
.arg("-m").arg("1024")
|
||||||
|
.arg("-kernel").arg("/tmp/Image")
|
||||||
|
.arg("-initrd").arg(&rootfs_img)
|
||||||
|
.arg("-append")
|
||||||
|
.arg("console=ttyAMA0 root=/dev/ram rdinit=/sbin/init init=/sbin/init")
|
||||||
|
.arg("-nographic")
|
||||||
|
.arg("-netdev").arg("user,id=net0,hostfwd=tcp::12345-:12345")
|
||||||
|
.arg("-device").arg("virtio-net-device,netdev=net0,mac=00:00:00:00:00:00");
|
||||||
|
t!(cmd.spawn());
|
||||||
|
}
|
||||||
|
_ => panic!("cannot start emulator for: {}"< target),
|
||||||
|
}
|
||||||
|
|
||||||
fn add_files(w: &mut Write, root: &Path, cur: &Path) {
|
fn add_files(w: &mut Write, root: &Path, cur: &Path) {
|
||||||
for entry in t!(cur.read_dir()) {
|
for entry in t!(cur.read_dir()) {
|
||||||
|
|
Loading…
Reference in New Issue