Subversion Repositories HelenOS-historic

Rev

Rev 1071 | Rev 1131 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1071 Rev 1075
1
#
1
#
2
# Copyright (C) 2006 Martin Decky
2
# Copyright (C) 2006 Martin Decky
3
# All rights reserved.
3
# All rights reserved.
4
#
4
#
5
# Redistribution and use in source and binary forms, with or without
5
# Redistribution and use in source and binary forms, with or without
6
# modification, are permitted provided that the following conditions
6
# modification, are permitted provided that the following conditions
7
# are met:
7
# are met:
8
#
8
#
9
# - Redistributions of source code must retain the above copyright
9
# - Redistributions of source code must retain the above copyright
10
#   notice, this list of conditions and the following disclaimer.
10
#   notice, this list of conditions and the following disclaimer.
11
# - Redistributions in binary form must reproduce the above copyright
11
# - Redistributions in binary form must reproduce the above copyright
12
#   notice, this list of conditions and the following disclaimer in the
12
#   notice, this list of conditions and the following disclaimer in the
13
#   documentation and/or other materials provided with the distribution.
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
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.
15
#   derived from this software without specific prior written permission.
16
#
16
#
17
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
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
18
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
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
23
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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
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.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
#include "asm.h"
29
#include "asm.h"
30
#include "regname.h"
30
#include "regname.h"
31
 
31
 
32
.data
32
.data
33
 
33
 
34
flush_buffer:
34
flush_buffer:
35
	.space (L1_CACHE_LINES * L1_CACHE_BYTES)
35
	.space (L1_CACHE_LINES * L1_CACHE_BYTES)
36
 
36
 
37
.text
37
.text
38
 
38
 
39
.global halt
39
.global halt
-
 
40
.global memcpy
40
.global jump_to_kernel
41
.global jump_to_kernel
41
 
42
 
42
halt:
43
halt:
43
	b halt
44
	b halt
44
 
45
 
-
 
46
memcpy:
-
 
47
	srwi. r7, r5, 3
-
 
48
	addi r6, r3, -4
-
 
49
	addi r4, r4, -4
-
 
50
	beq	2f
-
 
51
	
-
 
52
	andi. r0, r6, 3
-
 
53
	mtctr r7
-
 
54
	bne 5f
-
 
55
	
-
 
56
	1:
-
 
57
	
-
 
58
	lwz r7, 4(r4)
-
 
59
	lwzu r8, 8(r4)
-
 
60
	stw r7, 4(r6)
-
 
61
	stwu r8, 8(r6)
-
 
62
	bdnz 1b
-
 
63
	
-
 
64
	andi. r5, r5, 7
-
 
65
	
-
 
66
	2:
-
 
67
	
-
 
68
	cmplwi 0, r5, 4
-
 
69
	blt 3f
-
 
70
	
-
 
71
	lwzu r0, 4(r4)
-
 
72
	addi r5, r5, -4
-
 
73
	stwu r0, 4(r6)
-
 
74
	
-
 
75
	3:
-
 
76
	
-
 
77
	cmpwi 0, r5, 0
-
 
78
	beqlr
-
 
79
	mtctr r5
-
 
80
	addi r4, r4, 3
-
 
81
	addi r6, r6, 3
-
 
82
	
-
 
83
	4:
-
 
84
	
-
 
85
	lbzu r0, 1(r4)
-
 
86
	stbu r0, 1(r6)
-
 
87
	bdnz 4b
-
 
88
	blr
-
 
89
	
-
 
90
	5:
-
 
91
	
-
 
92
	subfic r0, r0, 4
-
 
93
	mtctr r0
-
 
94
	
-
 
95
	6:
-
 
96
	
-
 
97
	lbz r7, 4(r4)
-
 
98
	addi r4, r4, 1
-
 
99
	stb r7, 4(r6)
-
 
100
	addi r6, r6, 1
-
 
101
	bdnz 6b
-
 
102
	subf r5, r0, r5
-
 
103
	rlwinm. r7, r5, 32-3, 3, 31
-
 
104
	beq 2b
