summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/eth_comm/start/start.S
blob: 288b7f3cd9f5c4e2bfb3b417bfbe47602352d7d4 (plain) (tree)



























                                                                      
                      











                                                                 
  






                                                                 
  





                                                                     
                                                                          





                                                                     
          



                         
            
                     
           
                        
         











                          
                      



                               
 


                                   
  


































                                                                         



                                                      
                               


                                                                               

















                                                                          

                           
/*  dlentry.s
 *
 *  $Id$
 *
 *  This file contains the entry veneer for RTEMS programs
 *  downloaded to the eth-comm board.
 *
 * This file was written by Jay Monkman (jmonkman@fracsa.com)
 * It was based on the dlentry.s file for the Papyrus BSP,
 * written by:
 *
 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
 *
 *  COPYRIGHT (c) 1995 by i-cubed ltd.
 *
 *  To anyone who acknowledges that this file is provided "AS IS"
 *  without any express or implied warranty:
 *      permission to use, copy, modify, and distribute this file
 *      for any purpose is hereby granted without fee, provided that
 *      the above copyright notice and this notice appears in all
 *      copies, and that the name of i-cubed limited not be used in
 *      advertising or publicity pertaining to distribution of the
 *      software without specific, written prior permission.
 *      i-cubed limited makes no representations about the suitability
 *      of this software for any purpose.
 *
 */

#include <rtems/asm.h>

/*
 *  The initial stack is set to run BELOW the code base address.
 *  (between the vectors and text sections)
 *
 *  All the entry veneer has to do is to clear the BSS.
 */

/*
 *  GDB likes to have debugging information for the entry veneer.
 *  Here is some DWARF information.
 */
/*
 * There was some debugging info here, but I removed it because I
 * couldn't get it to work. It isn't really necessary as far as I
 * can tell. It should still be in the papyrus BSP. -Jay
 */



/*
 * On entry to download_entry, R3 will hold a pointer to a Board Info
 *  Block (boardinfo_t). This should be copied as soon as possible
 *  to the global M860_binfo. (The block should be copied, _NOT_
 *  the pointer)
 */

        .section ".entry"  /* This might have to be the first thing in the
                            * text section. At one time, it had to be
                            * first, but I don't believe it is true
                            * andy more. */
        PUBLIC_VAR (start)
SYM(start):
        bl      .startup
base_addr:

/*
 * Parameters from linker
 */
toc_pointer:
        .long   s.got
bss_length:
        .long   bss.size
bss_addr:
        .long   bss.start

PUBLIC_VAR (text_addr)
text_addr:
        .long   text.start

PUBLIC_VAR (text_length)
text_length:
        .long   text.size


/*
 * Initialization code
 */
.startup:
        /* Get start address */
        mflr    r1

        /* clear the bss section */
        bl      bssclr

/*
 * Copy the Board Info Block
 */
        .extern SYM(M860_binfo)
        lis     r6, SYM(M860_binfo)@ha
        addi    r6, r6, SYM(M860_binfo)@l

        lhz     r4, 0(r3)                /* Load the size of the block */
        rlwinm. r4, r4, 30, 0x3fffffff   /* get number of words */

        mtctr   r4

cpy_b:  lwz     r5, 0(r3)                /* In with the old ...  */
        stw     r5, 0(r6)                /* ... Out with the new */
        addi    r6, r6, 0x4              /* Go to the next word */
        addi    r3, r3, 0x4
        bdnz    cpy_b                    /* decrement counter and loop */

/*
 * C_setup.
 */

        /* set toc */
        lwz r2, toc_pointer-base_addr(r1)

        /* Set up stack pointer = beginning of text section - 56 */
        addi    r1, r1, -56-4

        lis     r9, 0xff00
        addi    r10, 0, -16384
        sth     r10, 0x950(r9)

        lis     r9, 0x0000
        addi    r9, r9, 0x0007
        mtspr   0x9e, r9

        lis	r5,environ@ha
        la	r5,environ@l(r5)	/* environp */
	li	r4, 0			/* argv */
	li	r3, 0			/* argc */
        .extern SYM (boot_card)
        bl      SYM (boot_card)                  /* call the first C routine */
loopstop:
        b       loopstop

/*
 * bssclr - zero out bss
 */
bssclr:
        lwz     r4, bss_addr-base_addr(r1)      /* Start of bss */
        lwz     r5, bss_length-base_addr(r1)    /* Length of bss */

        rlwinm. r5,r5,30,0x3FFFFFFF             /* form length/4 */
        beqlr                                   /* no bss */
        mtctr   r5                              /* set ctr reg */
        xor     r6,r6,r6                        /* r6 = 0 */
clear_bss:
        stswi   r6,r4,0x4                       /* store r6 */
        addi    r4,r4,0x4                       /* update r2 */

        bdnz    clear_bss                       /* dec counter and loop */
        blr                                     /* return */

	.comm	environ,4,4