Subversion Repositories HelenOS

Rev

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

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