source: rtems/c/src/lib/libbsp/powerpc/mbx8xx/startup/start.S @ 182712f7

4.104.114.84.95
Last change on this file since 182712f7 was 182712f7, checked in by Joel Sherrill <joel.sherrill@…>, on Oct 12, 2001 at 9:07:01 PM

2001-10-12 Joel Sherrill <joel@…>

  • clock/p_clock.c, include/bsp.h, include/coverhd.h, startup/bspstart.c, startup/bspstart.c.nocache, startup/setvec.c, startup/start.S: Fixed typo.
  • Property mode set to 100644
File size: 8.9 KB
Line 
1/*  start.S
2 *
3 *  This file contains the entry veneer for RTEMS programs
4 *  on the MBX8xx board.
5 *  It jumps to the BSP which is responsible for performing
6 *  all remaining initialization.
7 *
8 * This file is based on several others:
9 *
10 * (1) start360.s from the gen68360 BSP by
11 *     W. Eric Norum (eric@skatter.usask.ca)
12 *     with the following copyright and license:
13 *
14 *     COPYRIGHT (c) 1989-1998.
15 *     On-Line Applications Research Corporation (OAR).
16 *     
17 *     The license and distribution terms for this file may in
18 *     the file LICENSE in this distribution or at
19 *     http://www.OARcorp.com/rtems/license.html.
20 *
21 * (2) start.s for the eth_comm port by
22 *     Jay Monkman (jmonkman@fracsa.com),
23 *     which itself is based on the
24 *
25 * (3) dlentry.s for the Papyrus BSP, written by:
26 *     Andrew Bray <andy@i-cubed.co.uk>
27 *     with the following copyright and license:
28 *
29 *     COPYRIGHT (c) 1995 by i-cubed ltd.
30 *     
31 * (4) start860.S for the MBX821/MBX860, written by:
32 *     Darlene A. Stewart <darlene.stewart@iit.nrc.ca>
33 *     Copyright (c) 1999, National Research Council of Canada
34 *
35 *     To anyone who acknowledges that this file is provided "AS IS"
36 *     without any express or implied warranty:
37 *         permission to use, copy, modify, and distribute this file
38 *         for any purpose is hereby granted without fee, provided that
39 *         the above copyright notice and this notice appears in all
40 *         copies, and that the name of i-cubed limited not be used in
41 *         advertising or publicity pertaining to distribution of the
42 *         software without specific, written prior permission.
43 *         i-cubed limited makes no representations about the suitability
44 *         of this software for any purpose.
45 *
46 * Modifications (for MBX8xx) of respective RTEMS files:
47 * Copyright (c) 1999, National Research Council of Canada
48 */
49
50#include "asm.h"
51
52/*
53 *  The initial stack is set to run BELOW the code base address.
54 *  (between the vectors and text sections)
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 *  Play compiler and provide some DWARF information.
62 *
63 *  CHANGE TO SUIT YOUR SETUP!
64 */
65
66        .section .entry,"ax",@progbits
67.L_text_b:
68.L_LC1:
69        .previous
70
71.section        .debug_sfnames
72.L_sfnames_b:
73        .byte "rtems/c/src/lib/libbsp/powerpc/mbx8xx/startup/"
74        .byte 0
75.L_F0:
76        .byte "start.S"
77        .byte 0
78        .previous
79
80.section        .line
81.L_line_b:
82        .4byte  .L_line_e-.L_line_b
83        .4byte  .L_text_b
84.L_LE1:
85.L_line_last:
86        .4byte  0x0
87        .2byte  0xffff
88        .4byte  .L_text_e-.L_text_b
89.L_line_e:
90        .previous
91
92.section        .debug_srcinfo
93.L_srcinfo_b:
94        .4byte  .L_line_b
95        .4byte  .L_sfnames_b
96        .4byte  .L_text_b
97        .4byte  .L_text_e
98        .4byte  0xffffffff
99        .4byte  .L_LE1-.L_line_b
100        .4byte  .L_F0-.L_sfnames_b
101        .4byte  .L_line_last-.L_line_b
102        .4byte  0xffffffff
103        .previous
104
105.section        .debug_pubnames
106        .4byte  .L_debug_b
107        .4byte  .L_P0
108        .byte "start"
109        .byte 0
110        .4byte  0x0
111        .byte 0
112        .previous
113
114.section        .debug_aranges
115        .4byte  .L_debug_b
116        .4byte  .L_text_b
117        .4byte  .L_text_e-.L_text_b
118        .4byte  0
119        .4byte  0
120        .4byte  0
121        .4byte  0
122        .4byte  0
123        .4byte  0
124        .4byte  0x0
125        .4byte  0x0
126        .previous
127
128.section        .debug
129.L_debug_b:
130.L_D1:
131        .4byte  .L_D1_e-.L_D1
132        .2byte  0x11    /* TAG_compile_unit */
133        .2byte  0x12    /* AT_sibling */
134        .4byte  .L_D2
135        .2byte  0x38    /* AT_name */
136        .byte "start.S"
137        .byte 0
138        .2byte  0x258   /* AT_producer */
139        .byte "GAS 2.5.2"
140        .byte 0
141        .2byte  0x111   /* AT_low_pc */
142        .4byte  .L_text_b
143        .2byte  0x121   /* AT_high_pc */
144        .4byte  .L_text_e
145        .2byte  0x106   /* AT_stmt_list */
146        .4byte  .L_line_b
147        .2byte  0x1b8   /* AT_comp_dir */
148        .byte "rtems/c/src/lib/libbsp/powerpc/mbx8xx/startup/"
149        .byte 0
150        .2byte  0x8006  /* AT_sf_names */
151        .4byte  .L_sfnames_b
152        .2byte  0x8016  /* AT_src_info */
153        .4byte  .L_srcinfo_b
154.L_D1_e:
155.L_P0:
156.L_D3:
157        .4byte  .L_D3_e-.L_D3
158        .2byte  0x6     /* TAG_global_subroutine */
159        .2byte  0x12    /* AT_sibling */
160        .4byte  .L_D4
161        .2byte  0x38    /* AT_name */
162        .byte "start"
163        .byte 0
164        .2byte  0x278   /* AT_prototyped */
165        .byte 0
166        .2byte  0x111   /* AT_low_pc */
167        .4byte  .L_text_b
168        .2byte  0x121   /* AT_high_pc */
169        .4byte  .L_text_e
170        .2byte  0x8041  /* AT_body_begin */
171        .4byte  .L_text_b
172        .2byte  0x8051  /* AT_body_end */
173        .4byte  .L_text_e
174.L_D3_e:
175
176.L_D4:
177        .4byte  .L_D4_e-.L_D4
178        .align 2
179.L_D4_e:
180.L_D2:
181        .previous
182       
183/*
184 * Tell C's eabi-ctor's that we have an atexit function,
185 * and that it is to register __do_global_dtors.
186 */
187        EXTERN_PROC(atexit)
188        PUBLIC_VAR(__atexit)
189        .section ".sdata","aw"
190        .align  2
191SYM(__atexit):                 
192        EXT_PROC_REF(atexit)@fixup
193        .previous
194
195        .section ".fixup","aw"
196        .align  2
197        EXT_SYM_REF(__atexit)
198        .previous
199
200/* That should do it */
201                       
202/*
203 *  Put the entry point in its own section. That way, we can guarantee
204 *  to put it first in the .text section in the linker script.
205 */
206        .section .entry
207
208        PUBLIC_VAR (start)
209SYM(start):
210        bl      .startup        /* or bl .spin */
211base_addr:     
212
213/*
214 * Parameters from linker
215 */
216toc_pointer:   
217        .long   __GOT_START__
218bss_length:     
219        .long   bss.size
220bss_addr:       
221        .long   bss.start
222
223PUBLIC_VAR (text_addr)
224text_addr:
225        .long   text.start
226
227PUBLIC_VAR (text_length)
228text_length:
229        .long   text.size
230
231/*
232 * Spin, if necessary, to acquire control from debugger (CodeWarrior).
233 */     
234spin:
235        .long   0x0001
236.spin:
237        lis     r3, spin@ha
238        lwz     r3, spin@l(r3)
239        cmpwi   r3, 0x1
240        beq     .spin
241/*     
242 * #define LOADED_BY_EPPCBUG
243 */
244#define LOADED_BY_EPPCBUG
245#define EARLY_CONSOLE           
246/*
247 * Initialization code
248 */
249.startup:       
250        /* Get the start address. */
251        mflr    r1
252#ifdef LOADED_BY_EPPCBUG       
253        /* Save pointer to residual/board data */
254        lis     r9,eppcbugInfo@ha
255        stw     r3,eppcbugInfo@l(r9)
256#endif 
257        /* Initialize essential registers. */
258        bl      initregs
259        nop
260
261        /*
262         * C_setup.
263         */
264
265        /* set toc */
266        lwz r2, toc_pointer-base_addr(r1)
267
268        /* Set up stack pointer = beginning of text section - 56 */
269        addi    r1, r1, -56-4
270
271        /* Initialize the memory mapped MPC821 registers (done in C). */
272        EXTERN_PROC (_InitMBX8xx)
273        bl      PROC (_InitMBX8xx)
274        nop
275       
276        /* Clear the bss section. */
277        bl      bssclr
278        nop
279#if defined(EARLY_CONSOLE) && defined(LOADED_BY_EPPCBUG)
280        EXTERN_PROC (serial_init)
281        bl      PROC (serial_init)
282#endif 
283        lis     r5,environ@ha
284        la      r5,environ@l(r5)                /* environp */
285        /* clear argc and argv */
286        xor     r3, r3, r3
287        xor     r4, r4, r4
288       
289        EXTERN_PROC (boot_card)
290        bl       PROC (boot_card)       /* call the first C routine */
291        nop
292       
293        /* we should never return from boot_card, but in case we do ... */
294        /* The next instructions are dependent on your runtime environment */
295
296        /* Return to EPPCBug */
297        lis     r10, 0x0400             /* Data cache disable */
298        mtspr   568, r10
299        isync
300               
301        mtspr   560, r10                /* Instruction cache disable */
302        isync
303               
304stop_here:
305        li      r10, 0x0F00             /* .RETURN */
306        sc
307       
308        b       stop_here
309        nop
310
311/*
312 * bssclr - zero out bss
313 */
314bssclr:
315        lis     r3, base_addr@ha
316        addi    r3, r3, base_addr@l
317        lwz     r4, bss_addr-base_addr(r3)      /* Start of bss */
318        lwz     r5, bss_length-base_addr(r3)    /* Length of bss */
319
320        rlwinm. r5,r5,30,0x3FFFFFFF             /* form length/4 */
321        beqlr                                   /* no bss - return */
322        mtctr   r5                              /* set ctr reg */
323       
324        li      r5,0x0000                       /* r5 = 0 */
325clear_bss:
326        stw     r5,0(r4)                        /* store r6 */
327        addi    r4,r4,0x4                       /* update r4 */
328        bdnz    clear_bss                       /* dec counter and loop */
329       
330        blr                                     /* return */
331
332/*
333 * initregs
334 *      Initialize the MSR and basic core PowerPC registers
335 *
336 * Register usage:
337 *      r0 - scratch
338 */
339initregs:
340        /*       
341         * Disable address translation. We should already be running in real space,
342         * so this should be a no-op, i.e. no need to switch instruction stream
343         * addresses from virtual space to real space. Other bits set the processor
344         * for big-endian mode, exceptions vectored to 0x000n_nnnn (vectors are
345         * already in low memory!), no execution tracing, machine check exceptions
346         * enabled, floating-point not available (MPC8xx has none), supervisor
347         * priviledge level, external interrupts disabled, power management
348         * disabled (normal operation mode).
349         */
350        li      r0, 0x1000      /* MSR_ME */
351        mtmsr   r0              /* Context-synchronizing */
352        isync
353       
354        /*
355         * Clear the exception handling registers.
356         * Note SPRG3 is reserved for use by EPPCBug on the MBX8xx.
357         */     
358        li      r0, 0x0000
359        mtdar   r0
360        mtspr   sprg0, r0
361        mtspr   sprg1, r0
362        mtspr   sprg2, r0
363        mtspr   srr0, r0
364        mtspr   srr1, r0
365                       
366        mr      r6, r0
367        mr      r7, r0
368        mr      r8, r0
369        mr      r9, r0
370        mr      r10, r0
371        mr      r11, r0
372        mr      r12, r0
373        mr      r13, r0
374        mr      r14, r0
375        mr      r15, r0
376        mr      r16, r0
377        mr      r17, r0
378        mr      r18, r0
379        mr      r19, r0
380        mr      r20, r0
381        mr      r21, r0
382        mr      r22, r0
383        mr      r23, r0
384        mr      r24, r0
385        mr      r25, r0
386        mr      r26, r0
387        mr      r27, r0
388        mr      r28, r0
389        mr      r29, r0
390        mr      r30, r0
391        mr      r31, r0
392       
393        blr                     /* return */
394       
395.L_text_e:
396
397        .comm   environ,4,4
Note: See TracBrowser for help on using the repository browser.