summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/shared/start/start.S
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-11-08 10:18:19 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-11-08 10:18:19 +0000
commit4c622e5f4a24f0675840a0463780b03a4d897c1e (patch)
tree98e5a90ad2ec8af0704d98a6e45282f30c8026b3 /c/src/lib/libbsp/arm/shared/start/start.S
parent2011-11-08 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-4c622e5f4a24f0675840a0463780b03a4d897c1e.tar.bz2
2011-11-08 Sebastian Huber <sebastian.huber@embedded-brains.de>
* shared/startup/bsp-start-copy-sections.c, shared/startup/bsp-start-memcpy.S: New files. * shared/include/start.h: Declare bsp_start_copy_sections(). * shared/start/start.S, shared/include/linker-symbols.h: Moved content. Support for ARMv7-M.
Diffstat (limited to 'c/src/lib/libbsp/arm/shared/start/start.S')
-rw-r--r--c/src/lib/libbsp/arm/shared/start/start.S148
1 files changed, 75 insertions, 73 deletions
diff --git a/c/src/lib/libbsp/arm/shared/start/start.S b/c/src/lib/libbsp/arm/shared/start/start.S
index c8e03277aa..2167adc8b5 100644
--- a/c/src/lib/libbsp/arm/shared/start/start.S
+++ b/c/src/lib/libbsp/arm/shared/start/start.S
@@ -5,15 +5,17 @@
*/
/*
- * Copyright (c) 2008
- * Embedded Brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * rtems@embedded-brains.de
+ * Copyright (c) 2008-2011 embedded brains GmbH. All rights reserved.
*
- * The license and distribution terms for this file may be found in the file
- * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
*/
#include <rtems/asm.h>
@@ -21,30 +23,34 @@
#include <rtems/score/cpu.h>
#include <bspopts.h>
+#include <bsp/irq.h>
#include <bsp/linker-symbols.h>
-/* External symbols */
-
-.extern bsp_reset
-.extern boot_card
-.extern bsp_start_hook_0
-.extern bsp_start_hook_1
+ /* External symbols */
+ .extern bsp_reset
+ .extern boot_card
+ .extern bsp_start_hook_0
+ .extern bsp_start_hook_1
-/* Global symbols */
+ /* Global symbols */
+ .globl _start
+ .globl bsp_start_vector_table_begin
+ .globl bsp_start_vector_table_end
+ .globl bsp_start_vector_table_size
+ .globl bsp_vector_table_size
-.globl _start
-.globl bsp_start_memcpy
+ .section ".bsp_start_text", "ax"
-.section ".bsp_start_text", "ax"
+#if defined(ARM_MULTILIB_ARCH_V4)
-.arm
+ .arm
/*
* This is the exception vector table and the pointers to the default
* exceptions handlers.
*/
-vector_block:
+bsp_start_vector_table_begin:
ldr pc, handler_addr_reset
ldr pc, handler_addr_undef
@@ -94,6 +100,8 @@ handler_addr_fiq:
.word reset
+bsp_start_vector_table_end:
+
/* Start entry */
_start:
@@ -169,7 +177,7 @@ bsp_start_hook_0_done:
*/
ldr r0, =bsp_vector_table_begin
- adr r1, vector_block
+ adr r1, bsp_start_vector_table_begin
ldmia r1!, {r2-r9}
stmia r0!, {r2-r9}
ldmia r1!, {r2-r9}
@@ -198,64 +206,58 @@ reset:
SWITCH_FROM_ARM_TO_THUMB r0
b twiddle
-DEFINE_FUNCTION_ARM(bsp_start_memcpy)
+#elif defined(ARM_MULTILIB_ARCH_V7M)
- /* Return if dest == src */
- cmp r0, r1
-#ifdef __thumb__
- bxeq lr
-#else
- moveq pc, lr
-#endif
+ .syntax unified
- /* Return if length is zero */
- mov r3, #0
- cmp r3, r2
-#ifdef __thumb__
- bxeq lr
-#else
- moveq pc, lr
-#endif
+ .extern bsp_stack_main_end
- /* Save non-volatile registers */
- push {r4-r8, lr}
+ .thumb
- /* Copy worker routine to stack */
- adr ip, bsp_start_memcpy_begin
- ldm ip, {r3-r8}
- push {r3-r8}
+bsp_start_vector_table_begin:
- /* Execute worker routine */
- mov r3, #0
- mov ip, sp
- mov lr, pc
-#ifdef __thumb__
- bx ip
-#else
- mov pc, ip
-#endif
+ .word bsp_stack_main_end
+ .word _start /* Reset */
+ .word bsp_reset /* NMI */
+ .word bsp_reset /* Hard Fault */
+ .word bsp_reset /* MPU Fault */
+ .word bsp_reset /* Bus Fault */
+ .word bsp_reset /* Usage Fault */
+ .word bsp_reset /* Reserved */
+ .word bsp_reset /* Reserved */
+ .word bsp_reset /* Reserved */
+ .word bsp_reset /* Reserved */
+ .word bsp_reset /* SVC */
+ .word bsp_reset /* Debug Monitor */
+ .word bsp_reset /* Reserved */
+ .word bsp_reset /* PendSV */
+ .word bsp_reset /* SysTick */
+ .rept BSP_INTERRUPT_VECTOR_MAX + 1
+ .word bsp_reset /* IRQ */
+ .endr
- /* Restore stack and non-volatile registers */
- add sp, sp, #24
- pop {r4-r8, lr}
+bsp_start_vector_table_end:
- /* Return */
-#ifdef __thumb__
- bx lr
-#else
- mov pc, lr
-#endif
+ .thumb_func
-bsp_start_memcpy_begin:
+_start:
- /* Worker routine */
- ldr ip, [r1, r3]
- str ip, [r0, r3]
- add r3, r3, #4
- cmp r3, r2
- bcc bsp_start_memcpy_begin
-#ifdef __thumb__
- bx lr
-#else
- mov pc, lr
-#endif
+ ldr sp, =bsp_stack_main_end
+ ldr lr, =bsp_start_hook_0_done + 1
+ b bsp_start_hook_0
+
+bsp_start_hook_0_done:
+
+ bl bsp_start_hook_1
+ movs r0, #0
+ bl boot_card
+
+twiddle:
+
+ bl bsp_reset
+ b twiddle
+
+#endif /* defined(ARM_MULTILIB_ARCH_V7M) */
+
+ .set bsp_start_vector_table_size, bsp_start_vector_table_end - bsp_start_vector_table_begin
+ .set bsp_vector_table_size, bsp_start_vector_table_size