summaryrefslogtreecommitdiffstats
path: root/libgloss/epiphany/crt0.S
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2012-02-21 22:37:47 +0000
committerJeff Johnston <jjohnstn@redhat.com>2012-02-21 22:37:47 +0000
commitb07cfbff06094de1a41c6935cbd91ef8b03ebca5 (patch)
tree6a2a7e50fcaa7cc430e1637ce50fc4b7b4e4dace /libgloss/epiphany/crt0.S
parent9edde1d2c4430fd79bbf494d5e8cec0359a0b267 (diff)
downloadcygnal-b07cfbff06094de1a41c6935cbd91ef8b03ebca5.tar.gz
cygnal-b07cfbff06094de1a41c6935cbd91ef8b03ebca5.tar.bz2
cygnal-b07cfbff06094de1a41c6935cbd91ef8b03ebca5.zip
2012-02-21 Jeremy Bennett <jeremy.bennett@embecosm.com>
Alan Lehotsky <apl@alum.mit.edu> Joern Rennecke <joern.rennecke@embecosm.com> * configure.in: Add Epiphany support. * configure: Regenerate. * epiphany: New directory. * libgloss/README: Add Epiphany entry.
Diffstat (limited to 'libgloss/epiphany/crt0.S')
-rw-r--r--libgloss/epiphany/crt0.S166
1 files changed, 166 insertions, 0 deletions
diff --git a/libgloss/epiphany/crt0.S b/libgloss/epiphany/crt0.S
new file mode 100644
index 000000000..d684e1e10
--- /dev/null
+++ b/libgloss/epiphany/crt0.S
@@ -0,0 +1,166 @@
+# C Startup for EPIPHANY
+
+# Copyright (c) 2011, Adapteva, Inc.
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of Adapteva nor the names of its contributors may be
+# used to endorse or promote products derived from this software without
+# specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+
+.section IVT,"a",@progbits ;
+ .global _start;
+ .type _start, %function;
+_start:
+ .balign 4 ;
+ b .normal_start
+
+ .balign 4 ; 0x4
+ b .sw_exception_v
+
+ .balign 4 ; 0x8
+ b .page_miss_v;
+
+ .balign 4 ; 0xc
+ b .timer0_expired_v
+
+ .balign 4 ; 0x10
+ b .timer1_expired_v
+
+ .balign 4 ; 0x14
+ b .message_v
+
+ .balign 4 ; 0x18
+ b .dma0_v
+
+ .balign 4 ; 0x1c
+ b .dma1_v
+
+ .balign 4 ; 0x20
+ b .wand_v
+
+ .balign 4 ; 0x24
+ b .soft_v
+
+.size _start, .-_start
+
+.section RESERVED_CRT0,"a",@progbits ;
+
+.global .normal_start;
+.balign 4
+.type .normal_start, %function
+.normal_start:
+ mov r3,%low(_external_start)
+ movt r3,%high(_external_start)
+ jalr r3
+.size .normal_start, .-.normal_start
+
+
+
+
+.section .text;
+ .org 0x0000 ; Relative to start of text section
+ .global _external_start
+ .type _external_start, %function
+_external_start:
+
+ .align 4
+
+ ;; Initialise the stack pointer and frame pointer. Hopefully __stack
+ ;; is somewhere meaningful.
+ mov sp,%low(___stack)
+ movt sp,%high(___stack)
+ mov fp,sp
+
+ ;; Zero the data space
+ mov r0,%low(___bss_start)
+ movt r0,%high(___bss_start)
+ mov r1,%low(_end)
+ movt r1,%high(_end)
+ mov r2,#0
+ mov r3,#0
+.L0_init_:
+ strd r2,[r0],+#1
+ sub r5,r1,r0
+ bne .L0_init_
+
+ ;; Setup destructors to be called from exit if main never returns
+#if 0
+ mov r0,%low(fini)
+ movt r0,%high(fini)
+ mov r2,%low(_atexit)
+ movt r2,%high(_atexit)
+ jalr r2
+#else
+ ; calling atexit drags in malloc, so instead poke the function
+ ; address directly into the reent structure
+ mov r2,%low(__impure_ptr)
+ movt r2,%high(__impure_ptr)
+ ldr r2,[r2]
+ mov r1,%low(fini)
+ movt r1,%high(fini)
+#ifdef __STRUCT_ALIGN_64__
+#error
+ add r2,r2,need_to_find_out; &_GLOBAL_REENT->atexit0
+ str r2, [r2,-1];??or -2?; _GLOBAL_REENT->atexit
+ mov r0, 1
+ str r0, [r2,1] ; _GLOBAL_REENT->atexit0._ind
+ str r1, [r2,2] ; _GLOBAL_REENT->atexit0._fns[0]
+#else /* !__STRUCT_ALIGN_64__ */
+ add r0,r2,0x14c ; &_GLOBAL_REENT->atexit0
+ str r0, [r0,-1] ; _GLOBAL_REENT->atexit
+ mov r0, 1
+ strd r0, [r2,0x2a] ; _GLOBAL_REENT->atexit0._ind
+#endif /* !__STRUCT_ALIGN_64__ */
+#endif /* !0 */
+ ;; Call global and static constructors
+ mov r2,%low(init)
+ movt r2,%high(init)
+ jalr r2
+
+
+ ;;return from reset ISR
+ mov R0,%low(RDS)
+ movt R0,%high(RDS)
+ movts iret,r0
+ rti
+RDS:
+
+ ;; Initialise argc, argv and envp to empty and call main
+ mov r0,#0
+ mov r1,#0
+ mov r2,#0
+ mov r3,%low(_main)
+ movt r3,%high(_main)
+ jalr r3
+ ;;bl _main
+
+ ;; Call exit
+ mov r3,%low(_exit)
+ movt r3,%high(_exit)
+ jalr r3
+ ;;bl _exit
+
+ ;; Should never reach here
+ idle
+
+.size _external_start, .-_external_start