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

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

prevent possible race by force disabling interrupts

  • Property mode set to 100644
File size: 4.3 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 = kernel size
110 # r7 = framebuffer (pa)
111 # r8 = real_mode (pa)
112
113 # disable interrupts
114
115 mfmsr r31
116 rlwinm r31, r31, 0, 17, 15
117 mtmsr r31
118
119 # set real_mode meeting point address
120
121 mtspr srr0, r8
122
123 # jumps to real_mode
124
125 mfmsr r31
126 lis r30, ~0@h
127 ori r30, r30, ~(msr_ir | msr_dr)@l
128 and r31, r31, r30
129 mtspr srr1, r31
130
131 sync
132 isync
133 rfi
134
135.section REALMODE, "ax"
136.align PAGE_WIDTH
137.global real_mode
138
139real_mode:
140
141 # copy kernel to proper location
142 #
143 # r5 = trans (pa)
144 # r6 = kernel size
145 # r7 = framebuffer (pa)
146
147 li r31, PAGE_SIZE >> 2
148 li r30, 0
149
150 page_copy:
151
152 cmpwi r6, 0
153 beq copy_end
154
155 # copy page
156
157 mtctr r31
158 lwz r29, 0(r5)
159
160 copy_loop:
161
162 lwz r28, 0(r29)
163 stw r28, 0(r30)
164
165 addi r29, r29, 4
166 addi r30, r30, 4
167 subi r6, r6, 4
168
169 cmpwi r6, 0
170 beq copy_end
171
172 bdnz copy_loop
173
174 addi r5, r5, 4
175 b page_copy
176
177 copy_end:
178
179 # initially fill segment registers
180
181 li r31, 16
182 mtctr r31
183 li r31, 0
184 li r30, 0x2000
185
186 seg_fill:
187
188 mtsrin r30, r31
189 addi r30, r30, 0x111
190 addis r31, r31, 0x1000 # move to next SR
191
192 bdnz seg_fill
193
194 # invalidate block address translation registers
195
196 mtspr ibat0u, r30
197 mtspr ibat0l, r30
198
199 mtspr ibat1u, r30
200 mtspr ibat1l, r30
201
202 mtspr ibat2u, r30
203 mtspr ibat2l, r30
204
205 mtspr ibat3u, r30
206 mtspr ibat3l, r30
207
208 mtspr dbat0u, r30
209 mtspr dbat0l, r30
210
211 mtspr dbat1u, r30
212 mtspr dbat1l, r30
213
214 mtspr dbat2u, r30
215 mtspr dbat2l, r30
216
217 mtspr dbat3u, r30
218 mtspr dbat3l, r30
219
220 # create identity mapping
221
222 # FIXME: map exactly the size of RAM
223
224 lis r31, 0x8000
225 ori r31, r31, 0x0ffe
226
227 lis r30, 0x0000
228 ori r30, r30, 0x0002
229
230 mtspr ibat0u, r31
231 mtspr ibat0l, r30
232
233 mtspr dbat0u, r31
234 mtspr dbat0l, r30
235
236 # FIXME: temporal framebuffer mapping
237
238 lis r31, 0xf000
239 ori r31, r31, 0x0ffe
240
241 mr r30, r7
242 ori r30, r30, 0x0002
243
244 mtspr dbat1u, r31
245 mtspr dbat1l, r30
246
247 tlbia
248
249 # start the kernel
250 #
251 # r3 = bootinfo (pa)
252
253 lis r31, KERNEL_START_ADDR@ha
254 addi r31, r31, KERNEL_START_ADDR@l
255
256 mtspr srr0, r31
257
258 mfmsr r31
259 ori r31, r31, (msr_ir | msr_dr)@l
260 mtspr srr1, r31
261
262 sync
263 isync
264 rfi
265
266.align PAGE_WIDTH
267.global trans
268trans:
269 .space (TRANS_SIZE * TRANS_ITEM_SIZE)
Note: See TracBrowser for help on using the repository browser.