* rs6000/Makefile.in: Add xilinx support.
        * rs6000/xil-crt0.s: New crt0 file for powerpc-xilinx-eabi.
        * rs6000/xilinx.ld: New file.
        * rs6000/xilinx440.ld: Ditto.
		
	
		
			
				
	
	
		
			193 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*-----------------------------------------------------------------------------
 | |
| //
 | |
| // Copyright (c) 2004, 2009 Xilinx, 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:
 | |
| // 
 | |
| // 1.  Redistributions source code must retain the above copyright notice,
 | |
| // this list of conditions and the following disclaimer. 
 | |
| // 
 | |
| // 2.  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. 
 | |
| // 
 | |
| // 3.  Neither the name of Xilinx 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 HOLDER 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.
 | |
| //
 | |
| //---------------------------------------------------------------------------*/
 | |
| 
 | |
| 	.file	"xil-crt0.S"
 | |
| 	.section ".got2","aw"
 | |
| 	.align	2
 | |
| 
 | |
| .LCTOC1 = . + 32768
 | |
| 
 | |
| .Lsbss_start = .-.LCTOC1
 | |
| 	.long	__sbss_start
 | |
| 
 | |
| .Lsbss_end = .-.LCTOC1
 | |
| 	.long	__sbss_end
 | |
| 
 | |
| .Lbss_start = .-.LCTOC1
 | |
| 	.long	__bss_start
 | |
| 
 | |
| .Lbss_end = .-.LCTOC1
 | |
| 	.long	__bss_end
 | |
| 
 | |
| .Lstack = .-.LCTOC1
 | |
| 	.long	__stack
 | |
| 
 | |
| .Lsda = .-.LCTOC1
 | |
|     .long   _SDA_BASE_                      /* address of the first small data area */
 | |
| 
 | |
| .Lsda2 = .-.LCTOC1
 | |
|     .long   _SDA2_BASE_                     /* address of the second small data area */
 | |
| 
 | |
|     
 | |
| 	.text
 | |
| 	.globl	_start
 | |
| _start:
 | |
|         bl      __cpu_init              /* Initialize the CPU first (BSP provides this) */
 | |
| 
 | |
|     	lis	5,.LCTOC1@h
 | |
| 	ori	5,5,.LCTOC1@l
 | |
| 
 | |
|         lwz     13,.Lsda(5)             /* load r13 with _SDA_BASE_ address */
 | |
|         lwz     2,.Lsda2(5)             /* load r2 with _SDA2_BASE_ address */
 | |
| 
 | |
| #ifndef SIMULATOR
 | |
|         /* clear sbss */
 | |
| 	lwz	6,.Lsbss_start(5)	/* calculate beginning of the SBSS */
 | |
| 	lwz	7,.Lsbss_end(5)		/* calculate end of the SBSS */
 | |
| 
 | |
| 	cmplw	1,6,7
 | |
| 	bc	4,4,.Lenclsbss          /* If no SBSS, no clearing required */
 | |
| 
 | |
|       	li	0,0			/* zero to clear memory */
 | |
|     	subf	8,6,7			/* number of bytes to zero */
 | |
|         srwi.   9,8,2                   /* number of words to zero */
 | |
|         beq     .Lstbyteloopsbss        /* Check if the number of bytes was less than 4 */
 | |
|         mtctr   9        
 | |
| 	addi	6,6,-4			/* adjust so we can use stwu */
 | |
| .Lloopsbss:
 | |
| 	stwu	0,4(6)			/* zero sbss */
 | |
| 	bdnz	.Lloopsbss
 | |
| 
 | |
| .Lstbyteloopsbss:
 | |
|         andi.   9,8,3                   /* Calculate how many trailing bytes we have */
 | |
|         beq     0,.Lenclsbss
 | |
|         mtctr   9
 | |
|         addi    6,6,-1                  /* adjust, so we can use stbu */
 | |
| 
 | |
| .Lbyteloopsbss:  
 | |
|         stbu    0,1(6)
 | |
