aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2020-10-02 16:44:57 +0000
committerGravatar GitHub <noreply@github.com> 2020-10-02 16:44:57 +0000
commitf77d64a2d1505335e4a170d03a40993bb066fd02 (patch)
tree06c7b191bc4d92137762ba88a8aa072426d36bda
parent43b9383cbedc5b0fb0b2df51df0e7af742fb7b61 (diff)
parent7102bd4c048d96f65f79f32c1f0b1c59e1a32a51 (diff)
downloadcortex-m-f77d64a2d1505335e4a170d03a40993bb066fd02.tar.gz
cortex-m-f77d64a2d1505335e4a170d03a40993bb066fd02.tar.zst
cortex-m-f77d64a2d1505335e4a170d03a40993bb066fd02.zip
Merge #268
268: Add some Armv8-M assembly routines r=jonas-schievink a=hug-dev Adds access to `MSP_NS` and the `BXNS` instruction. Also adds `__dsb` which was missing. Executed `cargo xtask assemble` and pushed everything, I hope that's enough. Co-authored-by: Hugues de Valon <hugues.devalon@arm.com>
-rw-r--r--asm/inline.rs17
-rw-r--r--asm/lib.rs4
-rw-r--r--bin/thumbv6m-none-eabi-lto.abin14084 -> 14432 bytes
-rw-r--r--bin/thumbv6m-none-eabi.abin17052 -> 17496 bytes
-rw-r--r--bin/thumbv7em-none-eabi-lto.abin18300 -> 18648 bytes
-rw-r--r--bin/thumbv7em-none-eabi.abin21444 -> 21892 bytes
-rw-r--r--bin/thumbv7em-none-eabihf-lto.abin19272 -> 19624 bytes
-rw-r--r--bin/thumbv7em-none-eabihf.abin22528 -> 22976 bytes
-rw-r--r--bin/thumbv7m-none-eabi-lto.abin17072 -> 17408 bytes
-rw-r--r--bin/thumbv7m-none-eabi.abin20280 -> 20724 bytes
-rw-r--r--bin/thumbv8m.base-none-eabi-lto.abin16044 -> 17688 bytes
-rw-r--r--bin/thumbv8m.base-none-eabi.abin19260 -> 21208 bytes
-rw-r--r--bin/thumbv8m.main-none-eabi-lto.abin20756 -> 22376 bytes
-rw-r--r--bin/thumbv8m.main-none-eabi.abin24628 -> 26560 bytes
-rw-r--r--bin/thumbv8m.main-none-eabihf-lto.abin21732 -> 23360 bytes
-rw-r--r--bin/thumbv8m.main-none-eabihf.abin25676 -> 27612 bytes
-rw-r--r--src/asm.rs10
-rw-r--r--src/register/msp.rs18
18 files changed, 49 insertions, 0 deletions
diff --git a/asm/inline.rs b/asm/inline.rs
index 3fbba92..9a0c66e 100644
--- a/asm/inline.rs
+++ b/asm/inline.rs
@@ -308,6 +308,23 @@ mod v8m {
asm!("ttat {target}, {target}", target = inout(reg) target);
target
}
+
+ #[inline(always)]
+ pub unsafe fn __msp_ns_r() -> u32 {
+ let r;
+ asm!("mrs {}, MSP_NS", out(reg) r);
+ r
+ }
+
+ #[inline(always)]
+ pub unsafe fn __msp_ns_w(val: u32) {
+ asm!("msr MSP_NS, {}", in(reg) val);
+ }
+
+ #[inline(always)]
+ pub unsafe fn __bxns(val: u32) {
+ asm!("BXNS {}", in(reg) val);
+ }
}
#[cfg(armv8m_main)]
diff --git a/asm/lib.rs b/asm/lib.rs
index 50e1db6..93d56fb 100644
--- a/asm/lib.rs
+++ b/asm/lib.rs
@@ -60,6 +60,7 @@ shims! {
fn __cpsie();
fn __delay(cyc: u32);
fn __dmb();
+ fn __dsb();
fn __isb();
fn __msp_r() -> u32;
fn __msp_w(val: u32);
@@ -97,6 +98,9 @@ shims! {
fn __ttt(target: u32) -> u32;
fn __tta(target: u32) -> u32;
fn __ttat(target: u32) -> u32;
+ fn __msp_ns_r() -> u32;
+ fn __msp_ns_w(val: u32);
+ fn __bxns(val: u32);
}
// Mainline only.
diff --git a/bin/thumbv6m-none-eabi-lto.a b/bin/thumbv6m-none-eabi-lto.a
index f2451c0..6ee0427 100644
--- a/bin/thumbv6m-none-eabi-lto.a
+++ b/bin/thumbv6m-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a
index 1267700..34dba4a 100644
--- a/bin/thumbv6m-none-eabi.a
+++ b/bin/thumbv6m-none-eabi.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabi-lto.a b/bin/thumbv7em-none-eabi-lto.a
index 2258d43..781ea4c 100644
--- a/bin/thumbv7em-none-eabi-lto.a
+++ b/bin/thumbv7em-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a
index 9a47ef0..05d98ba 100644
--- a/bin/thumbv7em-none-eabi.a
+++ b/bin/thumbv7em-none-eabi.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabihf-lto.a b/bin/thumbv7em-none-eabihf-lto.a
index 67cb2ea..b0a2204 100644
--- a/bin/thumbv7em-none-eabihf-lto.a
+++ b/bin/thumbv7em-none-eabihf-lto.a
Binary files differ
diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a
index 28a091a..bd416b5 100644
--- a/bin/thumbv7em-none-eabihf.a
+++ b/bin/thumbv7em-none-eabihf.a
Binary files differ
diff --git a/bin/thumbv7m-none-eabi-lto.a b/bin/thumbv7m-none-eabi-lto.a
index 81bdbe4..a6ff71a 100644
--- a/bin/thumbv7m-none-eabi-lto.a
+++ b/bin/thumbv7m-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a
index d215f5f..1f57c90 100644
--- a/bin/thumbv7m-none-eabi.a
+++ b/bin/thumbv7m-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.base-none-eabi-lto.a b/bin/thumbv8m.base-none-eabi-lto.a
index d0fdb57..d157ab5 100644
--- a/bin/thumbv8m.base-none-eabi-lto.a
+++ b/bin/thumbv8m.base-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv8m.base-none-eabi.a b/bin/thumbv8m.base-none-eabi.a
index 60164eb..6142436 100644
--- a/bin/thumbv8m.base-none-eabi.a
+++ b/bin/thumbv8m.base-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabi-lto.a b/bin/thumbv8m.main-none-eabi-lto.a
index 0a4faa1..f5849b1 100644
--- a/bin/thumbv8m.main-none-eabi-lto.a
+++ b/bin/thumbv8m.main-none-eabi-lto.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabi.a b/bin/thumbv8m.main-none-eabi.a
index 43af099..63a0dd0 100644
--- a/bin/thumbv8m.main-none-eabi.a
+++ b/bin/thumbv8m.main-none-eabi.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabihf-lto.a b/bin/thumbv8m.main-none-eabihf-lto.a
index 23d2663..5dae3aa 100644
--- a/bin/thumbv8m.main-none-eabihf-lto.a
+++ b/bin/thumbv8m.main-none-eabihf-lto.a
Binary files differ
diff --git a/bin/thumbv8m.main-none-eabihf.a b/bin/thumbv8m.main-none-eabihf.a
index 399b409..3989cda 100644
--- a/bin/thumbv8m.main-none-eabihf.a
+++ b/bin/thumbv8m.main-none-eabihf.a
Binary files differ
diff --git a/src/asm.rs b/src/asm.rs
index 3165aca..8f23aa9 100644
--- a/src/asm.rs
+++ b/src/asm.rs
@@ -154,3 +154,13 @@ pub fn ttat(addr: *mut u32) -> u32 {
let addr = addr as u32;
call_asm!(__ttat(addr: u32) -> u32)
}
+
+/// Branch and Exchange Non-secure
+///
+/// See section C2.4.26 of Armv8-M Architecture Reference Manual for details.
+/// Undefined if executed in Non-Secure state.
+#[inline]
+#[cfg(armv8m)]
+pub unsafe fn bx_ns(addr: u32) {
+ call_asm!(__bxns(addr: u32));
+}
diff --git a/src/register/msp.rs b/src/register/msp.rs
index 275023d..2e8261e 100644
--- a/src/register/msp.rs
+++ b/src/register/msp.rs
@@ -11,3 +11,21 @@ pub fn read() -> u32 {
pub unsafe fn write(bits: u32) {
call_asm!(__msp_w(bits: u32));
}
+
+/// Reads the Non-Secure CPU register from Secure state.
+///
+/// Executing this function in Non-Secure state will return zeroes.
+#[cfg(armv8m)]
+#[inline]
+pub fn read_ns() -> u32 {
+ call_asm!(__msp_ns_r() -> u32)
+}
+
+/// Writes `bits` to the Non-Secure CPU register from Secure state.
+///
+/// Executing this function in Non-Secure state will be ignored.
+#[cfg(armv8m)]
+#[inline]
+pub unsafe fn write_ns(bits: u32) {
+ call_asm!(__msp_ns_w(bits: u32));
+}