diff options
author | 2020-10-02 16:44:57 +0000 | |
---|---|---|
committer | 2020-10-02 16:44:57 +0000 | |
commit | f77d64a2d1505335e4a170d03a40993bb066fd02 (patch) | |
tree | 06c7b191bc4d92137762ba88a8aa072426d36bda | |
parent | 43b9383cbedc5b0fb0b2df51df0e7af742fb7b61 (diff) | |
parent | 7102bd4c048d96f65f79f32c1f0b1c59e1a32a51 (diff) | |
download | cortex-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.rs | 17 | ||||
-rw-r--r-- | asm/lib.rs | 4 | ||||
-rw-r--r-- | bin/thumbv6m-none-eabi-lto.a | bin | 14084 -> 14432 bytes | |||
-rw-r--r-- | bin/thumbv6m-none-eabi.a | bin | 17052 -> 17496 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabi-lto.a | bin | 18300 -> 18648 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabi.a | bin | 21444 -> 21892 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabihf-lto.a | bin | 19272 -> 19624 bytes | |||
-rw-r--r-- | bin/thumbv7em-none-eabihf.a | bin | 22528 -> 22976 bytes | |||
-rw-r--r-- | bin/thumbv7m-none-eabi-lto.a | bin | 17072 -> 17408 bytes | |||
-rw-r--r-- | bin/thumbv7m-none-eabi.a | bin | 20280 -> 20724 bytes | |||
-rw-r--r-- | bin/thumbv8m.base-none-eabi-lto.a | bin | 16044 -> 17688 bytes | |||
-rw-r--r-- | bin/thumbv8m.base-none-eabi.a | bin | 19260 -> 21208 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabi-lto.a | bin | 20756 -> 22376 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabi.a | bin | 24628 -> 26560 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabihf-lto.a | bin | 21732 -> 23360 bytes | |||
-rw-r--r-- | bin/thumbv8m.main-none-eabihf.a | bin | 25676 -> 27612 bytes | |||
-rw-r--r-- | src/asm.rs | 10 | ||||
-rw-r--r-- | src/register/msp.rs | 18 |
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)] @@ -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 Binary files differindex f2451c0..6ee0427 100644 --- a/bin/thumbv6m-none-eabi-lto.a +++ b/bin/thumbv6m-none-eabi-lto.a diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a Binary files differindex 1267700..34dba4a 100644 --- a/bin/thumbv6m-none-eabi.a +++ b/bin/thumbv6m-none-eabi.a diff --git a/bin/thumbv7em-none-eabi-lto.a b/bin/thumbv7em-none-eabi-lto.a Binary files differindex 2258d43..781ea4c 100644 --- a/bin/thumbv7em-none-eabi-lto.a +++ b/bin/thumbv7em-none-eabi-lto.a diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a Binary files differindex 9a47ef0..05d98ba 100644 --- a/bin/thumbv7em-none-eabi.a +++ b/bin/thumbv7em-none-eabi.a diff --git a/bin/thumbv7em-none-eabihf-lto.a b/bin/thumbv7em-none-eabihf-lto.a Binary files differindex 67cb2ea..b0a2204 100644 --- a/bin/thumbv7em-none-eabihf-lto.a +++ b/bin/thumbv7em-none-eabihf-lto.a diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a Binary files differindex 28a091a..bd416b5 100644 --- a/bin/thumbv7em-none-eabihf.a +++ b/bin/thumbv7em-none-eabihf.a diff --git a/bin/thumbv7m-none-eabi-lto.a b/bin/thumbv7m-none-eabi-lto.a Binary files differindex 81bdbe4..a6ff71a 100644 --- a/bin/thumbv7m-none-eabi-lto.a +++ b/bin/thumbv7m-none-eabi-lto.a diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a Binary files differindex d215f5f..1f57c90 100644 --- a/bin/thumbv7m-none-eabi.a +++ b/bin/thumbv7m-none-eabi.a diff --git a/bin/thumbv8m.base-none-eabi-lto.a b/bin/thumbv8m.base-none-eabi-lto.a Binary files differindex d0fdb57..d157ab5 100644 --- a/bin/thumbv8m.base-none-eabi-lto.a +++ b/bin/thumbv8m.base-none-eabi-lto.a diff --git a/bin/thumbv8m.base-none-eabi.a b/bin/thumbv8m.base-none-eabi.a Binary files differindex 60164eb..6142436 100644 --- a/bin/thumbv8m.base-none-eabi.a +++ b/bin/thumbv8m.base-none-eabi.a diff --git a/bin/thumbv8m.main-none-eabi-lto.a b/bin/thumbv8m.main-none-eabi-lto.a Binary files differindex 0a4faa1..f5849b1 100644 --- a/bin/thumbv8m.main-none-eabi-lto.a +++ b/bin/thumbv8m.main-none-eabi-lto.a diff --git a/bin/thumbv8m.main-none-eabi.a b/bin/thumbv8m.main-none-eabi.a Binary files differindex 43af099..63a0dd0 100644 --- a/bin/thumbv8m.main-none-eabi.a +++ b/bin/thumbv8m.main-none-eabi.a diff --git a/bin/thumbv8m.main-none-eabihf-lto.a b/bin/thumbv8m.main-none-eabihf-lto.a Binary files differindex 23d2663..5dae3aa 100644 --- a/bin/thumbv8m.main-none-eabihf-lto.a +++ b/bin/thumbv8m.main-none-eabihf-lto.a diff --git a/bin/thumbv8m.main-none-eabihf.a b/bin/thumbv8m.main-none-eabihf.a Binary files differindex 399b409..3989cda 100644 --- a/bin/thumbv8m.main-none-eabihf.a +++ b/bin/thumbv8m.main-none-eabihf.a @@ -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)); +} |