|         bdnz    .Lbyteloopsbss
 | |
|     
 | |
| .Lenclsbss:  
 | |
| .Lstclbss:
 | |
|     
 | |
| 	/* clear bss */
 | |
| 	lwz	6,.Lbss_start(5)	/* calculate beginning of the BSS */
 | |
| 	lwz	7,.Lbss_end(5)		/* calculate end of the BSS */
 | |
| 
 | |
| 	cmplw	1,6,7
 | |
| 	bc	4,4,.Lenclbss           /* If no BSS, no clearing required */
 | |
| 
 | |
|     	li	0,0			/* zero to clear memory */
 | |
| 	subf	8,6,7			/* number of bytes to zero */
 | |
|         srwi.   9,8,2                   /* number of words to zero */
 | |
|         beq     .Lstbyteloopbss         /* Check if the number of bytes was less than 4 */
 | |
|         mtctr   9
 | |
| 	addi	6,6,-4			/* adjust so we can use stwu */
 | |
| .Lloopbss:
 | |
| 	stwu	0,4(6)			/* zero bss */
 | |
| 	bdnz	.Lloopbss
 | |
| 
 | |
| .Lstbyteloopbss:    
 | |
|         andi.   9,8,3                   /* Calculate how many trailing bytes we have */
 | |
|         beq     0,.Lenclbss             /* If zero, we are done */
 | |
|         mtctr   9
 | |
|         addi    6,6,-1                  /* adjust, so we can use stbu */
 | |
| 
 | |
| .Lbyteloopbss:  
 | |
|         stbu    0,1(6)
 | |
|         bdnz    .Lbyteloopbss
 | |
|     
 | |
| .Lenclbss:
 | |
| #endif /* SIMULATOR */
 | |
| 
 | |
| 	/* set stack pointer */
 | |
| 	lwz	1,.Lstack(5)		/* stack address */
 | |
| 
 | |
| 	/* set up initial stack frame */
 | |
| 	addi	1,1,-8			/* location of back chain */
 | |
| 	lis	0,0
 | |
| 	stw	0,0(1)			/* set end of back chain */
 | |
| 	
 | |
| 	/* initialize base timer to zero */
 | |
| 	mtspr	0x11c,0
 | |
| 	mtspr	0x11d,0
 | |
| 
 | |
| #ifdef HAVE_XFPU    
 | |
| 	/* On the Xilinx PPC405 and PPC440, the MSR
 | |
|            must be explicitly set to mark the prescence
 | |
|            of an FPU */
 | |
| 	mfpvr	0
 | |
| 	rlwinm	0,0,0,12,15
 | |
| 	cmpwi	7,0,8192
 | |
|         mfmsr   0
 | |
|         ori     0,0,8192
 | |
| 	beq-	7,fpu_init_done
 | |
| do_405:
 | |
|         oris    0,0,512
 | |
| fpu_init_done:
 | |
|         mtmsr   0
 | |
| #endif    
 | |
|     
 | |
| #ifdef PROFILING
 | |
| 	/* Setup profiling stuff */
 | |
| 	bl	_profile_init
 | |
| #endif /* PROFILING */
 | |
| 
 | |
| 	/* Call __init */
 | |
| 	bl	__init
 | |
| 
 | |
| 	/* Let her rip */
 | |
| 	bl	main
 | |
| 
 | |
|         /* Invoke the language cleanup functions */        
 | |
|         bl      __fini
 | |
| 
 | |
| #ifdef PROFILING
 | |
| 	/* Cleanup profiling stuff */
 | |
| 	bl	_profile_clean
 | |
| #endif /* PROFILING */
 | |
| 
 | |
| 	/* Call __init */
 | |
|         /* All done */
 | |
| 	bl	exit
 | |
|     
 | |
| /* Trap has been removed for both simulation and hardware */
 | |
| 	.globl _exit
 | |
| _exit:
 | |
| 	b _exit
 | |
| 
 | |
| .Lstart:
 | |
| 	.size	_start,.Lstart-_start
 | |
| 
 |