source: rtems/c/src/lib/libbsp/powerpc/helas403/dlentry/dlentry.S @ 15c48f4c

4.104.114.84.95
Last change on this file since 15c48f4c was 15c48f4c, checked in by Joel Sherrill <joel.sherrill@…>, on 08/02/00 at 16:30:57

Properly pass argc, argc, and environp to boot_card.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*  dlentry.s
2 *
3 *  This file contains the entry code for RTEMS programs starting
4 *  after download to RAM
5 *
6 *  Author:     Thomas Doerfler <td@imd.m.isar.de>
7 *              IMD Ingenieurbuero fuer Microcomputertechnik
8 *
9 *  COPYRIGHT (c) 1998 by IMD
10 *
11 *  Changes from IMD are covered by the original distributions terms.
12 *  This file has been derived from the papyrus BSP:   
13 *
14 *  This file contains the entry veneer for RTEMS programs
15 *  downloaded to Papyrus.
16 *
17 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
18 *
19 *  COPYRIGHT (c) 1995 by i-cubed ltd.
20 *
21 *  To anyone who acknowledges that this file is provided "AS IS"
22 *  without any express or implied warranty:
23 *      permission to use, copy, modify, and distribute this file
24 *      for any purpose is hereby granted without fee, provided that
25 *      the above copyright notice and this notice appears in all
26 *      copies, and that the name of i-cubed limited not be used in
27 *      advertising or publicity pertaining to distribution of the
28 *      software without specific, written prior permission.
29 *      i-cubed limited makes no representations about the suitability
30 *      of this software for any purpose.
31 *
32 *  $Id$
33 */
34
35#include "asm.h"
36
37/*
38 *  The helas403 ELF link scripts support three special sections:
39 *    .entry    The actual entry point
40 *    .vectors  The section containing the interrupt entry veneers.
41 */
42
43/*
44 *  Downloaded code loads the vectors separately to 0x00000100,
45 *  so .entry can be over 256 bytes.
46 *
47 *  The other sections are linked in the following order:
48 *    .entry
49 *    .text
50 *    .data
51 *    .bss
52 * see linker command file for section placement       
53 *
54 *  The initial stack is set to stack.end
55 *
56 *  All the entry veneer has to do is to clear the BSS.
57 */
58
59/*
60 *  GDB likes to have debugging information for the entry veneer.
61 *  Here was some DWARF information. IMD removed it, because we
62 *  could not check, whether it was still correct. Sorry.
63       
64 */
65                               
66#if PPC_ASM == PPC_ASM_ELF
67        .section .entry
68#else
69        .csect .text[PR]
70#endif
71
72        PUBLIC_VAR (download_entry)
73SYM(download_entry):
74        bl      .startup
75base_addr:     
76
77/*---------------------------------------------------------------------------
78 * Parameters from linker
79 *--------------------------------------------------------------------------*/
80toc_pointer:   
81#if PPC_ASM == PPC_ASM_ELF
82        .long   s.got
83#else
84        .long   TOC[tc0]
85#endif
86bss_length:     
87        .long   bss.size
88bss_addr:       
89        .long   bss.start
90stack_top:
91        .long   stack.end
92/*---------------------------------------------------------------------------
93 * Reset_entry.
94 *--------------------------------------------------------------------------*/
95.startup:
96        /* Get start address, stack grows down from here... */
97        mflr    r1
98
99        /* Assume Bank regs set up..., cache etc. */
100        bl      bssclr
101
102        .extern SYM(__vectors)
103
104        lis     r2,__vectors@h          /* set EVPR exc. vector prefix */
105        mtspr   evpr,r2
106       
107        /*-------------------------------------------------------------------
108         * C_setup.
109         *------------------------------------------------------------------*/
110        lwz     r2,toc_pointer-base_addr(r1)       /* set r2 to toc */
111        lwz     r1,stack_top-base_addr(r1)         /* set r1 to stack_top */
112
113        addi    r1,r1,-56-4              /* start stack at text_addr - 56 */
114        addi    r3,r0,0x0                /* clear r3 */
115        stw     r3, 0(r1)                /* Clear stack chain */
116        stw     r3, 4(r1)
117        stw     r3, 8(r1)
118        stw     r3, 12(r1)
119        lis     r5,environ@ha
120        la      r5,environ@l(r5)        /* environp */
121        li      r4, 0                   /* argv */
122        li      r3, 0                   /* argc */
123        .extern SYM (boot_card)
124        b       SYM (boot_card)          /* call the first C routine */
125
126/*---------------------------------------------------------------------------
127 * bssclr.
128 *--------------------------------------------------------------------------*/
129bssclr:
130        /*-------------------------------------------------------------------
131         * Data move finished, zero out bss.
132         *------------------------------------------------------------------*/
133        lwz     r2,bss_addr-base_addr(r1)   /* start of bss set by loader */
134        lwz     r3,bss_length-base_addr(r1) /* bss length */
135        rlwinm. r3,r3,30,0x3FFFFFFF     /* form length/4 */
136        beqlr                           /* no bss */
137        mtctr   r3                      /* set ctr reg */
138        xor     r6,r6,r6                /* r6 = 0 */
139clear_bss:
140        stswi   r6,r2,0x4               /* store r6 */
141        addi    r2,r2,0x4               /* update r2 */
142        bdnz    clear_bss               /* decrement counter and loop */
143        blr                             /* return */
144.L_text_e:
145
146#if PPC_ABI == PPC_ABI_POWEROPEN
147        DESCRIPTOR (startup)
148#endif
149
150        .comm   environ,4,4
Note: See TracBrowser for help on using the repository browser.