No empty .Rs/.Re
[netbsd-mini2440.git] / sys / arch / evbppc / explora / explora_start.S
blob491210e96f760d218686726e3fb4da2b4306b057
1 /*      $NetBSD: explora_start.S,v 1.5 2008/04/28 20:23:17 martin Exp $ */
3 /*-
4  * Copyright (c) 2003 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Juergen Hannken-Illjes.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
33  * Initial state:
34  *
35  * iccr = 0x00008001 0x80000000-0x87ffffff 0xf80000000-0xffffffff
36  * dccr = 0x00008001 0x80000000-0x87ffffff 0xf80000000-0xffffffff
37  * dcwr = 0x00000000
38  * msr  = 0x00001000 ME=machine check enable
39  *
40  */
42 #include "assym.h"
44 #define _NOREGNAMES
46 #include <machine/param.h>
47 #include <machine/psl.h>
48 #include <machine/trap.h>
49 #include <machine/asm.h>
51 #include <powerpc/spr.h>
52 #include <powerpc/ibm4xx/dcr403cgx.h>
53 #include <powerpc/ibm4xx/pmap.h>
55 #include "opt_ddb.h"
56 #include "opt_ppcparam.h"
59  * Initially the dram starts at 0x01000000. This is way too high.
60  * We relocate dram to 0x00000000. We use the video ram at 0xf0000000
61  * as a temporary staging area.
62  */
64 #define STAGE1_BASE     0xf0000000
66         .text
67         .globl  __start
68 __start:
69         b       1f
70         nop
71         nop
72         .long   0
73         .ascii  "XncdPPC\0"
74         .long   0
75         .long   0
78         /* Disable exceptions, caches, invalidate all TLB's. */
80         li      0,0
81         mtmsr   0
82         mttcr   0
83         mtdccr  0
84         mticcr  0
85         sync
86         isync
88 /* Clear caches and invalidate tlbs */
89         li      7,256
90         mtctr   7
91         li      6,0
93         dccci   0,6
94         addi    6,6,16
95         bdnz    1b
97         li      7,512
98         mtctr   7
99         li      6,0
101         iccci   0,6
102         addi    6,6,16
103         bdnz    1b
105         tlbia
106         sync
107         isync
109 /* Get current address -- NOT the same as . */
111         bl      _next
112 _next:
113         mflr    3
114         subi    3,3,_next-__start
115         lis     4,STAGE1_BASE@h
116         ori     4,4,STAGE1_BASE@l
117         li      5,stage1size
120         lbz     1,0(3)
121         mr      0,5
122         cmpwi   0,0
123         stb     1,0(4)
124         addi    3,3,1
125         addi    4,4,1
126         addi    5,5,-1
127         bgt     1b
129 /* Jump into the staging area so we can remap the dram. */
131         lis     0,stage1reloc@h
132         ori     0,0,stage1reloc@l
133         mtlr    0
134         blr
136 stage1reloc = .-__start+STAGE1_BASE
138 /* Remap the dram from 0x01000000 to 0x00000000. */
140 #define REMAP(r, tmp1, tmp2) \
141         mfbr##r tmp1 ; \
142         lis     tmp2,0xff ; \
143         ori     tmp2,tmp2,0xffff ; \
144         cmplw   tmp1,tmp2 ; \
145         ble     1f ; \
146         addis   tmp1,tmp1,0xf000 ; \
147         mtbr##r tmp1 ; \
150         REMAP(4, 1, 2)
151         REMAP(5, 1, 2)
152         REMAP(6, 1, 2)
153         REMAP(7, 1, 2)
155 #undef REMAP
157 /* Initial setup. */
159         ba      stage2
161 stage2:
163 #ifdef PPC_4XX_NOCACHE
164         li      0,0
165 #else
166         lis     0,0xfffc
167 #endif
168         mtdccr  0
169         mticcr  0
170         sync
171         isync
173 /* get start of bss */
174         lis     7,_C_LABEL(edata)-4@h
175         ori     7,7,_C_LABEL(edata)-4@l
176 /* get end of kernel */
177         lis     4,_C_LABEL(end)@h
178         ori     4,4,_C_LABEL(end)@l
179 /* clear bss */
180         li      3,0
182         stwu    3,4(7)
183         cmpw    7,4
184         bne+    1b
186         INIT_CPUINFO(4,1,9,0)
188         lis     3,__start@h
189         ori     3,3,__start@l
191 /* Run the remaining setup in C. */
192         bl      _C_LABEL(bootstrap)
194         bl      _C_LABEL(main)
196         /* NOTREACHED */
197 2:      nop
198         b       2b
200 stage1size = .-__start
202 #include <powerpc/ibm4xx/4xx_locore.S>