summaryrefslogtreecommitdiff
path: root/ports/arm11/gnu/example_build/crt0.S
diff options
context:
space:
mode:
authorScott Larson <[email protected]>2020-08-07 17:47:29 -0700
committerScott Larson <[email protected]>2020-08-07 17:47:29 -0700
commit6a018a4cfda937c0d8cbdee761187c5c5843e115 (patch)
treecc9990878ab97ac171a192fe1c2922e752feee99 /ports/arm11/gnu/example_build/crt0.S
parent608f55f0d120886e0eddf7e39cf3c3b6f06bd08c (diff)
add ARM11v6.0.1_rel
Diffstat (limited to 'ports/arm11/gnu/example_build/crt0.S')
-rw-r--r--ports/arm11/gnu/example_build/crt0.S90
1 files changed, 90 insertions, 0 deletions
diff --git a/ports/arm11/gnu/example_build/crt0.S b/ports/arm11/gnu/example_build/crt0.S
new file mode 100644
index 00000000..aa0f3239
--- /dev/null
+++ b/ports/arm11/gnu/example_build/crt0.S
@@ -0,0 +1,90 @@
+
+/* .text is used instead of .section .text so it works with arm-aout too. */
+ .text
+ .code 32
+ .align 0
+
+ .global _mainCRTStartup
+ .global _start
+ .global start
+start:
+_start:
+_mainCRTStartup:
+
+/* Start by setting up a stack */
+ /* Set up the stack pointer to a fixed value */
+ ldr r3, .LC0
+ mov sp, r3
+ /* Setup a default stack-limit in case the code has been
+ compiled with "-mapcs-stack-check". Hard-wiring this value
+ is not ideal, since there is currently no support for
+ checking that the heap and stack have not collided, or that
+ this default 64k is enough for the program being executed.
+ However, it ensures that this simple crt0 world will not
+ immediately cause an overflow event: */
+ sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */
+ mov a2, #0 /* Second arg: fill value */
+ mov fp, a2 /* Null frame pointer */
+ mov r7, a2 /* Null frame pointer for Thumb */
+
+ ldr a1, .LC1 /* First arg: start of memory block */
+ ldr a3, .LC2
+ sub a3, a3, a1 /* Third arg: length of block */
+
+
+
+ bl memset
+ mov r0, #0 /* no arguments */
+ mov r1, #0 /* no argv either */
+#ifdef __USES_INITFINI__
+ /* Some arm/elf targets use the .init and .fini sections
+ to create constructors and destructors, and for these
+ targets we need to call the _init function and arrange
+ for _fini to be called at program exit. */
+ mov r4, r0
+ mov r5, r1
+/* ldr r0, .Lfini */
+ bl atexit
+/* bl init */
+ mov r0, r4
+ mov r1, r5
+#endif
+ bl main
+
+ bl exit /* Should not return. */
+
+
+ /* For Thumb, constants must be after the code since only
+ positive offsets are supported for PC relative addresses. */
+
+ .align 0
+.LC0:
+.LC1:
+ .word __bss_start__
+.LC2:
+ .word __bss_end__
+/*
+#ifdef __USES_INITFINI__
+.Lfini:
+ .word _fini
+#endif */
+ /* Return ... */
+#ifdef __APCS_26__
+ movs pc, lr
+#else
+#ifdef __THUMB_INTERWORK
+ bx lr
+#else
+ mov pc, lr
+#endif
+#endif
+
+
+/* Workspace for Angel calls. */
+ .data
+/* Data returned by monitor SWI. */
+.global __stack_base__
+HeapBase: .word 0
+HeapLimit: .word 0
+__stack_base__: .word 0
+StackLimit: .word 0