diff --git a/src/ci/docker/dist-various-1/Dockerfile b/src/ci/docker/dist-various-1/Dockerfile index e2484b7224b26..c7e6af28f9d4f 100644 --- a/src/ci/docker/dist-various-1/Dockerfile +++ b/src/ci/docker/dist-various-1/Dockerfile @@ -22,7 +22,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libssl-dev \ pkg-config \ gcc-arm-none-eabi \ - libnewlib-arm-none-eabi + libnewlib-arm-none-eabi \ + qemu-system-arm WORKDIR /build diff --git a/src/test/run-make/thumb-none-qemu/Makefile b/src/test/run-make/thumb-none-qemu/Makefile new file mode 100644 index 0000000000000..ffd17721b73bb --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/Makefile @@ -0,0 +1,30 @@ +-include ../../run-make-fulldeps/tools.mk + +# How to run this +# $ ./x.py clean +# $ ./x.py test --target thumbv7m-none-eabi src/test/run-make + +ifneq (,$(filter $(TARGET),thumbv6m-none-eabi thumbv7m-none-eabi)) + +# For cargo setting +export RUSTC := $(RUSTC_ORIGINAL) +export LD_LIBRARY_PATH := $(HOST_RPATH_DIR) +# We need to be outside of 'src' dir in order to run cargo +export WORK_DIR := $(TMPDIR) +export HERE := $(shell pwd) + +## clean up unused env variables which might cause harm. +unexport RUSTC_LINKER +unexport RUSTC_BOOTSTRAP +unexport RUST_BUILD_STAGE +unexport RUST_TEST_THREADS +unexport RUST_TEST_TMPDIR +unexport AR +unexport CC +unexport CXX + +all: + bash script.sh +else +all: +endif diff --git a/src/test/run-make/thumb-none-qemu/example/Cargo.toml b/src/test/run-make/thumb-none-qemu/example/Cargo.toml new file mode 100644 index 0000000000000..499553304c681 --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/example/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "example" +version = "0.1.0" +authors = ["Hideki Sekine "] +# edition = "2018" + +[dependencies] +cortex-m = "0.5.4" +cortex-m-rt = "=0.5.4" +panic-halt = "0.2.0" +cortex-m-semihosting = "0.3.1" diff --git a/src/test/run-make/thumb-none-qemu/example/memory.x b/src/test/run-make/thumb-none-qemu/example/memory.x new file mode 100644 index 0000000000000..dc7ad967a42a8 --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/example/memory.x @@ -0,0 +1,23 @@ +/* Device specific memory layout */ + +/* This file is used to build the cortex-m-rt examples, + but not other applications using cortex-m-rt. */ + +MEMORY +{ + /* FLASH and RAM are mandatory memory regions */ + /* Update examples/data_overflow.rs if you change these sizes. */ + FLASH : ORIGIN = 0x00000000, LENGTH = 256K + RAM : ORIGIN = 0x20000000, LENGTH = 64K + + /* More memory regions can declared: for example this is a second RAM region */ + /* CCRAM : ORIGIN = 0x10000000, LENGTH = 8K */ +} + +/* The location of the stack can be overridden using the `_stack_start` symbol. + By default it will be placed at the end of the RAM region */ +/* _stack_start = ORIGIN(CCRAM) + LENGTH(CCRAM); */ + +/* The location of the .text section can be overridden using the `_stext` symbol. + By default it will place after .vector_table */ +/* _stext = ORIGIN(FLASH) + 0x40c; */ \ No newline at end of file diff --git a/src/test/run-make/thumb-none-qemu/example/src/main.rs b/src/test/run-make/thumb-none-qemu/example/src/main.rs new file mode 100644 index 0000000000000..d88a327ef08b4 --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/example/src/main.rs @@ -0,0 +1,30 @@ +// #![feature(stdsimd)] +#![no_main] +#![no_std] + +extern crate cortex_m; + +extern crate cortex_m_rt as rt; +extern crate cortex_m_semihosting as semihosting; +extern crate panic_halt; + +use core::fmt::Write; +use cortex_m::asm; +use rt::entry; + +entry!(main); + +fn main() -> ! { + let x = 42; + + loop { + asm::nop(); + + // write something through semihosting interface + let mut hstdout = semihosting::hio::hstdout().unwrap(); + write!(hstdout, "x = {}\n", x); + + // exit from qemu + semihosting::debug::exit(semihosting::debug::EXIT_SUCCESS); + } +} diff --git a/src/test/run-make/thumb-none-qemu/script.sh b/src/test/run-make/thumb-none-qemu/script.sh new file mode 100644 index 0000000000000..0f1c49f3a71b1 --- /dev/null +++ b/src/test/run-make/thumb-none-qemu/script.sh @@ -0,0 +1,16 @@ +set -exuo pipefail + +CRATE=example + +env | sort +mkdir -p $WORK_DIR +pushd $WORK_DIR + rm -rf $CRATE || echo OK + cp -a $HERE/example . + pushd $CRATE + env RUSTFLAGS="-C linker=arm-none-eabi-ld -C link-arg=-Tlink.x" \ + $CARGO run --target $TARGET | grep "x = 42" + env RUSTFLAGS="-C linker=arm-none-eabi-ld -C link-arg=-Tlink.x" \ + $CARGO run --target $TARGET --release | grep "x = 42" + popd +popd