aboutsummaryrefslogtreecommitdiff
path: root/cortex-m-rt/src
diff options
context:
space:
mode:
Diffstat (limited to 'cortex-m-rt/src')
-rw-r--r--cortex-m-rt/src/lang_items.rs27
-rw-r--r--cortex-m-rt/src/lib.rs17
2 files changed, 26 insertions, 18 deletions
diff --git a/cortex-m-rt/src/lang_items.rs b/cortex-m-rt/src/lang_items.rs
index 9ff95b5..6b15f99 100644
--- a/cortex-m-rt/src/lang_items.rs
+++ b/cortex-m-rt/src/lang_items.rs
@@ -1,12 +1,7 @@
/// Default panic handler
#[cfg(feature = "abort-on-panic")]
#[lang = "panic_fmt"]
-unsafe extern "C" fn panic_fmt(
- _: ::core::fmt::Arguments,
- _: &'static str,
- _: u32,
- _: u32,
-) -> ! {
+unsafe extern "C" fn panic_fmt(_: ::core::fmt::Arguments, _: &'static str, _: u32, _: u32) -> ! {
::core::intrinsics::abort()
}
@@ -29,12 +24,22 @@ unsafe extern "C" fn panic_fmt(
// has to call `rustc_main`. That's covered by the `reset_handler` function in
// root of this crate.
#[lang = "start"]
-extern "C" fn start(
- main: fn(),
- _argc: isize,
- _argv: *const *const u8,
-) -> isize {
+extern "C" fn start<T>(main: fn() -> T, _argc: isize, _argv: *const *const u8) -> isize
+where
+ T: Termination,
+{
main();
0
}
+
+#[lang = "termination"]
+pub trait Termination {
+ fn report(self) -> i32;
+}
+
+impl Termination for () {
+ fn report(self) -> i32 {
+ 0
+ }
+}
diff --git a/cortex-m-rt/src/lib.rs b/cortex-m-rt/src/lib.rs
index df6640f..9c5e7bf 100644
--- a/cortex-m-rt/src/lib.rs
+++ b/cortex-m-rt/src/lib.rs
@@ -278,8 +278,7 @@
//! }
//! ```
-#![cfg_attr(any(target_arch = "arm", feature = "abort-on-panic"),
- feature(core_intrinsics))]
+#![cfg_attr(any(target_arch = "arm", feature = "abort-on-panic"), feature(core_intrinsics))]
#![deny(missing_docs)]
#![deny(warnings)]
#![feature(asm)]
@@ -291,8 +290,8 @@
#![feature(used)]
#![no_std]
-extern crate cortex_m;
extern crate compiler_builtins;
+extern crate cortex_m;
extern crate r0;
#[cfg(not(test))]
@@ -374,7 +373,8 @@ unsafe extern "C" fn reset_handler() -> ! {
}
#[cfg(target_arch = "arm")]
-global_asm!(r#"
+global_asm!(
+ r#"
.weak NMI
NMI = DEFAULT_HANDLER
@@ -398,13 +398,16 @@ PENDSV = DEFAULT_HANDLER
.weak SYS_TICK
SYS_TICK = DEFAULT_HANDLER
-"#);
+"#
+);
#[cfg(not(armv6m))]
-global_asm!(r#"
+global_asm!(
+ r#"
.weak DEBUG_MONITOR
DEBUG_MONITOR = DEFAULT_HANDLER
-"#);
+"#
+);
#[cfg(target_arch = "arm")]
extern "C" {