newlib/libgloss/epiphany/crt0.S
Jeff Johnston b07cfbff06 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.
2012-02-21 22:37:47 +00:00

167 lines
4.1 KiB
ArmAsm

# 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