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
 |