source: mainline/arch/ppc32/loader/asm.S@ c04bdb4

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

allocate page hash table during boot
(preliminary code, will be fixed properly later)

  • Property mode set to 100644
File size: 4.5 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 | msr_ee)@l
130 and r31, r31, r30
131 mtspr srr1, r31
132
133 sync
134 isync
135 rfi
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, 16
195 mtctr r31
196 li r31, 0
197 li r30, 0x2000
198
199 seg_fill:
200
201 mtsrin r30, r31
202 addi r30, r30, 0x111
203 addis r31, r31, 0x1000 # move to next SR
204
205 bdnz seg_fill
206
207 # invalidate block address translation registers
208
209 DEBUG_bat
210
211 li r30, 0
212
213 mtspr ibat0u, r30
214 mtspr ibat0l, r30
215
216 mtspr ibat1u, r30
217 mtspr ibat1l, r30
218
219 mtspr ibat2u, r30
220 mtspr ibat2l, r30
221
222 mtspr ibat3u, r30
223 mtspr ibat3l, r30
224
225 mtspr dbat0u, r30
226 mtspr dbat0l, r30
227
228 mtspr dbat1u, r30
229 mtspr dbat1l, r30
230
231 mtspr dbat2u, r30
232 mtspr dbat2l, r30
233
234 mtspr dbat3u, r30
235 mtspr dbat3l, r30
236
237 # create empty page hash table FIXME
238
239 DEBUG_pht
240
241 lis r31, 0x07ff
242 ori r31, r31, 0x0000
243
244 mtsdr1 r31
245
246 # create identity mapping
247
248 DEBUG_mapping
249
250 # FIXME: map exactly the size of RAM
251
252 lis r31, 0x8000
253 ori r31, r31, 0x0ffe
254
255 lis r30, 0x0000
256 ori r30, r30, 0x0002
257
258 mtspr ibat0u, r31
259 mtspr ibat0l, r30
260
261 mtspr dbat0u, r31
262 mtspr dbat0l, r30
263
264 DEBUG_tlb
265
266 tlbia
267 tlbsync
268
269 DEBUG_prepare
270
271 # start the kernel
272 #
273 # r3 = bootinfo (pa)
274
275 lis r31, KERNEL_START_ADDR@ha
276 addi r31, r31, KERNEL_START_ADDR@l
277
278 mtspr srr0, r31
279
280 mfmsr r31
281 ori r31, r31, (msr_ir | msr_dr)@l
282 mtspr srr1, r31
283
284 sync
285 isync
286
287 DEBUG_rfi
288 rfi
289
290.align PAGE_WIDTH
291.global trans
292trans:
293 .space (TRANS_SIZE * TRANS_ITEM_SIZE)
Note: See TracBrowser for help on using the repository browser.