Subversion Repositories HelenOS

Rev

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