source: mainline/boot/arch/ppc32/src/asm.S@ 5119d34

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 5119d34 was b66cc97, checked in by Jakub Jermar <jakub@…>, 9 years ago

ppc32: use asmtool.h macros for defining symbols

  • Property mode set to 100644
File size: 7.1 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 <abi/asmtool.h>
30#include <arch/arch.h>
31#include <arch/regname.h>
32
33.macro SMC_COHERENCY addr
34 dcbst 0, \addr
35 sync
36 icbi 0, \addr
37 sync
38 isync
39.endm
40
41.macro FLUSH_DCACHE addr
42 dcbst 0, \addr
43 sync
44 isync
45.endm
46
47.macro TLB_FLUSH reg
48 li \reg, 0
49 sync
50
51 .rept 64
52 tlbie \reg
53 addi \reg, \reg, 0x1000
54 .endr
55
56 eieio
57 tlbsync
58 sync
59.endm
60
61.macro BAT_COMPUTE base size mask lower upper
62 # less than 128 KB -> no BAT
63
64 lis \upper, 0x0002
65 cmpw \size, \upper
66 blt no_bat
67
68 # mask = total >> 18
69
70 li \upper, 18
71 srw \mask, \size, \upper
72
73 # create Block Length mask by replicating
74 # the leading logical one 14 times
75
76 li \upper, 14
77 mtctr \mask
78 li \upper, 1
79
80 0:
81 # mask = (mask >> 1) | mask
82
83 srw \lower, \mask, \upper
84 or \mask, \mask, \lower
85
86 bdnz 0b
87
88 # mask = mask & 0x07ff
89 # (BAT can map up to 256 MB)
90
91 andi. \mask, \mask, 0x07ff
92
93 # mask = (mask << 2) | 0x0002
94 # (priviledged access only)
95
96 li \upper, 2
97 slw \mask, \mask, \upper
98 ori \mask, \mask, 0x0002
99
100 lis \upper, (0x8000 + \base)
101 or \upper, \upper, \mask
102
103 lis \lower, \base
104 ori \lower, \lower, 0x0002
105.endm
106
107.section BOOTSTRAP, "ax"
108
109SYMBOL(start)
110 lis r4, ofw_cif@ha
111 addi r4, r4, ofw_cif@l
112 stw r5, 0(r4)
113
114 bl ofw_init
115 b bootstrap
116
117.text
118
119FUNCTION_BEGIN(halt)
120 b halt
121FUNCTION_END(halt)
122
123FUNCTION_BEGIN(jump_to_kernel)
124 # arguments:
125 # r3 = bootinfo (physical address)
126 # r4 = translate table (physical address)
127 # r5 = pages to translate
128 # r6 = real mode meeting point (physical address)
129
130 # disable interrupts
131
132 mfmsr r31
133 rlwinm r31, r31, 0, 17, 15
134 mtmsr r31
135
136 # set real mode meeting point physical address
137
138 mtspr srr0, r6
139
140 # jump to real_mode
141
142 mfmsr r31
143 lis r30, ~0@h
144 ori r30, r30, ~(msr_ir | msr_dr | msr_ee)@l
145 and r31, r31, r30
146 mtspr srr1, r31
147
148 sync
149 isync
150 rfi
151FUNCTION_END(jump_to_kernel)
152
153.section REALMODE, "ax"
154
155.align PAGE_WIDTH
156SYMBOL(real_mode)
157
158 # arguments:
159 # r3 = bootinfo (physical address)
160 # r4 = translate table (physical address)
161 # r5 = pages to translate
162
163 # move the images of components to the proper
164 # location using the translate table
165
166 li r31, PAGE_SIZE >> 2
167 li r30, 0
168
169 page_copy:
170
171 cmpwi r5, 0
172 beq copy_end
173
174 mtctr r31
175 lwz r29, 0(r4)
176
177 copy_loop:
178
179 lwz r28, 0(r29)
180 stw r28, 0(r30)
181
182 SMC_COHERENCY r30
183
184 addi r29, r29, 4
185 addi r30, r30, 4
186
187 bdnz copy_loop
188
189 addi r4, r4, 4
190 subi r5, r5, 1
191 b page_copy
192
193 copy_end:
194
195 # initially fill segment registers
196
197 li r31, 0
198
199 li r29, 8
200 mtctr r29
201 li r30, 0 # ASID 0 (VSIDs 0 .. 7)
202
203 seg_fill_uspace:
204
205 mtsrin r30, r31
206 addi r30, r30, 1
207 addis r31, r31, 0x1000 # move to next SR
208
209 bdnz seg_fill_uspace
210
211 li r29, 8
212 mtctr r29
213 lis r30, 0x4000 # priviledged access only
214 ori r30, r30, 8 # ASID 0 (VSIDs 8 .. 15)
215
216 seg_fill_kernel:
217
218 mtsrin r30, r31
219 addi r30, r30, 1
220 addis r31, r31, 0x1000 # move to next SR
221
222 bdnz seg_fill_kernel
223
224 # invalidate block address translation registers
225
226 li r30, 0
227
228 mtspr ibat0u, r30
229 mtspr ibat0l, r30
230
231 mtspr ibat1u, r30
232 mtspr ibat1l, r30
233
234 mtspr ibat2u, r30
235 mtspr ibat2l, r30
236
237 mtspr ibat3u, r30
238 mtspr ibat3l, r30
239
240 mtspr dbat0u, r30
241 mtspr dbat0l, r30
242
243 mtspr dbat1u, r30
244 mtspr dbat1l, r30
245
246 mtspr dbat2u, r30
247 mtspr dbat2l, r30
248
249 mtspr dbat3u, r30
250 mtspr dbat3l, r30
251
252 # create empty Page Hash Table
253 # on top of memory, size 64 KB
254
255 lwz r31, 4(r3) # r31 = memory size
256
257 lis r30, 65536@h
258 ori r30, r30, 65536@l # r30 = 65536
259
260 subi r29, r30, 1 # r29 = 65535
261
262 sub r31, r31, r30
263 andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536)
264
265 mtsdr1 r31
266
267 li r29, 2
268 srw r30, r30, r29 # r30 = 16384
269 li r29, 0
270
271 pht_clear:
272
273 # write zeroes
274
275 stw r29, 0(r31)
276 FLUSH_DCACHE r31
277
278 addi r31, r31, 4
279 subi r30, r30, 4
280
281 cmpwi r30, 0
282 beq clear_end
283
284 bdnz pht_clear
285
286 clear_end:
287
288 # create BAT identity mapping
289
290 lwz r31, 4(r3) # r31 = memory size
291
292 lis r30, 268435456@h
293 ori r30, r30, 268435456@l # r30 = 256 MB
294
295 # BAT0
296
297 # r29 = min(r31, r30)
298
299 cmpw r31, r30
300 blt bat0_r31
301
302 mr r29, r30
303 b bat0_r30
304
305 bat0_r31:
306
307 mr r29, r31
308
309 bat0_r30:
310
311 BAT_COMPUTE 0x0000 r29 r28 r27 r26
312 mtspr ibat0u, r26
313 mtspr ibat0l, r27
314
315 mtspr dbat0u, r26
316 mtspr dbat0l, r27
317
318 # BAT1
319
320 sub r31, r31, r29 # r31 = r31 - r29
321
322 # r29 = min(r31, r30)
323
324 cmpw r31, r30
325 blt bat1_r31
326
327 mr r29, r30
328 b bat1_r30
329
330 bat1_r31:
331
332 mr r29, r31
333
334 bat1_r30:
335
336 BAT_COMPUTE 0x1000 r29 r28 r27 r26
337 mtspr ibat1u, r26
338 mtspr ibat1l, r27
339
340 mtspr dbat1u, r26
341 mtspr dbat1l, r27
342
343 # BAT2
344
345 sub r31, r31, r29 # r31 = r31 - r29
346
347 # r29 = min(r31, r30)
348
349 cmpw r31, r30
350 blt bat2_r31
351
352 mr r29, r30
353 b bat2_r30
354
355 bat2_r31:
356
357 mr r29, r31
358
359 bat2_r30:
360
361 BAT_COMPUTE 0x2000 r29 r28 r27 r26
362 mtspr ibat2u, r26
363 mtspr ibat2l, r27
364
365 mtspr dbat2u, r26
366 mtspr dbat2l, r27
367
368 # BAT3
369
370 sub r31, r31, r29 # r31 = r31 - r29
371
372 # r29 = min(r31, r30)
373
374 cmpw r31, r30
375 blt bat3_r31
376
377 mr r29, r30
378 b bat3_r30
379
380 bat3_r31:
381
382 mr r29, r31
383
384 bat3_r30:
385
386 BAT_COMPUTE 0x3000 r29 r28 r27 r26
387 mtspr ibat3u, r26
388 mtspr ibat3l, r27
389
390 mtspr dbat3u, r26
391 mtspr dbat3l, r27
392
393 no_bat:
394
395 # flush TLB
396
397 TLB_FLUSH r31
398
399 # start the kernel
400 #
401 # pc = PA2KA(BOOT_OFFSET)
402 # r3 = bootinfo (physical address)
403 # sprg0 = BOOT_OFFSET
404 # sprg3 = physical memory size
405 # sp = 0 (enforces the usage of sprg0 as exception stack)
406
407 lis r31, PA2KA(BOOT_OFFSET)@ha
408 addi r31, r31, PA2KA(BOOT_OFFSET)@l
409 mtspr srr0, r31
410
411 lis r31, BOOT_OFFSET@ha
412 addi r31, r31, BOOT_OFFSET@l
413 mtsprg0 r31
414
415 # bootinfo starts with a 64 bit integer containing
416 # the physical memory size, get the lower 4 bytes
417
418 lwz r31, 4(r3)
419 mtsprg3 r31
420
421 li sp, 0
422
423 mfmsr r31
424 ori r31, r31, (msr_ir | msr_dr)@l
425 mtspr srr1, r31
426
427 sync
428 isync
429 rfi
Note: See TracBrowser for help on using the repository browser.