diff --git a/link.x.in b/link.x.in index b9436ca6..3d71811e 100644 --- a/link.x.in +++ b/link.x.in @@ -45,8 +45,8 @@ PROVIDE(DebugMonitor = DefaultHandler); PROVIDE(PendSV = DefaultHandler); PROVIDE(SysTick = DefaultHandler); -PROVIDE(DefaultHandler = EndlessLoop); -PROVIDE(UserHardFault = EndlessLoop); +PROVIDE(DefaultHandler = DefaultHandler_); +PROVIDE(UserHardFault = UserHardFault_); /* # Interrupt vectors */ EXTERN(__INTERRUPTS); /* `static` variable similar to `__EXCEPTIONS` */ diff --git a/src/lib.rs b/src/lib.rs index 3c2dd897..599ae06d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -530,9 +530,20 @@ pub unsafe extern "C" fn Reset() -> ! { } } +#[allow(unused_variables)] #[doc(hidden)] #[no_mangle] -pub unsafe extern "C" fn EndlessLoop() -> ! { +pub unsafe extern "C" fn UserHardFault_(ef: &ExceptionFrame) -> ! { + loop { + // add some side effect to prevent this from turning into a UDF instruction + // see rust-lang/rust#28728 for details + atomic::compiler_fence(Ordering::SeqCst); + } +} + +#[doc(hidden)] +#[no_mangle] +pub unsafe extern "C" fn DefaultHandler_() -> ! { loop { // add some side effect to prevent this from turning into a UDF instruction // see rust-lang/rust#28728 for details