entry.S revision 1.3.4.2 1 1.3.4.2 jruoho /* $NetBSD: entry.S,v 1.3.4.2 2011/06/06 09:06:35 jruoho Exp $ */
2 1.3.4.2 jruoho
3 1.3.4.2 jruoho #include <powerpc/psl.h>
4 1.3.4.2 jruoho #include <powerpc/spr.h>
5 1.3.4.2 jruoho #include <powerpc/oea/spr.h>
6 1.3.4.2 jruoho #include <powerpc/oea/bat.h>
7 1.3.4.2 jruoho #include <powerpc/oea/hid.h>
8 1.3.4.2 jruoho
9 1.3.4.2 jruoho .text
10 1.3.4.2 jruoho .globl _start
11 1.3.4.2 jruoho _start:
12 1.3.4.2 jruoho /*
13 1.3.4.2 jruoho * Save possible argc and argv values from the firmware, usually
14 1.3.4.2 jruoho * passed in r3 and r4.
15 1.3.4.2 jruoho * When started with "bootm", as a Linux kernel module, r6 and r7
16 1.3.4.2 jruoho * point to the start and end address of the bootargs.
17 1.3.4.2 jruoho */
18 1.3.4.2 jruoho mr 30,3
19 1.3.4.2 jruoho mr 31,4
20 1.3.4.2 jruoho mr 28,6
21 1.3.4.2 jruoho mr 29,7
22 1.3.4.2 jruoho
23 1.3.4.2 jruoho /*
24 1.3.4.2 jruoho * U-Boot/PPCBoot forgets to flush the cache when using the "bootm"
25 1.3.4.2 jruoho * command, so we have to do that now.
26 1.3.4.2 jruoho */
27 1.3.4.2 jruoho lis 11,_start@ha
28 1.3.4.2 jruoho addi 11,11,_start@l
29 1.3.4.2 jruoho andi. 11,11,~31@l
30 1.3.4.2 jruoho lis 12,(_edata+31)@ha
31 1.3.4.2 jruoho addi 12,12,(_edata+31)@l
32 1.3.4.2 jruoho bl syncicache
33 1.3.4.2 jruoho
34 1.3.4.2 jruoho mfspr 11,SPR_HID0
35 1.3.4.2 jruoho andi. 0,11,HID0_DCE
36 1.3.4.2 jruoho ori 11,11,HID0_ICE
37 1.3.4.2 jruoho ori 8,11,HID0_ICFI
38 1.3.4.2 jruoho bne 1f /* don't invalidate the D-cache */
39 1.3.4.2 jruoho ori 8,8,HID0_DCFI /* unless it wasn't enabled */
40 1.3.4.2 jruoho 1:
41 1.3.4.2 jruoho mfmsr 0
42 1.3.4.2 jruoho andi. 0,0,PSL_DR
43 1.3.4.2 jruoho beq 2f
44 1.3.4.2 jruoho lis 5, 0xfec00000@ha /* CONFIG_ADDR of PCI */
45 1.3.4.2 jruoho lis 6, 0xfee00000@ha /* CONFIG_DATA of PCI */
46 1.3.4.2 jruoho mfspr 3,SPR_DBAT0U
47 1.3.4.2 jruoho mfspr 4,SPR_DBAT0L
48 1.3.4.2 jruoho bl dbat_sanity_check
49 1.3.4.2 jruoho beq 3f
50 1.3.4.2 jruoho mfspr 3,SPR_DBAT1U
51 1.3.4.2 jruoho mfspr 4,SPR_DBAT1L
52 1.3.4.2 jruoho bl dbat_sanity_check
53 1.3.4.2 jruoho beq 3f
54 1.3.4.2 jruoho mfspr 3,SPR_DBAT2U
55 1.3.4.2 jruoho mfspr 4,SPR_DBAT2L
56 1.3.4.2 jruoho bl dbat_sanity_check
57 1.3.4.2 jruoho beq 3f
58 1.3.4.2 jruoho mfspr 3,SPR_DBAT3U
59 1.3.4.2 jruoho mfspr 4,SPR_DBAT3L
60 1.3.4.2 jruoho bl dbat_sanity_check
61 1.3.4.2 jruoho beq 3f
62 1.3.4.2 jruoho
63 1.3.4.2 jruoho 2: /* Disable D-cache */
64 1.3.4.2 jruoho li 0,HID0_DCE
65 1.3.4.2 jruoho andc 11,11,0
66 1.3.4.2 jruoho b 4f
67 1.3.4.2 jruoho
68 1.3.4.2 jruoho 3: /* Enable D-cache */
69 1.3.4.2 jruoho ori 11,11,HID0_DCE
70 1.3.4.2 jruoho
71 1.3.4.2 jruoho 4:
72 1.3.4.2 jruoho lis 1,BAT123@ha
73 1.3.4.2 jruoho addi 1,1,BAT123@l
74 1.3.4.2 jruoho lwz 3,0(1)
75 1.3.4.2 jruoho lwz 4,4(1)
76 1.3.4.2 jruoho mtdbatl 1,3
77 1.3.4.2 jruoho mtdbatu 1,4
78 1.3.4.2 jruoho lwz 3,8(1)
79 1.3.4.2 jruoho lwz 4,12(1)
80 1.3.4.2 jruoho mtdbatl 2,3
81 1.3.4.2 jruoho mtdbatu 2,4
82 1.3.4.2 jruoho lwz 3,16(1)
83 1.3.4.2 jruoho lwz 4,20(1)
84 1.3.4.2 jruoho mtdbatl 3,3
85 1.3.4.2 jruoho mtdbatu 3,4
86 1.3.4.2 jruoho
87 1.3.4.2 jruoho sync
88 1.3.4.2 jruoho mtspr SPR_HID0,8 /* enable and invalidate caches */
89 1.3.4.2 jruoho sync
90 1.3.4.2 jruoho mtspr SPR_HID0,11 /* enable caches */
91 1.3.4.2 jruoho sync
92 1.3.4.2 jruoho isync
93 1.3.4.2 jruoho
94 1.3.4.2 jruoho /* make sure .bss gets zeroed. */
95 1.3.4.2 jruoho li 0,0
96 1.3.4.2 jruoho lis 8,edata@ha
97 1.3.4.2 jruoho addi 8,8,edata@l
98 1.3.4.2 jruoho lis 9,end@ha
99 1.3.4.2 jruoho addi 9,9,end@l
100 1.3.4.2 jruoho 5: cmpw 0,8,9 /* edata & end are >= word aligned */
101 1.3.4.2 jruoho bge 6f
102 1.3.4.2 jruoho stw 0,0(8)
103 1.3.4.2 jruoho addi 8,8,4
104 1.3.4.2 jruoho b 5b
105 1.3.4.2 jruoho
106 1.3.4.2 jruoho 6:
107 1.3.4.2 jruoho /* prepare stack at +1MB from _start. */
108 1.3.4.2 jruoho lis 1,_start@h
109 1.3.4.2 jruoho ori 1,1,_start@l
110 1.3.4.2 jruoho addis 1,1,0x10
111 1.3.4.2 jruoho addi 1,1,-4
112 1.3.4.2 jruoho
113 1.3.4.2 jruoho bl brdsetup
114 1.3.4.2 jruoho mr 3,30
115 1.3.4.2 jruoho mr 4,31
116 1.3.4.2 jruoho mr 5,28
117 1.3.4.2 jruoho mr 6,29
118 1.3.4.2 jruoho bl main
119 1.3.4.2 jruoho
120 1.3.4.2 jruoho hang: b hang
121 1.3.4.2 jruoho /* NOTREACHED */
122 1.3.4.2 jruoho
123 1.3.4.2 jruoho dbat_sanity_check:
124 1.3.4.2 jruoho andi. 0,3,BAT_Vs
125 1.3.4.2 jruoho beq 2f
126 1.3.4.2 jruoho andi. 0,4,BAT_I|BAT_PP_RW
127 1.3.4.2 jruoho cmpwi 0,0,BAT_I|BAT_PP_RW
128 1.3.4.2 jruoho bnelr
129 1.3.4.2 jruoho rlwinm 0,3,15,4,14
130 1.3.4.2 jruoho andis. 3,3,0xfffe0000@ha /* BAT_EPI */
131 1.3.4.2 jruoho andis. 4,4,BAT_RPN@ha
132 1.3.4.2 jruoho cmplw 0,3,4
133 1.3.4.2 jruoho bnelr
134 1.3.4.2 jruoho add 4,4,0
135 1.3.4.2 jruoho oris 4,4,0x0001ffff@ha
136 1.3.4.2 jruoho ori 4,4,0x0001ffff@l
137 1.3.4.2 jruoho cmplw 0,3,5
138 1.3.4.2 jruoho bgt 1f
139 1.3.4.2 jruoho cmplw 0,5,4
140 1.3.4.2 jruoho bgt 1f
141 1.3.4.2 jruoho li 5,0
142 1.3.4.2 jruoho 1: cmplw 0,3,6
143 1.3.4.2 jruoho bgt 2f
144 1.3.4.2 jruoho cmplw 0,6,4
145 1.3.4.2 jruoho bgt 2f
146 1.3.4.2 jruoho li 6,0
147 1.3.4.2 jruoho 2: cmplw 0,5,6
148 1.3.4.2 jruoho blr
149 1.3.4.2 jruoho
150 1.3.4.2 jruoho /*
151 1.3.4.2 jruoho * run(startsym, endsym, howto, bootinfo, entry)
152 1.3.4.2 jruoho */
153 1.3.4.2 jruoho .globl run
154 1.3.4.2 jruoho run:
155 1.3.4.2 jruoho mtctr 7 /* hat trick jump to entry point */
156 1.3.4.2 jruoho bctr
157 1.3.4.2 jruoho
158 1.3.4.2 jruoho /*
159 1.3.4.2 jruoho * newaltboot(argc, argv, altboot_base, altboot_len)
160 1.3.4.2 jruoho * To be executed in a safe memory region. Copies the new altboot from
161 1.3.4.2 jruoho * altboot_base to 0x1000000 and starts it there.
162 1.3.4.2 jruoho */
163 1.3.4.2 jruoho .globl newaltboot
164 1.3.4.2 jruoho newaltboot:
165 1.3.4.2 jruoho lis 7,0x1000000@h
166 1.3.4.2 jruoho mr 11,7
167 1.3.4.2 jruoho subi 7,7,4
168 1.3.4.2 jruoho subi 5,5,4
169 1.3.4.2 jruoho add 12,11,6
170 1.3.4.2 jruoho addi 6,6,3
171 1.3.4.2 jruoho srawi 6,6,2
172 1.3.4.2 jruoho mtctr 6
173 1.3.4.2 jruoho 1: lwzu 8,4(5)
174 1.3.4.2 jruoho stwu 8,4(7)
175 1.3.4.2 jruoho bdnz+ 1b
176 1.3.4.2 jruoho mtctr 11
177 1.3.4.2 jruoho addi 12,12,31
178 1.3.4.2 jruoho bl syncicache
179 1.3.4.2 jruoho bctr
180 1.3.4.2 jruoho syncicache:
181 1.3.4.2 jruoho /* r11=start, r12=end, r10=scratch */
182 1.3.4.2 jruoho mr 10,11
183 1.3.4.2 jruoho 2: dcbst 0,10
184 1.3.4.2 jruoho addi 10,10,32
185 1.3.4.2 jruoho cmplw 10,12
186 1.3.4.2 jruoho ble 2b
187 1.3.4.2 jruoho sync
188 1.3.4.2 jruoho 3: icbi 0,11
189 1.3.4.2 jruoho addi 11,11,32
190 1.3.4.2 jruoho cmplw 11,12
191 1.3.4.2 jruoho ble 3b
192 1.3.4.2 jruoho sync
193 1.3.4.2 jruoho isync
194 1.3.4.2 jruoho blr
195 1.3.4.2 jruoho .globl newaltboot_end
196 1.3.4.2 jruoho newaltboot_end:
197 1.3.4.2 jruoho
198 1.3.4.2 jruoho /*
199 1.3.4.2 jruoho * reverse endian access to mimic outw/outl/inw/inl
200 1.3.4.2 jruoho */
201 1.3.4.2 jruoho .globl out16rb
202 1.3.4.2 jruoho .globl iohtole16
203 1.3.4.2 jruoho out16rb:
204 1.3.4.2 jruoho iohtole16:
205 1.3.4.2 jruoho sthbrx 4,0,3
206 1.3.4.2 jruoho eieio
207 1.3.4.2 jruoho blr
208 1.3.4.2 jruoho
209 1.3.4.2 jruoho .globl out32rb
210 1.3.4.2 jruoho .globl iohtole32
211 1.3.4.2 jruoho out32rb:
212 1.3.4.2 jruoho iohtole32:
213 1.3.4.2 jruoho stwbrx 4,0,3
214 1.3.4.2 jruoho eieio
215 1.3.4.2 jruoho blr
216 1.3.4.2 jruoho
217 1.3.4.2 jruoho .global in16rb
218 1.3.4.2 jruoho .global iole16toh
219 1.3.4.2 jruoho in16rb:
220 1.3.4.2 jruoho iole16toh:
221 1.3.4.2 jruoho lhbrx 3,0,3
222 1.3.4.2 jruoho eieio
223 1.3.4.2 jruoho blr
224 1.3.4.2 jruoho
225 1.3.4.2 jruoho .global in32rb
226 1.3.4.2 jruoho .global iole32toh
227 1.3.4.2 jruoho in32rb:
228 1.3.4.2 jruoho iole32toh:
229 1.3.4.2 jruoho lwbrx 3,0,3
230 1.3.4.2 jruoho eieio
231 1.3.4.2 jruoho blr
232 1.3.4.2 jruoho
233 1.3.4.2 jruoho .data
234 1.3.4.2 jruoho #define xBATL(pa, wimg, pp) \
235 1.3.4.2 jruoho ((pa) | (wimg) | (pp))
236 1.3.4.2 jruoho #define xBATU(va, len, v) \
237 1.3.4.2 jruoho ((va) | ((len) & BAT_BL) | ((v) & BAT_V))
238 1.3.4.2 jruoho BAT123:
239 1.3.4.2 jruoho .long xBATL(0x80000000, BAT_I|BAT_G, BAT_PP_RW)
240 1.3.4.2 jruoho .long xBATU(0x80000000, BAT_BL_256M, BAT_Vs)
241 1.3.4.2 jruoho .long xBATL(0xfc000000, BAT_I|BAT_G, BAT_PP_RW)
242 1.3.4.2 jruoho .long xBATU(0xfc000000, BAT_BL_64M, BAT_Vs)
243 1.3.4.2 jruoho .long 0
244 1.3.4.2 jruoho .long 0
245