aboutsummaryrefslogtreecommitdiff
path: root/cortex-m-semihosting/src/lib.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2022-03-01 19:38:23 +0000
committerGravatar GitHub <noreply@github.com> 2022-03-01 19:38:23 +0000
commite6c7249982841a8a39ada0bc80e6d0e492a560c3 (patch)
treebc59ffdd19ed3aa6e9b3738bfbedc954f4ecda9c /cortex-m-semihosting/src/lib.rs
parent8bb2a61d1cc3d2bbfd3dcc7f20fe55e9a1780df0 (diff)
parentac2a8365721b453f005feb7fe1fb25615f76af7c (diff)
downloadcortex-m-e6c7249982841a8a39ada0bc80e6d0e492a560c3.tar.gz
cortex-m-e6c7249982841a8a39ada0bc80e6d0e492a560c3.tar.zst
cortex-m-e6c7249982841a8a39ada0bc80e6d0e492a560c3.zip
Merge #423
423: Swap to just-stabilised asm!() and global_asm!() macros r=thejpster a=adamgreig Once Rust 1.59 is released in a couple of days, the `asm!()` and `global_asm!()` macros will become stable, and we will no longer require the various precompiled binaries we've used until now in cortex-m and cortex-m-rt. cc #420. This PR uses `asm!()` in cortex-m, and removes the inline-asm feature, since I anticipate this going into cortex-m 0.8 and so we don't need to leave it behind for compatibility. In various places the previous version would call an extern C method when built for the native target, which would only fail at link time; to preserve the ability to build on x86 I've either made the whole method require the `cortex_m` configuration, or where appropriate/convenient simply skipped the `asm!()` call. This PR replaces the old gcc-preprocessed `asm.S` in cortex-m-rt with use of `global_asm!()`, although since you can't normally use `#[cfg(...)]` attributes with `global_asm!()`, there's also a slightly scary macro modified from one invented by `@Dirbaio` for a similar purpose. I considered putting the initialisation of LR behind an armv6m flag, but since we want to restore it after calling `__pre_init` it seemed better to just leave it the same on both targets. I added Cargo features to optionally set SP and VTOR at startup, which has been variously requested but would previously have required multiplicatively more pre-built binaries. Now: no problem. Relevant issues: * https://github.com/rust-embedded/cortex-m-rt/issues/283 * https://github.com/rust-embedded/cortex-m-rt/issues/55 * https://github.com/rust-embedded/cortex-m-rt/issues/254 * https://github.com/rust-embedded/cortex-m-rt/issues/102 * https://github.com/rust-embedded/cortex-m-rt/pull/338 I've tested these on a couple of targets (and updated the CI): on the whole there's a small improvement in code size due to everyone getting inlined asm, especially in `cortex_m::interrupt::free()`. The major downside is we bump our MSRV from 1.42 (March 2020) to 1.59 (Feb 2022). For cortex-m, I propose putting these changes in the upcoming 0.8 release (which is technically what the master branch is already on) and not backporting. For cortex-m-rt I'm not sure: we don't have any other pending breaking changes, so we could consider a patch release. Anyway, this PR doesn't commit to any particular releases, so we can decide that later. For cortex-m-semihosting/panic-semihosting I think a patch release would be ideal, especially since we had to yank the last c-m-sh release due to conflicting prebuilt binaries (a problem that should now vanish). Also tagging these issues that I think might also benefit from new inline asm: * https://github.com/rust-embedded/cortex-m/issues/265 * https://github.com/rust-embedded/cortex-m/issues/215 * https://github.com/rust-embedded/cortex-m/issues/406 Co-authored-by: Adam Greig <adam@adamgreig.com>
Diffstat (limited to 'cortex-m-semihosting/src/lib.rs')
-rw-r--r--cortex-m-semihosting/src/lib.rs33
1 files changed, 6 insertions, 27 deletions
diff --git a/cortex-m-semihosting/src/lib.rs b/cortex-m-semihosting/src/lib.rs
index 3bc23ea..8306307 100644
--- a/cortex-m-semihosting/src/lib.rs
+++ b/cortex-m-semihosting/src/lib.rs
@@ -151,14 +151,6 @@
//!
//! # Optional features
//!
-//! ## `inline-asm`
-//!
-//! When this feature is enabled semihosting is implemented using inline assembly and
-//! compiling this crate requires nightly.
-//!
-//! When this feature is disabled semihosting is implemented using FFI calls into an external
-//! assembly file and compiling this crate works on stable and beta.
-//!
//! ## `jlink-quirks`
//!
//! When this feature is enabled, return values above `0xfffffff0` from semihosting operation
@@ -191,11 +183,6 @@ pub mod export;
pub mod hio;
pub mod nr;
-#[cfg(all(thumb, not(feature = "inline-asm")))]
-extern "C" {
- fn __sh_syscall(nr: usize, arg: usize) -> usize;
-}
-
/// Performs a semihosting operation, takes a pointer to an argument block
#[inline(always)]
pub unsafe fn syscall<T>(nr: usize, arg: &T) -> usize {
@@ -206,24 +193,16 @@ pub unsafe fn syscall<T>(nr: usize, arg: &T) -> usize {
#[inline(always)]
pub unsafe fn syscall1(_nr: usize, _arg: usize) -> usize {
match () {
- #[cfg(all(thumb, not(feature = "inline-asm"), not(feature = "no-semihosting")))]
- () => __sh_syscall(_nr, _arg),
-
- #[cfg(all(thumb, feature = "inline-asm", not(feature = "no-semihosting")))]
+ #[cfg(all(thumb, not(feature = "no-semihosting")))]
() => {
- let mut nr = _nr;
- core::arch::asm!(
- "bkpt #0xab",
- inout("r0") nr,
- in("r1") _arg,
- options(nomem, nostack, preserves_flags)
- );
- nr
+ use core::arch::asm;
+ let mut nr = _nr as u32;
+ let arg = _arg as u32;
+ asm!("bkpt #0xab", inout("r0") nr, in("r1") arg, options(nostack, preserves_flags));
+ nr as usize
}
-
#[cfg(all(thumb, feature = "no-semihosting"))]
() => 0,
-
#[cfg(not(thumb))]
() => unimplemented!(),
}