source: mainline/boot/arch/ppc64/loader/asm.S@ 4bc73fa

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

remove debugging output

  • Property mode set to 100644
File size: 4.6 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)@l
129 and r31, r31, r30
130 mtspr srr1, r31
131
132 sync
133 isync
134 rfid
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 # create empty Page Hash Table
211 # on top of memory, size 64 KB
212
213 lwz r31, 0(r3) # r31 = memory size
214
215 lis r30, 65536@h
216 ori r30, r30, 65536@l # r30 = 65536
217
218 subi r29, r30, 1 # r29 = 65535
219
220 sub r31, r31, r30
221 andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536)
222
223 mtsdr1 r31
224
225 li r29, 2
226 srw r30, r30, r29 # r30 = 16384
227 li r29, 0
228
229 pht_clear:
230
231 # write zeroes
232
233 stw r29, 0(r31)
234
235 addi r31, r31, 4
236 subi r30, r30, 4
237
238 cmpwi r30, 0
239 beq clear_end
240
241 bdnz pht_clear
242
243 clear_end:
244
245 tlbsync
246
247 # start the kernel
248 #
249 # pc = KERNEL_START_ADDR
250 # r3 = bootinfo (pa)
251 # sprg0 = KA2PA(KERNEL_START_ADDR)
252 # sprg3 = physical memory size
253 # sp = 0 (pa)
254
255 lis r31, KERNEL_START_ADDR@ha
256 addi r31, r31, KERNEL_START_ADDR@l
257
258 mtspr srr0, r31
259
260 subis r31, r31, 0x8000
261 mtsprg0 r31
262
263 lwz r31, 0(r3)
264 mtsprg3 r31
265
266 li sp, 0
267
268 mfmsr r31
269 ori r31, r31, (msr_ir | msr_dr)@l
270 mtspr srr1, r31
271
272 sync
273 isync
274 rfid
275
276.align PAGE_WIDTH
277.global trans
278trans:
279 .space (TRANS_SIZE * TRANS_ITEM_SIZE)
Note: See TracBrowser for help on using the repository browser.