aboutsummaryrefslogtreecommitdiff
path: root/src/boot.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot.s')
-rw-r--r--src/boot.s67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/boot.s b/src/boot.s
new file mode 100644
index 0000000..626420c
--- /dev/null
+++ b/src/boot.s
@@ -0,0 +1,67 @@
+.syntax unified
+.thumb
+
+.section .vector_table, "a"
+.word __stack_top /* Initial stack pointer */
+.word _start /* Reset Handler */
+.word _hang /* Non Maskable Interrupts */
+.word _hang /* Hard Fault */
+.word _hang /* Memory Management Fault */
+.word _hang /* Bus Fault */
+.word _hang /* Usage Fault */
+.skip 16 /* Reserved */
+.word _hang /* SVCall */
+.skip 8 /* Reserved */
+.word _hang /* PendSV */
+.word _hang /* SysTick */
+
+
+.text
+.align
+.thumb_func
+_start:
+/* Zero init BSS */
+_bss_init_start:
+ /* BSS section start and end addresses are 4-bytes aligned thanks to the linker script */
+ ldr r0, =__bss_start
+ ldr r1, =__bss_end
+ mov r2, #0
+_bss_init_loop:
+ cmp r0, r1
+ beq _bss_init_end
+ str r2, [r0], #4
+ b _bss_init_loop
+_bss_init_end:
+
+/* Init data section */
+_data_init_start:
+ /* Data section start and end addresses are also 4-bytes aligned */
+ ldr r0, =__data_lma
+ ldr r1, =__data_start
+ ldr r2, =__data_end
+__data_init_loop:
+ cmp r1, r2
+ beq _data_init_end
+ ldr r4, [r0], #4
+ ldr r4, [r1], #4
+ b __data_init_loop
+_data_init_end:
+
+ /* Reset all general purpose registers */
+ mov r0, #0
+ mov r1, #0
+ mov r2, #0
+ mov r3, #0
+ mov r4, #0
+ mov r5, #0
+ mov r6, #0
+ mov r7, #0
+ mov r8, #0
+ mov r9, #0
+ mov r10, #0
+ mov r11, #0
+ mov r12, #0
+ bl main
+
+_hang:
+ b .