-
 
105
	mtctr r7
-
 
106
	b 1b
-
 
107
 
-
 
108
 
45
jump_to_kernel:
109
jump_to_kernel:
46
	
110
	
47
	# r3 = memmap (pa)
111
	# r3 = memmap (pa)
48
	# r4 = trans (pa)
112
	# r4 = trans (pa)
49
	# r5 = kernel size
113
	# r5 = kernel size
50
	# r6 = real_mode (pa)
114
	# r6 = real_mode (pa)
51
	
115
	
52
	mtspr srr0, r6
116
	mtspr srr0, r6
53
	
117
	
54
	# jumps to real_mode
118
	# jumps to real_mode
55
	
119
	
56
	mfmsr r31
120
	mfmsr r31
57
	lis r30, ~0@h
121
	lis r30, ~0@h
58
	ori r30, r30, ~(msr_ir | msr_dr)@l
122
	ori r30, r30, ~(msr_ir | msr_dr)@l
59
	and r31, r31, r30
123
	and r31, r31, r30
60
	mtspr srr1, r31
124
	mtspr srr1, r31
61
	rfi
125
	rfi
62
 
126
 
63
.section REALMODE
127
.section REALMODE
64
.align PAGE_WIDTH
128
.align PAGE_WIDTH
65
.global real_mode
129
.global real_mode
66
 
130
 
67
real_mode:
131
real_mode:
68
	
132
	
69
	# copy kernel to proper location
133
	# copy kernel to proper location
70
	#
134
	#
71
	# r4 = trans (pa)
135
	# r4 = trans (pa)
72
	# r5 = kernel size
136
	# r5 = kernel size
73
	
137
	
74
	li r31, PAGE_SIZE >> 2
138
	li r31, PAGE_SIZE >> 2
75
	li r30, 0
139
	li r30, 0
76
	
140
	
77
	page_copy:
141
	page_copy:
78
		
142
		
79
		cmpwi r5, 0
143
		cmpwi r5, 0
80
		beq copy_end
144
		beq copy_end
81
		
145
		
82
		# copy page
146
		# copy page
83
		
147
		
84
		mtctr r31
148
		mtctr r31
85
		lwz r29, 0(r4)
149
		lwz r29, 0(r4)
86
		
150
		
87
		copy_loop:
151
		copy_loop:
88
			
152
			
89
			lwz r28, 0(r29)
153
			lwz r28, 0(r29)
90
			stw r28, 0(r30)
154
			stw r28, 0(r30)
91
			
155
			
92
			addi r29, r29, 4
156
			addi r29, r29, 4
93
			addi r30, r30, 4
157
			addi r30, r30, 4
94
			subi r5, r5, 4
158
			subi r5, r5, 4
95
			
159
			
96
			cmpwi r5, 0
160
			cmpwi r5, 0
97
			beq copy_end
161
			beq copy_end
98
			
162
			
99
			bdnz copy_loop
163
			bdnz copy_loop
100
		
164
		
101
		addi r4, r4, 4
165
		addi r4, r4, 4
102
		b page_copy
166
		b page_copy
103
	
167
	
104
	copy_end:
168
	copy_end:
105
	
169
	
106
	# invalidate segment registers
170
	# invalidate segment registers
107
 
171
 
108
	li r31, 16
172
	li r31, 16
109
	mtctr r31
173
	mtctr r31
110
	li r31, 0
174
	li r31, 0
111
	li r30, 0
175
	li r30, 0
112
 
176
 
113
	seg_fill:
177
	seg_fill:
114
	
178
	
115
		mtsrin r30, r31
179
		mtsrin r30, r31
116
		addis r31, r31, 0x1000    # move to next SR
180
		addis r31, r31, 0x1000    # move to next SR
117
		
181
		
118
		bdnz seg_fill
182
		bdnz seg_fill
119
	
183
	
120
	# invalidate block address translation registers
184
	# invalidate block address translation registers
121
	
185
	
122
	mtspr ibat0u, r30
186
	mtspr ibat0u, r30
123
	mtspr ibat0l, r30
