source: rtems/c/src/lib/libbsp/powerpc/virtex/dlentry/dlentry.S @ 862c2317

4.104.114.84.95
Last change on this file since 862c2317 was 862c2317, checked in by Thomas Doerfler <Thomas.Doerfler@…>, on 07/04/07 at 12:37:36

added virtex BSP support and some missing files for common PPC
exception handling

  • Property mode set to 100644
File size: 4.8 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 *  derived from "helas403/dlentry.S":
35 *  Id: dlentry.S,v 1.2 2000/08/02 16:30:57 joel Exp
36 */
37
38#include <rtems/asm.h>
39
40/*
41 *  The virtex ELF link scripts support three special sections:
42 *    .entry    The actual entry point
43 *    .vectors  The section containing the interrupt entry veneers.
44 */
45
46/*
47 *  Downloaded code loads the vectors separately to 0x00000100,
48 *  so .entry can be over 256 bytes.
49 *
50 *  The other sections are linked in the following order:
51 *    .entry
52 *    .text
53 *    .data
54 *    .bss
55 * see linker command file for section placement
56 *
57 *  The initial stack is set to stack.end
58 *
59 *  All the entry veneer has to do is to clear the BSS.
60 */
61
62/*
63 *  GDB likes to have debugging information for the entry veneer.
64 *  Here was some DWARF information. IMD removed it, because we
65 *  could not check, whether it was still correct. Sorry.
66
67 */
68
69        .section .entry
70
71        PUBLIC_VAR (start)
72        PUBLIC_VAR (download_entry)
73        PUBLIC_VAR (__rtems_entry_point)
74SYM(start):
75SYM(download_entry):
76SYM(__rtems_entry_point):
77        bl      .startup
78base_addr:
79
80/*---------------------------------------------------------------------------
81 * Parameters from linker
82 *--------------------------------------------------------------------------*/
83toc_pointer:
84        .long   s.got
85bss_length:
86        .long   bss.size
87bss_addr:
88        .long   bss.start
89stack_top:
90        .long   stack.end
91PUBLIC_VAR (text_addr)
92text_addr:
93        .long   text.start
94
95PUBLIC_VAR (text_length)
96text_length:
97        .long   text.size
98/*---------------------------------------------------------------------------
99 * Reset_entry.
100 *--------------------------------------------------------------------------*/
101.startup:
102        /* Get start address, stack grows down from here... */
103        mflr    r1
104
105        /* Assume Bank regs set up..., cache etc. */
106        bl      bssclr
107
108#if 0
109        .extern SYM(__vectors)
110
111        lis     r2,__vectors@h          /* set EVPR exc. vector prefix */
112#else
113        lis     r2,0
114#endif         
115        mtspr   evpr,r2
116
117        /*-------------------------------------------------------------------
118         * C_setup.
119         *------------------------------------------------------------------*/
120        lwz     r2,toc_pointer-base_addr(r1)       /* set r2 to toc */
121        lwz     r1,stack_top-base_addr(r1)         /* set r1 to stack_top */
122
123        addi    r1,r1,-56-4              /* start stack at text_addr - 56 */
124        addi    r3,r0,0x0                /* clear r3 */
125        stw     r3, 0(r1)                /* Clear stack chain */
126        stw     r3, 4(r1)
127        stw     r3, 8(r1)
128        stw     r3, 12(r1)
129        lis     r5,environ@ha
130        la      r5,environ@l(r5)        /* environp */
131        li      r4, 0                   /* argv */
132        li      r3, 0                   /* argc */
133        .extern SYM (boot_card)
134        b       SYM (boot_card)          /* call the first C routine */
135
136/*---------------------------------------------------------------------------
137 * bssclr.
138 *--------------------------------------------------------------------------*/
139bssclr:
140        /*-------------------------------------------------------------------
141         * Data move finished, zero out bss.
142         *------------------------------------------------------------------*/
143        lwz     r2,bss_addr-base_addr(r1)   /* start of bss set by loader */
144        lwz     r3,bss_length-base_addr(r1) /* bss length */
145        rlwinm. r3,r3,30,0x3FFFFFFF     /* form length/4 */
146        beqlr                           /* no bss */
147        mtctr   r3                      /* set ctr reg */
148        xor     r6,r6,r6                /* r6 = 0 */
149clear_bss:
150        stswi   r6,r2,0x4               /* store r6 */
151        addi    r2,r2,0x4               /* update r2 */
152        bdnz    clear_bss               /* decrement counter and loop */
153        blr                             /* return */
154.L_text_e:
155
156        .comm   environ,4,4
Note: See TracBrowser for help on using the repository browser.