diff --git a/Makefile b/Makefile index 201581d1..7f71ab15 100644 --- a/Makefile +++ b/Makefile @@ -46,9 +46,8 @@ endif .PHONY: setup setup: setup-qemu rustup install stable - cargo +stable install elf2tab - cargo miri setup - rustup target add --toolchain stable thumbv7em-none-eabi + cargo install elf2tab + cargo +nightly miri setup # Sets up QEMU in the tock/ directory. We use Tock's QEMU which may contain # patches to better support boards that Tock supports. @@ -108,19 +107,8 @@ EXCLUDE_STD := --exclude libtock_unittest --exclude print_sizes \ --exclude runner --exclude syscalls_tests \ --exclude libtock_build_scripts -# Currently, all of our crates should build with a stable toolchain. This -# verifies our crates don't depend on unstable features by using cargo check. We -# specify a different target directory so this doesn't flush the cargo cache of -# the primary toolchain. -.PHONY: test-stable -test-stable: - cargo +stable check --target-dir=target/stable --workspace \ - $(EXCLUDE_RUNTIME) - LIBTOCK_PLATFORM=nrf52 cargo +stable check $(EXCLUDE_STD) \ - --target=thumbv7em-none-eabi --target-dir=target/stable --workspace - .PHONY: test -test: examples test-stable +test: examples cargo test $(EXCLUDE_RUNTIME) --workspace LIBTOCK_PLATFORM=nrf52 cargo fmt --all -- --check cargo clippy --all-targets $(EXCLUDE_RUNTIME) --workspace @@ -129,7 +117,7 @@ test: examples test-stable LIBTOCK_PLATFORM=hifive1 cargo clippy $(EXCLUDE_STD) \ --target=riscv32imac-unknown-none-elf --workspace MIRIFLAGS="-Zmiri-strict-provenance -Zmiri-symbolic-alignment-check" \ - cargo miri test $(EXCLUDE_MIRI) --workspace + cargo +nightly miri test $(EXCLUDE_MIRI) --workspace echo '[ SUCCESS ] libtock-rs tests pass' # Helper functions to define make targets to build for specific (flash, ram, diff --git a/platform/src/register.rs b/platform/src/register.rs index 976653a5..0afde2f1 100644 --- a/platform/src/register.rs +++ b/platform/src/register.rs @@ -1,3 +1,5 @@ +use core::mem::transmute; + /// In order to work with Miri's `-Zmiri-track-raw-pointers` flag, we cannot /// pass pointers to the kernel through `usize` values (as casting to and from /// `usize` drops the pointer`s tag). Instead, `RawSyscalls` uses the `Register` @@ -16,19 +18,28 @@ pub struct Register(pub *mut ()); impl From for Register { fn from(value: crate::ErrorCode) -> Register { - Register(value as u16 as *mut ()) + (value as usize).into() } } impl From for Register { fn from(value: u32) -> Register { - Register(value as *mut ()) + (value as usize).into() } } impl From for Register { fn from(value: usize) -> Register { - Register(value as *mut ()) + // Note: clippy is wrong here; transmute has different semantics than + // `as` casts under strict provenance. + #[allow(clippy::useless_transmute)] + // We want to convert using the same semantics as core::ptr::invalid: + // convert the usize into a pointer with that address without attaching + // provenance to it. However, core::ptr::invalid is a nightly-only + // function. In order to build on stable, we copy its implementation. + // Safety: Raw pointers do not have any validity invariants that usize + // does not have; a raw pointer can point to any address. + Register(unsafe { transmute(value) }) } } diff --git a/rust-toolchain b/rust-toolchain index 4c36818b..a9b2b057 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,8 +1,6 @@ [toolchain] -# See https://rust-lang.github.io/rustup-components-history/ for a list of -# recently nightlies and what components are available for them. -channel = "nightly-2022-06-10" -components = ["clippy", "miri", "rustfmt"] +channel = "stable" +components = ["clippy", "rustfmt"] targets = ["thumbv6m-none-eabi", "thumbv7em-none-eabi", "riscv32imac-unknown-none-elf", diff --git a/unittest/Cargo.toml b/unittest/Cargo.toml index 3a7eb5f0..094f0915 100644 --- a/unittest/Cargo.toml +++ b/unittest/Cargo.toml @@ -10,4 +10,4 @@ version = "0.1.0" [dependencies] libtock_platform = { path = "../platform" } -thiserror = "1.0" +thiserror = "1.0.44"