summaryrefslogtreecommitdiff
path: root/src/boot/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot/crt0.S')
-rw-r--r--src/boot/crt0.S40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/boot/crt0.S b/src/boot/crt0.S
new file mode 100644
index 0000000..7935a6e
--- /dev/null
+++ b/src/boot/crt0.S
@@ -0,0 +1,40 @@
+ .section .crt0, "ax"
+
+// Load data segment to SRAM
+ ldr r0, =__data_src__
+ ldr r1, =__data_dst__
+ ldr r2, =__data_size__
+ mov r3, #0
+data_seg_start:
+ cmp r2, #0
+ beq data_seg_end
+ ldrb r3, [r0]
+ strb r3, [r1]
+ add r0, #1
+ add r1, #1
+ sub r2, #1
+ b data_seg_start
+data_seg_end:
+
+// Init bss in SRAM
+ ldr r0, =__bss_start__
+ ldr r1, =__bss_size__
+ mov r2, #0
+bss_init_start:
+ cmp r1, #0
+ beq bss_init_end
+ strb r2, [r0]
+ add r0, #1
+ sub r1, #1
+ b bss_init_start
+bss_init_end:
+
+ // Setup stack
+ ldr r0, =SRAM_END
+ mov sp, r0
+
+ // Start kernel
+ ldr r0, =main
+ blx r0
+
+ .set SRAM_END, 0x20042000