Subversion Repositories HelenOS

Rev

Rev 2071 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
913 decky 1
#
2071 jermar 2
# Copyright (c) 2006 Martin Decky
913 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
 
1058 decky 29
#include "asm.h"
913 decky 30
#include "regname.h"
1478 decky 31
#include "debug.inc"
913 decky 32
 
33
.text
34
 
1058 decky 35
.global halt
1075 decky 36
.global memcpy
913 decky 37
.global jump_to_kernel
38
 
1058 decky 39
halt:
40
	b halt
913 decky 41
 
1075 decky 42
memcpy:
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
 
913 decky 105
jump_to_kernel:
1022 decky 106
 
1131 decky 107
	# r3 = bootinfo (pa)
108
	# r4 = bootinfo_size
109
	# r5 = trans (pa)
1372 decky 110
	# r6 = bytes to copy
111
	# r7 = real_mode (pa)
1478 decky 112
	# r8 = framebuffer (pa)
113
	# r9 = scanline
1022 decky 114
 
1216 decky 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
 
1372 decky 123
	mtspr srr0, r7
1022 decky 124
 
125
	# jumps to real_mode
126
 
1058 decky 127
	mfmsr r31
128
	lis r30, ~0@h
1478 decky 129
	ori r30, r30, ~(msr_ir | msr_dr | msr_ee)@l
1058 decky 130
	and r31, r31, r30
131
	mtspr srr1, r31
1157 decky 132
 
133
	sync
134
	isync
1022 decky 135
	rfi
136
 
1214 decky 137
.section REALMODE, "ax"
1058 decky 138
.align PAGE_WIDTH
1022 decky 139
.global real_mode
140
 
141
real_mode:
1479 decky 142
 
143
	DEBUG_INIT
1478 decky 144
	DEBUG_real_mode
1058 decky 145
 
146
	# copy kernel to proper location
147
	#
1131 decky 148
	# r5 = trans (pa)
1372 decky 149
	# r6 = bytes to copy
1478 decky 150
	# r8 = framebuffer (pa)
151
	# r9 = scanline
1058 decky 152
 
1068 decky 153
	li r31, PAGE_SIZE >> 2
1058 decky 154
	li r30, 0
155
 
156
	page_copy:
157
 
1131 decky 158
		cmpwi r6, 0
1058 decky 159
		beq copy_end
160
 
1068 decky 161
		# copy page
1058 decky 162
 
163
		mtctr r31
1131 decky 164
		lwz r29, 0(r5)
1058 decky 165
 
1479 decky 166
		DEBUG_INIT
167
		DEBUG_copy_loop
168
 
1058 decky 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
1131 decky 176
			subi r6, r6, 4
1058 decky 177
 
1131 decky 178
			cmpwi r6, 0
1068 decky 179
			beq copy_end
180
 
1058 decky 181
			bdnz copy_loop
1479 decky 182
 
183
			DEBUG_end_copy_loop
1058 decky 184
 
1131 decky 185
		addi r5, r5, 4
1058 decky 186
		b page_copy
187
 
188
	copy_end:
1068 decky 189
 
1479 decky 190
	DEBUG_segments
191
 
1214 decky 192
	# initially fill segment registers
1728 decky 193
 
1071 decky 194
	li r31, 0
1728 decky 195
 
196
	li r29, 8
197
	mtctr r29
1737 decky 198
	li r30, 0                     # ASID 0 (VSIDs 0 .. 7)
1071 decky 199
 
1728 decky 200
	seg_fill_uspace:
1022 decky 201
 
1071 decky 202
		mtsrin r30, r31
1728 decky 203
		addi r30, r30, 1
1071 decky 204
		addis r31, r31, 0x1000    # move to next SR
205
 
1728 decky 206
		bdnz seg_fill_uspace
1022 decky 207
 
1728 decky 208
	li r29, 8
209
	mtctr r29
1737 decky 210
	lis r30, 0x4000               # priviledged access only
211
	ori r30, r30, 8               # ASID 0 (VSIDs 8 .. 15)
1728 decky 212
 
213
	seg_fill_kernel:
214
 
215
		mtsrin r30, r31
216
		addi r30, r30, 1
217
		addis r31, r31, 0x1000    # move to next SR
218
 
219
		bdnz seg_fill_kernel
220
 
1068 decky 221
	# invalidate block address translation registers
222
 
1479 decky 223
	DEBUG_bat
224
 
1373 decky 225
	li r30, 0
226
 
1068 decky 227
	mtspr ibat0u, r30
228
	mtspr ibat0l, r30
229
 
230
	mtspr ibat1u, r30
231
	mtspr ibat1l, r30
232
 
233
	mtspr ibat2u, r30
234
	mtspr ibat2l, r30
235
 
236
	mtspr ibat3u, r30
237
	mtspr ibat3l, r30
238
 
239
	mtspr dbat0u, r30
