source: mainline/boot/arch/ppc64/loader/asm.S@ 6196dae

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

© versus ©

  • Property mode set to 100644
File size: 4.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#include "debug.inc"
32
33.text
34
35.global halt
36.global memcpy
37.global jump_to_kernel
38
39halt:
40 b halt
41
42memcpy:
43 srwi. r7, r5, 3
44 addi r6, r3, -4
45 addi r4, r4, -4
46 beq 2f
47
48 andi. r0, r6, 3
49 mtctr r7
50 bne 5f
51
52 1:
53
54 lwz r7, 4(r4)
55 lwzu r8, 8(r4)
56 stw r7, 4(r6)
57 stwu r8, 8(r6)
58 bdnz 1b
59
60 andi. r5, r5, 7
61
62 2:
63
64 cmplwi 0, r5, 4
65 blt 3f
66
67 lwzu r0, 4(r4)
68 addi r5, r5, -4
69 stwu r0, 4(r6)
70
71 3:
72
73 cmpwi 0, r5, 0
74 beqlr
75 mtctr r5
76 addi r4, r4, 3
77 addi r6, r6, 3
78
79 4:
80
81 lbzu r0, 1(r4)
82 stbu r0, 1(r6)
83 bdnz 4b
84 blr
85
86 5:
87
88 subfic r0, r0, 4
89 mtctr r0
90
91 6:
92
93 lbz r7, 4(r4)
94 addi r4, r4, 1
95 stb r7, 4(r6)
96 addi r6, r6, 1
97 bdnz 6b
98 subf r5, r0, r5
99 rlwinm. r7, r5, 32-3, 3, 31
100 beq 2b
101 mtctr r7
102 b 1b
103
104
105jump_to_kernel:
106
107 # r3 = bootinfo (pa)
108 # r4 = bootinfo_size
109 # r5 = trans (pa)
110 # r6 = bytes to copy
111 # r7 = real_mode (pa)
112 # r8 = framebuffer (pa)
113 # r9 = scanline
114
115 # disable interrupts
116
117 mfmsr r31
118 rlwinm r31, r31, 0, 17, 15
119 mtmsr r31
120
121 # set real_mode meeting point address
122
123 mtspr srr0, r7
124
125 # jumps to real_mode
126
127 mfmsr r31
128 lis r30, ~0@h
129 ori r30, r30, ~(msr_ir | msr_dr)@l
130 and r31, r31, r30
131 mtspr srr1, r31
132
133 sync
134 isync
135 rfid
136
137.section REALMODE, "ax"
138.align PAGE_WIDTH
139.global real_mode
140
141real_mode:
142
143 DEBUG_INIT
144 DEBUG_real_mode
145
146 # copy kernel to proper location
147 #
148 # r5 = trans (pa)
149 # r6 = bytes to copy
150 # r8 = framebuffer (pa)
151 # r9 = scanline
152
153 li r31, PAGE_SIZE >> 2
154 li r30, 0
155
156 page_copy:
157
158 cmpwi r6, 0
159 beq copy_end
160
161 # copy page
162
163 mtctr r31
164 lwz r29, 0(r5)
165
166 DEBUG_INIT
167 DEBUG_copy_loop
168
169 copy_loop:
170
171 lwz r28, 0(r29)
172 stw r28, 0(r30)
173
174 addi r29, r29, 4
175 addi r30, r30, 4
176 subi r6, r6, 4
177
178 cmpwi r6, 0
179 beq copy_end
180
181 bdnz copy_loop
182
183 DEBUG_end_copy_loop
184
185 addi r5, r5, 4
186 b page_copy
187
188 copy_end:
189
190 DEBUG_segments
191
192 # initially fill segment registers
193
194 li r31, 0
195
196 li r29, 8
197 mtctr r29
198 li r30, 0 # ASID 0 (VSIDs 0 .. 7)
199
200 seg_fill_uspace:
201
202 mtsrin r30, r31
203 addi r30, r30, 1
204 addis r31, r31, 0x1000 # move to next SR
205
206 bdnz seg_fill_uspace
207
208 li r29, 8
209 mtctr r29
210 lis r30, 0x4000 # priviledged access only
211 ori r30, r30, 8 # ASID 0 (VSIDs 8 .. 15)
212
213 seg_fill_kernel:
214
215 mtsrin r30, r31
216 addi r30, r30, 1
217 addis r31, r31, 0x1000 # move to next SR
218
219 bdnz seg_fill_kernel
220
221 # create empty Page Hash Table
222 # on top of memory, size 64 KB
223
224 DEBUG_pht
225
226 lwz r31, 0(r3) # r31 = memory size
227
228 lis r30, 65536@h
229 ori r30, r30, 65536@l # r30 = 65536
230
231 subi r29, r30, 1 # r29 = 65535
232
233 sub r31, r31, r30
234 andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536)
235
236 mtsdr1 r31
237
238 li r29, 2
239 srw r30, r30, r29 # r30 = 16384
240 li r29, 0
241
242 pht_clear:
243
244 # write zeroes
245
246 stw r29, 0(r31)
247
248 addi r31, r31, 4
249 subi r30, r30, 4
250
251 cmpwi r30, 0
252 beq clear_end
253
254 bdnz pht_clear
255
256 DEBUG_end_pht_clear
257
258 clear_end:
259
260 DEBUG_tlb
261
262 tlbia
263 tlbsync
264
265 DEBUG_prepare
266
267 # start the kernel
268 #
269 # pc = KERNEL_START_ADDR
270 # r3 = bootinfo (pa)
271 # sprg0 = KA2PA(KERNEL_START_ADDR)
272 # sprg3 = physical memory size
273 # sp = 0 (pa)
274
275 lis r31, KERNEL_START_ADDR@ha
276 addi r31, r31, KERNEL_START_ADDR@l
277
278 mtspr srr0, r31
279
280 subis r31, r31, 0x8000
281 mtsprg0 r31
282
283 lwz r31, 0(r3)
284 mtsprg3 r31
285
286 li sp, 0
287
288 mfmsr r31
289 ori r31, r31, (msr_ir | msr_dr)@l
290 mtspr srr1, r31
291
292 sync
293 isync
294
295 DEBUG_rfi
296 rfid
297
298.align PAGE_WIDTH
299.global trans
300trans:
301 .space (TRANS_SIZE * TRANS_ITEM_SIZE)
Note: See TracBrowser for help on using the repository browser.