diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2012-02-21 22:37:47 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2012-02-21 22:37:47 +0000 |
commit | b07cfbff06094de1a41c6935cbd91ef8b03ebca5 (patch) | |
tree | 6a2a7e50fcaa7cc430e1637ce50fc4b7b4e4dace /libgloss/epiphany/crt0.S | |
parent | 9edde1d2c4430fd79bbf494d5e8cec0359a0b267 (diff) | |
download | cygnal-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.S | 166 |
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 |