common: Implement jump_to_application().
[gps-watch.git] / src / common / startup.c
index daa8906c38f1c36fa7f8127095772bf2cc168791..0a5507ac9a0524264d062447b3d9047693fc2501 100644 (file)
@@ -150,3 +150,17 @@ Dummy_Handler (void)
        for (;;) {
        }
 }
+
+void
+jump_to_application (volatile uint32_t *address)
+{
+       volatile uint32_t *vtor = (uint32_t *) 0xe000ed08;
+       *vtor = (uint32_t) address;
+
+       asm volatile ("" ::: "memory");
+       asm volatile ("msr msp, %0" :: "r" (*(address + 0)) : "sp");
+       asm volatile ("bx %0" :: "r" (*(address + 1)));
+
+       for (;;) {
+       }
+}