summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m32r/m32rsim/start/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/m32r/m32rsim/start/start.S')
-rw-r--r--c/src/lib/libbsp/m32r/m32rsim/start/start.S58
1 files changed, 58 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m32r/m32rsim/start/start.S b/c/src/lib/libbsp/m32r/m32rsim/start/start.S
new file mode 100644
index 0000000000..065e64db79
--- /dev/null
+++ b/c/src/lib/libbsp/m32r/m32rsim/start/start.S
@@ -0,0 +1,58 @@
+/*
+ * From Newlib 1.16.0
+ *
+ * $Id$
+ */
+
+ .text
+ .balign 4
+ .global _start
+_start:
+
+ seth sp, #shigh(_stack)
+ add3 sp, sp, #low(_stack)
+ ldi fp, #0
+
+# Clear the BSS. Do it in two parts for efficiency: longwords first
+# for most of it, then the remaining 0 to 3 bytes.
+
+ seth r2, #shigh(__bss_start)
+ add3 r2, r2, #low(__bss_start); R2 = start of BSS
+ seth r3, #shigh(_end)
+ add3 r3, r3, #low(_end) ; R3 = end of BSS + 1
+
+ sub r3, r2 ; R3 = BSS size in bytes
+ mv r4, r3
+ srli r4, #2 ; R4 = BSS size in longwords (rounded down)
+ ldi r1, #0 ; clear R1 for longword store
+ addi r2, #-4 ; account for pre-inc store
+ beqz r4, .Lendloop1 ; any more to go?
+.Lloop1:
+ st r1, @+r2 ; yep, zero out another longword
+ addi r4, #-1 ; decrement count
+ bnez r4, .Lloop1 ; go do some more
+.Lendloop1:
+ and3 r4, r3, #3 ; get no. of remaining BSS bytes to clear
+ addi r2, #4 ; account for pre-inc store
+ beqz r4, .Lendloop2 ; any more to go?
+.Lloop2:
+ stb r1, @r2 ; yep, zero out another byte
+ addi r2, #1 ; bump address
+ addi r4, #-1 ; decrement count
+ bnez r4, .Lloop2 ; go do some more
+.Lendloop2:
+
+# Run code in the .init section.
+# This will queue the .fini section to be run with atexit.
+
+ # bl __init
+
+# Call main, then exit.
+
+ bl boot_card
+ bl sys_exit
+
+# If that fails just loop.
+
+.Lexit:
+ bra .Lexit