diff options
-rw-r--r-- | cortex-m-rt/asm.s | 14 | ||||
-rw-r--r-- | cortex-m-rt/bin/thumbv6m-none-eabi.a | bin | 1218 -> 1490 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv7em-none-eabi.a | bin | 1198 -> 1434 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv7em-none-eabihf.a | bin | 1198 -> 1434 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv7m-none-eabi.a | bin | 1198 -> 1434 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv8m.base-none-eabi.a | bin | 1222 -> 1494 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv8m.main-none-eabi.a | bin | 1202 -> 1438 bytes | |||
-rw-r--r-- | cortex-m-rt/bin/thumbv8m.main-none-eabihf.a | bin | 1202 -> 1438 bytes | |||
-rw-r--r-- | cortex-m-rt/link.x.in | 4 | ||||
-rw-r--r-- | cortex-m-rt/src/lib.rs | 11 |
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 Binary files differindex 99f1b1a..65684da 100644 --- a/cortex-m-rt/bin/thumbv6m-none-eabi.a +++ b/cortex-m-rt/bin/thumbv6m-none-eabi.a diff --git a/cortex-m-rt/bin/thumbv7em-none-eabi.a b/cortex-m-rt/bin/thumbv7em-none-eabi.a Binary files differindex 020b796..c4e1f47 100644 --- a/cortex-m-rt/bin/thumbv7em-none-eabi.a +++ b/cortex-m-rt/bin/thumbv7em-none-eabi.a diff --git a/cortex-m-rt/bin/thumbv7em-none-eabihf.a b/cortex-m-rt/bin/thumbv7em-none-eabihf.a Binary files differindex 020b796..c4e1f47 100644 --- a/cortex-m-rt/bin/thumbv7em-none-eabihf.a +++ b/cortex-m-rt/bin/thumbv7em-none-eabihf.a diff --git a/cortex-m-rt/bin/thumbv7m-none-eabi.a b/cortex-m-rt/bin/thumbv7m-none-eabi.a Binary files differindex 16ade10..ed96942 100644 --- a/cortex-m-rt/bin/thumbv7m-none-eabi.a +++ b/cortex-m-rt/bin/thumbv7m-none-eabi.a diff --git a/cortex-m-rt/bin/thumbv8m.base-none-eabi.a b/cortex-m-rt/bin/thumbv8m.base-none-eabi.a Binary files differindex 264b029..f1c7734 100644 --- a/cortex-m-rt/bin/thumbv8m.base-none-eabi.a +++ b/cortex-m-rt/bin/thumbv8m.base-none-eabi.a diff --git a/cortex-m-rt/bin/thumbv8m.main-none-eabi.a b/cortex-m-rt/bin/thumbv8m.main-none-eabi.a Binary files differindex 01b343f..cb216dc 100644 --- a/cortex-m-rt/bin/thumbv8m.main-none-eabi.a +++ b/cortex-m-rt/bin/thumbv8m.main-none-eabi.a diff --git a/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a b/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a Binary files differindex 01b343f..cb216dc 100644 --- a/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a +++ b/cortex-m-rt/bin/thumbv8m.main-none-eabihf.a 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(); |