aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cortex-m-rt/asm.s14
-rw-r--r--cortex-m-rt/bin/thumbv6m-none-eabi.abin1218 -> 1490 bytes
-rw-r--r--cortex-m-rt/bin/thumbv7em-none-eabi.abin1198 -> 1434 bytes
-rw-r--r--cortex-m-rt/bin/thumbv7em-none-eabihf.abin1198 -> 1434 bytes
-rw-r--r--cortex-m-rt/bin/thumbv7m-none-eabi.abin1198 -> 1434 bytes
-rw-r--r--cortex-m-rt/bin/thumbv8m.base-none-eabi.abin1222 -> 1494 bytes
-rw-r--r--cortex-m-rt/bin/thumbv8m.main-none-eabi.abin1202 -> 1438 bytes
-rw-r--r--cortex-m-rt/bin/thumbv8m.main-none-eabihf.abin1202 -> 1438 bytes
-rw-r--r--cortex-m-rt/link.x.in4
-rw-r--r--cortex-m-rt/src/lib.rs11
10 files changed, 29 insertions, 0 deletions
diff --git a/cortex-m-rt/asm.s b/cortex-m-rt/asm.s
index 1be4a02..37dedbd 100644
--- a/cortex-m-rt/asm.s
+++ b/cortex-m-rt/asm.s
@@ -40,3 +40,17 @@ FpuTrampoline:
# Hand execution over to `main`.
bl main
# Note: `main` must not return. `bl` is used only because it has a wider range than `b`.
+
+ # ARMv6-M leaves LR in an unknown state on Reset
+ # this trampoline sets LR before it's pushed onto the stack by Reset
+ .section .PreResetTrampoline, "ax"
+ .global PreResetTrampoline
+ # .type and .thumb_func are both required; otherwise its Thumb bit does not
+ # get set and an invalid vector table is generated
+ .type PreResetTrampoline,%function
+ .thumb_func
+PreResetTrampoline:
+ # set LR to the initial value used by the ARMv7-M (0xFFFF_FFFF)
+ ldr r0,=0xffffffff
+ mov lr,r0
+ b Reset
diff --git a/cortex-m-rt/bin/thumbv6m-none-eabi.a b/cortex-m-rt/bin/thumbv6m-none-eabi.a
index 99f1b1a..65684da 100644
--- a/cortex-m-rt/bin/thumbv6m-none-eabi.a
+++ b/cortex-m-rt/bin/thumbv6m-none-eabi.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv7em-none-eabi.a b/cortex-m-rt/bin/thumbv7em-none-eabi.a
index 020b796..c4e1f47 100644
--- a/cortex-m-rt/bin/thumbv7em-none-eabi.a
+++ b/cortex-m-rt/bin/thumbv7em-none-eabi.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv7em-none-eabihf.a b/cortex-m-rt/bin/thumbv7em-none-eabihf.a
index 020b796..c4e1f47 100644
--- a/cortex-m-rt/bin/thumbv7em-none-eabihf.a
+++ b/cortex-m-rt/bin/thumbv7em-none-eabihf.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv7m-none-eabi.a b/cortex-m-rt/bin/thumbv7m-none-eabi.a
index 16ade10..ed96942 100644
--- a/cortex-m-rt/bin/thumbv7m-none-eabi.a
+++ b/cortex-m-rt/bin/thumbv7m-none-eabi.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv8m.base-none-eabi.a b/cortex-m-rt/bin/thumbv8m.base-none-eabi.a
index 264b029..f1c7734 100644
--- a/cortex-m-rt/bin/thumbv8m.base-none-eabi.a
+++ b/cortex-m-rt/bin/thumbv8m.base-none-eabi.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv8m.main-none-eabi.a b/cortex-m-rt/bin/thumbv8m.main-none-eabi.a
index 01b343f..cb216dc 100644
--- a/cortex-m-rt/bin/thumbv8m.main-none-eabi.a
+++ b/cortex-m-rt/bin/thumbv8m.main-none-eabi.a
Binary files differ
diff --git a/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a b/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a
index 01b343f..cb216dc 100644
--- a/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a
+++ b/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a
Binary files differ
diff --git a/cortex-m-rt/link.x.in b/cortex-m-rt/link.x.in
index f5e582e..f4f4959 100644
--- a/cortex-m-rt/link.x.in
+++ b/cortex-m-rt/link.x.in
@@ -85,6 +85,10 @@ SECTIONS
/* ### .text */
.text _stext :
{
+ /* place these 2 close to each other or the `b` instruction will fail to link */
+ *(.PreResetTrampoline);
+ *(.Reset);
+
*(.text .text.*);
*(.HardFaultTrampoline);
*(.HardFault.*);
diff --git a/cortex-m-rt/src/lib.rs b/cortex-m-rt/src/lib.rs
index e2dd667..ab4bc3f 100644
--- a/cortex-m-rt/src/lib.rs
+++ b/cortex-m-rt/src/lib.rs
@@ -923,9 +923,17 @@ pub fn heap_start() -> *mut u32 {
#[doc(hidden)]
#[link_section = ".vector_table.reset_vector"]
#[no_mangle]
+#[cfg(not(armv6m))]
pub static __RESET_VECTOR: unsafe extern "C" fn() -> ! = Reset;
#[doc(hidden)]
+#[link_section = ".vector_table.reset_vector"]
+#[no_mangle]
+#[cfg(armv6m)]
+pub static __RESET_VECTOR: unsafe extern "C" fn() -> ! = PreResetTrampoline;
+
+#[doc(hidden)]
+#[link_section = ".Reset"]
#[no_mangle]
pub unsafe extern "C" fn Reset() -> ! {
extern "C" {
@@ -1030,6 +1038,9 @@ pub enum Exception {
pub use self::Exception as exception;
extern "C" {
+ #[cfg(armv6m)]
+ fn PreResetTrampoline() -> !;
+
fn NonMaskableInt();
fn HardFaultTrampoline();