source: rtems/c/src/lib/libbsp/powerpc/shared/start/start.S @ 2195ccf3

4.104.114.84.95
Last change on this file since 2195ccf3 was 2195ccf3, checked in by Ralf Corsepius <ralf.corsepius@…>, on 02/17/05 at 04:28:21

2005-02-17 Ralf Corsepius <ralf.corsepius@…>

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