From 539c6d00fffabaf7c3f61f2f8c1aaefa661fa500 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Sun, 15 Mar 2020 19:40:37 +0000 Subject: Add UDF instruction. Closes #199. --- src/asm.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src') diff --git a/src/asm.rs b/src/asm.rs index 7b1a9ce..593aeac 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -81,6 +81,30 @@ pub fn nop() { } } + +/// Generate an Undefined Instruction exception. +/// +/// Can be used as a stable alternative to `core::intrinsics::abort`. +#[inline] +pub fn udf() { + match () { + #[cfg(all(cortex_m, feature = "inline-asm"))] + () => unsafe { asm!("udf" :::: "volatile") }, + + #[cfg(all(cortex_m, not(feature = "inline-asm")))] + () => unsafe { + extern "C" { + fn __udf(); + } + + __udf() + }, + + #[cfg(not(cortex_m))] + () => unimplemented!(), + } +} + /// Wait For Event #[inline] pub fn wfe() { -- cgit v1.2.3 From e3d7092189b76ff31edc24b43e6d2a75c84b6358 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Sun, 15 Mar 2020 19:58:19 +0000 Subject: Mark asm::udf as divergent --- src/asm.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/asm.rs b/src/asm.rs index 593aeac..3fe6393 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -86,10 +86,13 @@ pub fn nop() { /// /// Can be used as a stable alternative to `core::intrinsics::abort`. #[inline] -pub fn udf() { +pub fn udf() -> ! { match () { #[cfg(all(cortex_m, feature = "inline-asm"))] - () => unsafe { asm!("udf" :::: "volatile") }, + () => unsafe { + asm!("udf" :::: "volatile"); + loop { continue } + }, #[cfg(all(cortex_m, not(feature = "inline-asm")))] () => unsafe { @@ -97,7 +100,9 @@ pub fn udf() { fn __udf(); } - __udf() + __udf(); + + loop { continue } }, #[cfg(not(cortex_m))] -- cgit v1.2.3 From 715e59506e3a4482500f252270b42f12e2498849 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Sun, 15 Mar 2020 23:29:28 +0000 Subject: Swap infinite loops for unreachable_unchecked() --- asm.s | 1 - bin/thumbv6m-none-eabi.a | Bin 3074 -> 3070 bytes bin/thumbv7em-none-eabi.a | Bin 5302 -> 5298 bytes bin/thumbv7em-none-eabihf.a | Bin 5302 -> 5298 bytes bin/thumbv7m-none-eabi.a | Bin 4244 -> 4240 bytes bin/thumbv8m.base-none-eabi.a | Bin 4174 -> 4170 bytes bin/thumbv8m.main-none-eabi.a | Bin 6584 -> 6580 bytes bin/thumbv8m.main-none-eabihf.a | Bin 6584 -> 6580 bytes src/asm.rs | 4 ++-- 9 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/asm.s b/asm.s index 975e1ce..ed1ec3f 100644 --- a/asm.s +++ b/asm.s @@ -120,7 +120,6 @@ __sev: .thumb_func __udf: udf - bx lr .section .text.__wfe .global __wfe diff --git a/bin/thumbv6m-none-eabi.a b/bin/thumbv6m-none-eabi.a index 92076d7..06a7cb7 100644 Binary files a/bin/thumbv6m-none-eabi.a and b/bin/thumbv6m-none-eabi.a differ diff --git a/bin/thumbv7em-none-eabi.a b/bin/thumbv7em-none-eabi.a index a33db85..48da24d 100644 Binary files a/bin/thumbv7em-none-eabi.a and b/bin/thumbv7em-none-eabi.a differ diff --git a/bin/thumbv7em-none-eabihf.a b/bin/thumbv7em-none-eabihf.a index a33db85..48da24d 100644 Binary files a/bin/thumbv7em-none-eabihf.a and b/bin/thumbv7em-none-eabihf.a differ diff --git a/bin/thumbv7m-none-eabi.a b/bin/thumbv7m-none-eabi.a index 5949e33..296f66f 100644 Binary files a/bin/thumbv7m-none-eabi.a and b/bin/thumbv7m-none-eabi.a differ diff --git a/bin/thumbv8m.base-none-eabi.a b/bin/thumbv8m.base-none-eabi.a index 460e342..026250b 100644 Binary files a/bin/thumbv8m.base-none-eabi.a and b/bin/thumbv8m.base-none-eabi.a differ diff --git a/bin/thumbv8m.main-none-eabi.a b/bin/thumbv8m.main-none-eabi.a index 53c510f..6848518 100644 Binary files a/bin/thumbv8m.main-none-eabi.a and b/bin/thumbv8m.main-none-eabi.a differ diff --git a/bin/thumbv8m.main-none-eabihf.a b/bin/thumbv8m.main-none-eabihf.a index 53c510f..6848518 100644 Binary files a/bin/thumbv8m.main-none-eabihf.a and b/bin/thumbv8m.main-none-eabihf.a differ diff --git a/src/asm.rs b/src/asm.rs index 3fe6393..03b649f 100644 --- a/src/asm.rs +++ b/src/asm.rs @@ -91,7 +91,7 @@ pub fn udf() -> ! { #[cfg(all(cortex_m, feature = "inline-asm"))] () => unsafe { asm!("udf" :::: "volatile"); - loop { continue } + core::hint::unreachable_unchecked(); }, #[cfg(all(cortex_m, not(feature = "inline-asm")))] @@ -102,7 +102,7 @@ pub fn udf() -> ! { __udf(); - loop { continue } + core::hint::unreachable_unchecked(); }, #[cfg(not(cortex_m))] -- cgit v1.2.3