187
	mtspr ibat0l, r30
124
	
188
	
125
	mtspr ibat1u, r30
189
	mtspr ibat1u, r30
126
	mtspr ibat1l, r30
190
	mtspr ibat1l, r30
127
	
191
	
128
	mtspr ibat2u, r30
192
	mtspr ibat2u, r30
129
	mtspr ibat2l, r30
193
	mtspr ibat2l, r30
130
	
194
	
131
	mtspr ibat3u, r30
195
	mtspr ibat3u, r30
132
	mtspr ibat3l, r30
196
	mtspr ibat3l, r30
133
	
197
	
134
	mtspr dbat0u, r30
198
	mtspr dbat0u, r30
135
	mtspr dbat0l, r30
199
	mtspr dbat0l, r30
136
	
200
	
137
	mtspr dbat1u, r30
201
	mtspr dbat1u, r30
138
	mtspr dbat1l, r30
202
	mtspr dbat1l, r30
139
	
203
	
140
	mtspr dbat2u, r30
204
	mtspr dbat2u, r30
141
	mtspr dbat2l, r30
205
	mtspr dbat2l, r30
142
	
206
	
143
	mtspr dbat3u, r30
207
	mtspr dbat3u, r30
144
	mtspr dbat3l, r30
208
	mtspr dbat3l, r30
145
	
209
	
146
	# create identity mapping
210
	# create identity mapping
147
	
211
	
148
	# FIXME: map exactly the size of RAM
212
	# FIXME: map exactly the size of RAM
149
	
213
	
150
	lis r31, 0x8000
214
	lis r31, 0x8000
151
	ori r31, r31, 0x0ffe
215
	ori r31, r31, 0x0ffe
152
	
216
	
153
	lis r30, 0x0000
217
	lis r30, 0x0000
154
	ori r30, r30, 0x0002
218
	ori r30, r30, 0x0002
155
	
219
	
156
	mtspr ibat0u, r31
220
	mtspr ibat0u, r31
157
	mtspr ibat0l, r30
221
	mtspr ibat0l, r30
158
	
222
	
159
	mtspr dbat0u, r31
223
	mtspr dbat0u, r31
160
	mtspr dbat0l, r30
224
	mtspr dbat0l, r30
161
	
225
	
162
	# FIXME: temporal framebuffer mapping
226
	# FIXME: temporal framebuffer mapping
163
	
227
	
164
	lis r31, 0xf000
228
	lis r31, 0xf000
165
	ori r31, r31, 0x0ffe
229
	ori r31, r31, 0x0ffe
166
	
230
	
167
	lis r30, 0x8400
231
	lis r30, 0x8400
168
	ori r30, r30, 0x0002
232
	ori r30, r30, 0x0002
169
	
233
	
170
	mtspr dbat1u, r31
234
	mtspr dbat1u, r31
171
	mtspr dbat1l, r30
235
	mtspr dbat1l, r30
172
	
236
	
173
	tlbia
237
	tlbia
174
	
238
	
175
	# start the kernel
239
	# start the kernel
176
	#
240
	#
177
	# r3 = memmap (pa)
241
	# r3 = memmap (pa)
178
	
242
	
179
	lis r31, KERNEL_START_ADDR@ha
243
	lis r31, KERNEL_START_ADDR@ha
180
	addi r31, r31, KERNEL_START_ADDR@l
244
	addi r31, r31, KERNEL_START_ADDR@l
181
	
245
	
182
	mtspr srr0, r31
246
	mtspr srr0, r31
183
	
247
	
184
	mfmsr r31
248
	mfmsr r31
185
	ori r31, r31, (msr_ir | msr_dr)@l
249
	ori r31, r31, (msr_ir | msr_dr)@l
186
	mtspr srr1, r31
250
	mtspr srr1, r31
187
	
251
	
188
	rfi
252
	rfi
189
 
253
 
190
.align PAGE_WIDTH
254
.align PAGE_WIDTH
191
.global trans
255
.global trans
192
trans:
256
trans:
193
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)
257
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)
194
 
258