source: rtems/c/src/lib/libbsp/powerpc/mvme5500/start/start.S @ 1768b06

4.104.114.84.95
Last change on this file since 1768b06 was 1768b06, checked in by Ralf Corsepius <ralf.corsepius@…>, on 10/21/04 at 08:25:39

Misc. adaptations to rtems-4.7.

  • Property mode set to 100644
File size: 4.5 KB
RevLine 
[7be6ad9]1/*
2 *  start.S :     RTEMS entry point
3 *
4 *  Copyright (C) 1999 Eric Valette. valette@crf.canon.fr
5 *
6 *  S. Kate Feng <feng1@bnl.gov>, April 2004
7 *  Mapped the 2nd 256MB of RAM to support the MVME5500 boards.
8 *
9 *  The license and distribution terms for this file may be
10 *  found in the file LICENSE in this distribution or at
11 *  http://www.rtems.com/license/LICENSE.
12 *
13 *
14 */
15
[1768b06]16#include <rtems/asm.h>
[7be6ad9]17#include <rtems/score/cpu.h>
18#include <libcpu/io.h>
19
20#define SYNC \
21        sync; \
22        isync
23
24#define KERNELBASE      0x0
25#define MEM256MB        0x10000000
26       
27#define MONITOR_ENTER                   \
28        mfmsr   r10             ;       \
29        ori     r10,r10,MSR_IP  ;       \
30        mtmsr   r10             ;       \
31        li      r10,0x63        ;       \
32        sc
33
34               
35        .text
36        .globl  __rtems_entry_point
37        .type   __rtems_entry_point,@function
38__rtems_entry_point:
39#ifdef DEBUG_EARLY_START
40        MONITOR_ENTER
41#endif 
42               
43/*
44 * PREP
45 * This is jumped to on prep systems right after the kernel is relocated
46 * to its proper place in memory by the boot loader.  The expected layout
47 * of the regs is:     
48 *   r3: ptr to residual data
49 *   r4: initrd_start or if no initrd then 0
50 *   r5: initrd_end - unused if r4 is 0
51 *   r6: Start of command line string
52 *   r7: End of command line string
53 *
54 *   The Prep boot loader insure that the MMU is currently off...
55 *
56 */
57       
58        mr      r31,r3                  /* save parameters */
59        mr      r30,r4
60        mr      r29,r5
61        mr      r28,r6
62        mr      r27,r7
63        /*
64         * Make sure we have nothing in BATS and TLB
65         */
66        bl      clear_bats
67        bl      flush_tlbs
68/*
69 * Use the first pair of BAT registers to map the 1st 256MB
70 * of RAM to KERNELBASE.
71 */
72        lis     r11,KERNELBASE@h
73        ori     r11,r11,0x1ffe          /* set up BAT0 registers for 604+ */
74        li      r8,2                    /* R/W access */
75        isync
76        mtspr   DBAT0L,r8               /* N.B. 6xx (not 601) have valid */
77        mtspr   DBAT0U,r11              /* bit in upper BAT register */
78        mtspr   IBAT0L,r8
79        mtspr   IBAT0U,r11
80        isync
81/*
82 * Use the 2nd pair of BAT registers to map the 2nd 256MB
83 * of RAM to 0x10000000. <SKF>
84 */
85        lis     r11,MEM256MB@h
86        ori     r11,r11,0x1ffe          /* set up BAT1 registers for 604+ */
87        lis     r8,MEM256MB@h
88        ori     r8,r8,2
89        isync
90        mtspr   DBAT1L,r8               /* N.B. 6xx (not 601) have valid */
91        mtspr   DBAT1U,r11              /* bit in upper BAT register */
92        mtspr   IBAT1L,r8
93        mtspr   IBAT1U,r11     
94        isync
95
96/*
97 * we now have the two 256M of ram mapped with the bats. We are still
98 * running on the bootloader stack and cannot switch to an RTEMS allocated
99 * init stack before copying the residual data that may have been set just
100 * after rtems_end address. This bug has been experienced on MVME2304. Thank
101 * to Till Straumann <strauman@SLAC.Stanford.EDU> for hunting it and
102 * suggesting the appropriate code.
103 */
104       
105enter_C_code:
106        bl      MMUon
107        bl  __eabi      /* setup EABI and SYSV environment */
108        bl      zero_bss
109        /*
110         * restore prep boot params
111         */
112        mr      r3,r31
113        mr      r4,r30
114        mr      r5,r29
115        mr      r6,r28
116        mr      r7,r27
117        bl      save_boot_params
118        /*
119         * stack = &__rtems_end + 4096
120         */
121        addis   r9,r0, __rtems_end+(4096-CPU_MINIMUM_STACK_FRAME_SIZE)@ha
122        addi    r9,r9, __rtems_end+(4096-CPU_MINIMUM_STACK_FRAME_SIZE)@l
123        mr      r1, r9
124        /*
125         * We are know in a environment that is totally independent from bootloader setup.
126         */
127        lis     r5,environ@ha
128        la      r5,environ@l(r5)        /* environp */
129        li      r4, 0                   /* argv */
130        li      r3, 0                   /* argc */
131        bl      boot_card
132        bl      _return_to_ppcbug
133       
134        .globl  MMUon
135        .type   MMUon,@function
136MMUon: 
137        mfmsr   r0
138#if (PPC_HAS_FPU == 0)
139        ori     r0,r0, MSR_IP | MSR_RI | MSR_IR | MSR_DR | MSR_EE | MSR_FE0 | MSR_FE1 | MSR_FP
140        xori    r0, r0, MSR_EE | MSR_IP | MSR_FP
141#else
142        ori     r0,r0, MSR_IP | MSR_RI | MSR_IR | MSR_DR | MSR_EE | MSR_FE0 | MSR_FE1 | MSR_FP
143        xori    r0, r0, MSR_EE | MSR_IP | MSR_FE0 | MSR_FE1
144#endif
145        mflr    r11
146        mtsrr0  r11
147        mtsrr1  r0
148        SYNC
149        rfi
150       
151        .globl  MMUoff
152        .type   MMUoff,@function
153MMUoff:
154        mfmsr   r0
155        ori     r0,r0,MSR_IR| MSR_DR | MSR_IP
156        mflr    r11
157        xori    r0,r0,MSR_IR|MSR_DR
158        mtsrr0  r11
159        mtsrr1  r0
160        SYNC
161        rfi
162
163        .globl  _return_to_ppcbug
164        .type   _return_to_ppcbug,@function
165
166       
167_return_to_ppcbug:
168        mflr    r30
169        bl      MMUoff
170        MONITOR_ENTER
171        bl      MMUon
172        mtctr   r30
173        bctr   
174
175/*
176 * An undocumented "feature" of 604e requires that the v bit
177 * be cleared before changing BAT values.
178 *
179 * Also, newer IBM firmware does not clear bat3 and 4 so
180 * this makes sure it's done.
181 *  -- Cort
182 */
183clear_bats:
184        li      r20,0
185        mfspr   r9,PVR
186        rlwinm  r9,r9,16,16,31          /* r9 = 1 for 601, 4 for 604 */
187        cmpwi   r9, 1
188        SYNC
189        beq     1f
190        mtspr   DBAT0U,r20
191        mtspr   DBAT0L,r20     
192        mtspr   DBAT1U,r20
193        mtspr   DBAT1L,r20
194        mtspr   DBAT2U,r20
195        mtspr   DBAT2L,r20     
196        mtspr   DBAT3U,r20
197        mtspr   DBAT3L,r20
1981:     
199        mtspr   IBAT0U,r20
200        mtspr   IBAT0L,r20
201        mtspr   IBAT1U,r20
202        mtspr   IBAT1L,r20
203        mtspr   IBAT2U,r20
204        mtspr   IBAT2L,r20
205        mtspr   IBAT3U,r20
206        mtspr   IBAT3L,r20
207        SYNC   
208        blr
209
210flush_tlbs:
211        lis     r20, 0x1000
2121:      addic.  r20, r20, -0x1000
213        tlbie   r20
214        bgt     1b
215        sync
216        blr
217       
218
219        .comm   environ,4,4
Note: See TracBrowser for help on using the repository browser.