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