166 lines
4.1 KiB
ArmAsm
166 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
|