Skip to content

[CI] Run a thumbv7m-none-eabi binary using qemu-system-arm [IRR-2018-embedded] #53996

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Nov 6, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/ci/docker/dist-various-1/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
30 changes: 30 additions & 0 deletions src/test/run-make/thumb-none-qemu/Makefile
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions src/test/run-make/thumb-none-qemu/example/.cargo/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
[target.thumbv7m-none-eabi]
# uncomment this to make `cargo run` execute programs on QEMU
runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel"

[target.thumbv6m-none-eabi]
# uncomment this to make `cargo run` execute programs on QEMU
# For now, we use cortex-m3 instead of cortex-m0 which are not supported by QEMU
runner = "qemu-system-arm -cpu cortex-m3 -machine lm3s6965evb -nographic -semihosting-config enable=on,target=native -kernel"

[target.'cfg(all(target_arch = "arm", target_os = "none"))']
# uncomment ONE of these three option to make `cargo run` start a GDB session
# which option to pick depends on your system
# runner = "arm-none-eabi-gdb -q -x openocd.gdb"
# runner = "gdb-multiarch -q -x openocd.gdb"
# runner = "gdb -q -x openocd.gdb"

rustflags = [
# LLD (shipped with the Rust toolchain) is used as the default linker
"-C", "link-arg=-Tlink.x",

# if you run into problems with LLD switch to the GNU linker by commenting out
# this line
# "-C", "linker=arm-none-eabi-ld",

# if you need to link to pre-compiled C libraries provided by a C toolchain
# use GCC as the linker by commenting out both lines above and then
# uncommenting the three lines below
# "-C", "linker=arm-none-eabi-gcc",
# "-C", "link-arg=-Wl,-Tlink.x",
# "-C", "link-arg=-nostartfiles",
]
11 changes: 11 additions & 0 deletions src/test/run-make/thumb-none-qemu/example/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[package]
name = "example"
version = "0.1.0"
authors = ["Hideki Sekine <[email protected]>"]
# 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"
23 changes: 23 additions & 0 deletions src/test/run-make/thumb-none-qemu/example/memory.x
Original file line number Diff line number Diff line change
@@ -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; */
30 changes: 30 additions & 0 deletions src/test/run-make/thumb-none-qemu/example/src/main.rs
Original file line number Diff line number Diff line change
@@ -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);
}
}
16 changes: 16 additions & 0 deletions src/test/run-make/thumb-none-qemu/script.sh
Original file line number Diff line number Diff line change
@@ -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