Subversion Repositories HelenOS

Rev

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

Rev Author Line No. Line
1157 decky 1
#
2071 jermar 2
# Copyright (c) 2006 Martin Decky
1157 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"
1800 decky 31
#include "debug.inc"
1157 decky 32
 
33
.text
34
 
35
.global halt
36
.global memcpy
37
.global jump_to_kernel
38
 
39
halt:
40
	b halt
41
 
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
 
105
jump_to_kernel:
106
 
107
	# r3 = bootinfo (pa)
108
	# r4 = bootinfo_size
109
	# r5 = trans (pa)
1395 decky 110
	# r6 = bytes to copy
111
	# r7 = real_mode (pa)
1800 decky 112
	# r8 = framebuffer (pa)
113
	# r9 = scanline
1157 decky 114
 
1395 decky 115
	# disable interrupts
1157 decky 116
 
1395 decky 117
	mfmsr r31
118
	rlwinm r31, r31, 0, 17, 15
119
	mtmsr r31
120
 
121
	# set real_mode meeting point address
122
 
123
	mtspr srr0, r7
124
 
1157 decky 125
	# jumps to real_mode
126
 
1166 decky 127
	mfmsr r31
1157 decky 128
	lis r30, ~0@h
129
	ori r30, r30, ~(msr_ir | msr_dr)@l
130
	and r31, r31, r30
131
	mtspr srr1, r31
132
 
133
	sync
134
	isync
135
	rfid
136
 
1395 decky 137
.section REALMODE, "ax"
1157 decky 138
.align PAGE_WIDTH
139
.global real_mode
140
 
141
real_mode:
142
 
1800 decky 143
	DEBUG_INIT
144
	DEBUG_real_mode
145
 
1157 decky 146
	# copy kernel to proper location
147
	#
148
	# r5 = trans (pa)
1395 decky 149
	# r6 = bytes to copy
1800 decky 150
	# r8 = framebuffer (pa)
151
	# r9 = scanline
1157 decky 152
 
153
	li r31, PAGE_SIZE >> 2
154
	li r30, 0
155
 
156
	page_copy:
157
 
158
		cmpwi r6, 0
159
		beq copy_end
160
 
161
		# copy page
162
 
163
		mtctr r31
164
		lwz r29, 0(r5)
165
 
1800 decky 166
		DEBUG_INIT
167
		DEBUG_copy_loop
168
 
1157 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
176
			subi r6, r6, 4
177
 
178
			cmpwi r6, 0
179
			beq copy_end
180
 
181
			bdnz copy_loop
1800 decky 182
 
183
			DEBUG_end_copy_loop
1157 decky 184
 
185
		addi r5, r5, 4
186
		b page_copy
187
 
188
	copy_end:
189
 
1800 decky 190
	DEBUG_segments
191
 
1395 decky 192
	# initially fill segment registers
1800 decky 193
 
1157 decky 194
	li r31, 0
1800 decky 195
 
196
	li r29, 8
197
	mtctr r29
198
	li r30, 0                     # ASID 0 (VSIDs 0 .. 7)
1157 decky 199
 
1800 decky 200
	seg_fill_uspace:
1157 decky 201
 
202
		mtsrin r30, r31
1800 decky 203
		addi r30, r30, 1
1157 decky 204
		addis r31, r31, 0x1000    # move to next SR
205
 
1800 decky 206
		bdnz seg_fill_uspace
1157 decky 207
 
1800 decky 208
	li r29, 8
209
	mtctr r29
210
	lis r30, 0x4000               # priviledged access only
211
	ori r30, r30, 8               # ASID 0 (VSIDs 8 .. 15)
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
 
221
	# create empty Page Hash Table
222
	# on top of memory, size 64 KB
223
 
224
	DEBUG_pht
225
 
226
	lwz r31, 0(r3)                # r31 = memory size
227
 
228
	lis r30, 65536@h
229
	ori r30, r30, 65536@l         # r30 = 65536
230
 
231
	subi r29, r30, 1              # r29 = 65535
232
 
233
	sub r31, r31, r30
234
	andc r31, r31, r29            # pht = ALIGN_DOWN(memory_size - 65536, 65536)
235
 
236
	mtsdr1 r31
237
 
238
	li r29, 2
239
	srw r30, r30, r29             # r30 = 16384
240
	li r29, 0
241
 
242
	pht_clear:
243
 
244
		# write zeroes
245
 
246
		stw r29, 0(r31)
247
 
248
		addi r31, r31, 4
249
		subi r30, r30, 4
250
 
251
		cmpwi r30, 0
252
		beq clear_end
253
 
254
		bdnz pht_clear
255
 
256
		DEBUG_end_pht_clear
257
 
258
	clear_end:
259
 
260
	DEBUG_tlb
261
 
1157 decky 262
	tlbia
1395 decky 263
	tlbsync
1157 decky 264
 
1800 decky 265
	DEBUG_prepare
266
 
1157 decky 267
	# start the kernel
268
	#
1800 decky 269
	# pc = KERNEL_START_ADDR
1157 decky 270
	# r3 = bootinfo (pa)
1800 decky 271
	# sprg0 = KA2PA(KERNEL_START_ADDR)
272
	# sprg3 = physical memory size
273
	# sp = 0 (pa)
1157 decky 274
 
275
	lis r31, KERNEL_START_ADDR@ha
276
	addi r31, r31, KERNEL_START_ADDR@l
277
 
278
	mtspr srr0, r31
279
 
1800 decky 280
	subis r31, r31, 0x8000
281
	mtsprg0 r31
282
 
283
	lwz r31, 0(r3)
284
	mtsprg3 r31
285
 
286
	li sp, 0
287
 
1166 decky 288
	mfmsr r31
1157 decky 289
	ori r31, r31, (msr_ir | msr_dr)@l
290
	mtspr srr1, r31
291
 
292
	sync
293
	isync
1800 decky 294
 
295
	DEBUG_rfi
1157 decky 296
	rfid
297
 
298
.align PAGE_WIDTH
299
.global trans
300
trans:
301
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)