240
	mtspr dbat0l, r30
241
 
242
	mtspr dbat1u, r30
243
	mtspr dbat1l, r30
244
 
245
	mtspr dbat2u, r30
246
	mtspr dbat2l, r30
247
 
248
	mtspr dbat3u, r30
249
	mtspr dbat3l, r30
250
 
1738 decky 251
	# create empty Page Hash Table
252
	# on top of memory, size 64 KB
1725 decky 253
 
254
	DEBUG_pht
255
 
1738 decky 256
	lwz r31, 0(r3)                # r31 = memory size
1725 decky 257
 
1738 decky 258
	lis r30, 65536@h
259
	ori r30, r30, 65536@l         # r30 = 65536
260
 
261
	subi r29, r30, 1              # r29 = 65535
262
 
263
	sub r31, r31, r30
264
	andc r31, r31, r29            # pht = ALIGN_DOWN(memory_size - 65536, 65536)
265
 
266
	mtsdr1 r31
267
 
268
	li r29, 2
269
	srw r30, r30, r29             # r30 = 16384
1728 decky 270
	li r29, 0
271
 
272
	pht_clear:
273
 
1737 decky 274
		# write zeroes
275
 
1728 decky 276
		stw r29, 0(r31)
277
 
278
		addi r31, r31, 4
279
		subi r30, r30, 4
280
 
281
		cmpwi r30, 0
282
		beq clear_end
283
 
284
		bdnz pht_clear
285
 
286
		DEBUG_end_pht_clear
287
 
288
	clear_end:
289
 
290
#ifdef CONFIG_BAT
291
 
1737 decky 292
	# create BAT identity mapping
293
 
1479 decky 294
	DEBUG_mapping
295
 
1738 decky 296
	lwz r31, 0(r3)                # r31 = memory size
1068 decky 297
 
1737 decky 298
	lis r29, 0x0002
299
	cmpw r31, r29
300
	blt no_bat                    # less than 128 KB -> no BAT
1068 decky 301
 
1737 decky 302
	li r29, 18
303
	srw r31, r31, r29             # r31 = total >> 18
304
 
305
	# create Block Length mask by replicating
306
	# the leading logical one 14 times
307
 
308
	li r29, 14
309
	mtctr r31
310
	li r29, 1
311
 
312
	bat_mask:
313
		srw r30, r31, r29         # r30 = mask >> 1
314
		or r31, r31, r30          # mask = mask | r30
315
 
316
		bdnz bat_mask
317
 
1739 decky 318
	DEBUG_bat_mask
319
 
1737 decky 320
	andi. r31, r31, 0x07ff        # mask = mask & 0x07ff (BAT can map up to 256 MB)
321
 
322
	li r29, 2
323
	slw r31, r31, r29             # mask = mask << 2
324
	ori r31, r31, 0x0002          # mask = mask | 0x0002 (priviledged access only)
325
 
326
	lis r29, 0x8000
327
	or r29, r29, r31
328
 
1068 decky 329
	lis r30, 0x0000
330
	ori r30, r30, 0x0002
331
 
1737 decky 332
	mtspr ibat0u, r29
1068 decky 333
	mtspr ibat0l, r30
334
 
1737 decky 335
	mtspr dbat0u, r29
1068 decky 336
	mtspr dbat0l, r30
1737 decky 337
 
338
	no_bat:
1728 decky 339
 
340
#endif
1068 decky 341
 
1479 decky 342
	DEBUG_tlb
343
 
1058 decky 344
	tlbia
1381 decky 345
	tlbsync
1058 decky 346
 
1479 decky 347
	DEBUG_prepare
348
 
1058 decky 349
	# start the kernel
1022 decky 350
	#
1728 decky 351
	# pc = KERNEL_START_ADDR
1131 decky 352
	# r3 = bootinfo (pa)
1728 decky 353
	# sprg0 = KA2PA(KERNEL_START_ADDR)
354
	# sprg3 = physical memory size
355
	# sp = 0 (pa)
1022 decky 356
 
1058 decky 357
	lis r31, KERNEL_START_ADDR@ha
358
	addi r31, r31, KERNEL_START_ADDR@l
1022 decky 359
 
1058 decky 360
	mtspr srr0, r31
1022 decky 361
 
1728 decky 362
	subis r31, r31, 0x8000
363
	mtsprg0 r31
364
 
365
	lwz r31, 0(r3)
366
	mtsprg3 r31
367
 
368
	li sp, 0
369
 
1058 decky 370
	mfmsr r31
371
	ori r31, r31, (msr_ir | msr_dr)@l
372
	mtspr srr1, r31
373
 
1146 decky 374
	sync
375
	isync
1478 decky 376
 
377
	DEBUG_rfi
1022 decky 378
	rfi
1058 decky 379
 
380
.align PAGE_WIDTH
381
.global trans
382
trans:
383
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)