source: mainline/boot/arch/ppc32/loader/asm.S@ f3776a3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since f3776a3 was f3776a3, checked in by Martin Decky <martin@…>, 17 years ago

move loader base address to 16 MB
remove debugging output

  • Property mode set to 100644
File size: 5.9 KB
Line 
1#
2# Copyright (c) 2006 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include "asm.h"
30#include "regname.h"
31
32.text
33
34.global halt
35.global memcpy
36.global jump_to_kernel
37
38halt:
39 b halt
40
41memcpy:
42 srwi. r7, r5, 3
43 addi r6, r3, -4
44 addi r4, r4, -4
45 beq 2f
46
47 andi. r0, r6, 3
48 mtctr r7
49 bne 5f
50
51 1:
52
53 lwz r7, 4(r4)
54 lwzu r8, 8(r4)
55 stw r7, 4(r6)
56 stwu r8, 8(r6)
57 bdnz 1b
58
59 andi. r5, r5, 7
60
61 2:
62
63 cmplwi 0, r5, 4
64 blt 3f
65
66 lwzu r0, 4(r4)
67 addi r5, r5, -4
68 stwu r0, 4(r6)
69
70 3:
71
72 cmpwi 0, r5, 0
73 beqlr
74 mtctr r5
75 addi r4, r4, 3
76 addi r6, r6, 3
77
78 4:
79
80 lbzu r0, 1(r4)
81 stbu r0, 1(r6)
82 bdnz 4b
83 blr
84
85 5:
86
87 subfic r0, r0, 4
88 mtctr r0
89
90 6:
91
92 lbz r7, 4(r4)
93 addi r4, r4, 1
94 stb r7, 4(r6)
95 addi r6, r6, 1
96 bdnz 6b
97 subf r5, r0, r5
98 rlwinm. r7, r5, 32-3, 3, 31
99 beq 2b
100 mtctr r7
101 b 1b
102
103
104jump_to_kernel:
105
106 # r3 = bootinfo (pa)
107 # r4 = bootinfo_size
108 # r5 = trans (pa)
109 # r6 = bytes to copy
110 # r7 = real_mode (pa)
111 # r8 = framebuffer (pa)
112 # r9 = scanline
113
114 # disable interrupts
115
116 mfmsr r31
117 rlwinm r31, r31, 0, 17, 15
118 mtmsr r31
119
120 # set real_mode meeting point address
121
122 mtspr srr0, r7
123
124 # jumps to real_mode
125
126 mfmsr r31
127 lis r30, ~0@h
128 ori r30, r30, ~(msr_ir | msr_dr | msr_ee)@l
129 and r31, r31, r30
130 mtspr srr1, r31
131
132 sync
133 isync
134 rfi
135
136.section REALMODE, "ax"
137.align PAGE_WIDTH
138.global real_mode
139
140real_mode:
141
142 # copy kernel to proper location
143 #
144 # r5 = trans (pa)
145 # r6 = bytes to copy
146 # r8 = framebuffer (pa)
147 # r9 = scanline
148
149 li r31, PAGE_SIZE >> 2
150 li r30, 0
151
152 page_copy:
153
154 cmpwi r6, 0
155 beq copy_end
156
157 # copy page
158
159 mtctr r31
160 lwz r29, 0(r5)
161
162 copy_loop:
163
164 lwz r28, 0(r29)
165 stw r28, 0(r30)
166
167 addi r29, r29, 4
168 addi r30, r30, 4
169 subi r6, r6, 4
170
171 cmpwi r6, 0
172 beq copy_end
173
174 bdnz copy_loop
175
176 addi r5, r5, 4
177 b page_copy
178
179 copy_end:
180
181 # initially fill segment registers
182
183 li r31, 0
184
185 li r29, 8
186 mtctr r29
187 li r30, 0 # ASID 0 (VSIDs 0 .. 7)
188
189 seg_fill_uspace:
190
191 mtsrin r30, r31
192 addi r30, r30, 1
193 addis r31, r31, 0x1000 # move to next SR
194
195 bdnz seg_fill_uspace
196
197 li r29, 8
198 mtctr r29
199 lis r30, 0x4000 # priviledged access only
200 ori r30, r30, 8 # ASID 0 (VSIDs 8 .. 15)
201
202 seg_fill_kernel:
203
204 mtsrin r30, r31
205 addi r30, r30, 1
206 addis r31, r31, 0x1000 # move to next SR
207
208 bdnz seg_fill_kernel
209
210 # invalidate block address translation registers
211
212 li r30, 0
213
214 mtspr ibat0u, r30
215 mtspr ibat0l, r30
216
217 mtspr ibat1u, r30
218 mtspr ibat1l, r30
219
220 mtspr ibat2u, r30
221 mtspr ibat2l, r30
222
223 mtspr ibat3u, r30
224 mtspr ibat3l, r30
225
226 mtspr dbat0u, r30
227 mtspr dbat0l, r30
228
229 mtspr dbat1u, r30
230 mtspr dbat1l, r30
231
232 mtspr dbat2u, r30
233 mtspr dbat2l, r30
234
235 mtspr dbat3u, r30
236 mtspr dbat3l, r30
237
238 # create empty Page Hash Table
239 # on top of memory, size 64 KB
240
241 lwz r31, 0(r3) # r31 = memory size
242
243 lis r30, 65536@h
244 ori r30, r30, 65536@l # r30 = 65536
245
246 subi r29, r30, 1 # r29 = 65535
247
248 sub r31, r31, r30
249 andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536)
250
251 mtsdr1 r31
252
253 li r29, 2
254 srw r30, r30, r29 # r30 = 16384
255 li r29, 0
256
257 pht_clear:
258
259 # write zeroes
260
261 stw r29, 0(r31)
262
263 addi r31, r31, 4
264 subi r30, r30, 4
265
266 cmpwi r30, 0
267 beq clear_end
268
269 bdnz pht_clear
270
271 clear_end:
272
273#ifdef CONFIG_BAT
274
275 # create BAT identity mapping
276
277 lwz r31, 0(r3) # r31 = memory size
278
279 lis r29, 0x0002
280 cmpw r31, r29
281 blt no_bat # less than 128 KB -> no BAT
282
283 li r29, 18
284 srw r31, r31, r29 # r31 = total >> 18
285
286 # create Block Length mask by replicating
287 # the leading logical one 14 times
288
289 li r29, 14
290 mtctr r31
291 li r29, 1
292
293 bat_mask:
294 srw r30, r31, r29 # r30 = mask >> 1
295 or r31, r31, r30 # mask = mask | r30
296
297 bdnz bat_mask
298
299 andi. r31, r31, 0x07ff # mask = mask & 0x07ff (BAT can map up to 256 MB)
300
301 li r29, 2
302 slw r31, r31, r29 # mask = mask << 2
303 ori r31, r31, 0x0002 # mask = mask | 0x0002 (priviledged access only)
304
305 lis r29, 0x8000
306 or r29, r29, r31
307
308 lis r30, 0x0000
309 ori r30, r30, 0x0002
310
311 mtspr ibat0u, r29
312 mtspr ibat0l, r30
313
314 mtspr dbat0u, r29
315 mtspr dbat0l, r30
316
317 no_bat:
318
319#endif
320
321 tlbia
322 tlbsync
323
324 # start the kernel
325 #
326 # pc = KERNEL_START_ADDR
327 # r3 = bootinfo (pa)
328 # sprg0 = KA2PA(KERNEL_START_ADDR)
329 # sprg3 = physical memory size
330 # sp = 0 (pa)
331
332 lis r31, KERNEL_START_ADDR@ha
333 addi r31, r31, KERNEL_START_ADDR@l
334
335 mtspr srr0, r31
336
337 subis r31, r31, 0x8000
338 mtsprg0 r31
339
340 lwz r31, 0(r3)
341 mtsprg3 r31
342
343 li sp, 0
344
345 mfmsr r31
346 ori r31, r31, (msr_ir | msr_dr)@l
347 mtspr srr1, r31
348
349 sync
350 isync
351 rfi
352
353.align PAGE_WIDTH
354.global trans
355trans:
356 .space (TRANS_SIZE * TRANS_ITEM_SIZE)
Note: See TracBrowser for help on using the repository browser.