Subversion Repositories HelenOS-historic

Rev

Rev 1381 | Rev 1479 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
913 decky 1
#
2
# Copyright (C) 2006 Martin 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:
1478 decky 142
 
143
	DEBUG_real_mode
1058 decky 144
 
145
	# copy kernel to proper location
146
	#
1131 decky 147
	# r5 = trans (pa)
1372 decky 148
	# r6 = bytes to copy
1478 decky 149
	# r8 = framebuffer (pa)
150
	# r9 = scanline
1058 decky 151
 
1068 decky 152
	li r31, PAGE_SIZE >> 2
1058 decky 153
	li r30, 0
154
 
155
	page_copy:
156
 
1131 decky 157
		cmpwi r6, 0
1058 decky 158
		beq copy_end
159
 
1068 decky 160
		# copy page
1058 decky 161
 
162
		mtctr r31
1131 decky 163
		lwz r29, 0(r5)
1058 decky 164
 
165
		copy_loop:
166
 
167
			lwz r28, 0(r29)
168
			stw r28, 0(r30)
169
 
170
			addi r29, r29, 4
171
			addi r30, r30, 4
1131 decky 172
			subi r6, r6, 4
1058 decky 173
 
1131 decky 174
			cmpwi r6, 0
1068 decky 175
			beq copy_end
176
 
1058 decky 177
			bdnz copy_loop
178
 
1131 decky 179
		addi r5, r5, 4
1058 decky 180
		b page_copy
181
 
182
	copy_end:
1068 decky 183
 
1214 decky 184
	# initially fill segment registers
1022 decky 185
 
1071 decky 186
	li r31, 16
187
	mtctr r31
188
	li r31, 0
1214 decky 189
	li r30, 0x2000
1071 decky 190
 
1022 decky 191
	seg_fill:
192
 
1071 decky 193
		mtsrin r30, r31
1214 decky 194
		addi r30, r30, 0x111
1071 decky 195
		addis r31, r31, 0x1000    # move to next SR
196
 
197
		bdnz seg_fill
1022 decky 198
 
1068 decky 199
	# invalidate block address translation registers
200
 
1373 decky 201
	li r30, 0
202
 
1068 decky 203
	mtspr ibat0u, r30
204
	mtspr ibat0l, r30
205
 
206
	mtspr ibat1u, r30
207
	mtspr ibat1l, r30
208
 
209
	mtspr ibat2u, r30
210
	mtspr ibat2l, r30
211
 
212
	mtspr ibat3u, r30
213
	mtspr ibat3l, r30
214
 
215
	mtspr dbat0u, r30
216
	mtspr dbat0l, r30
217
 
218
	mtspr dbat1u, r30
219
	mtspr dbat1l, r30
220
 
221
	mtspr dbat2u, r30
222
	mtspr dbat2l, r30
223
 
224
	mtspr dbat3u, r30
225
	mtspr dbat3l, r30
226
 
1058 decky 227
	# create identity mapping
228
 
1068 decky 229
	# FIXME: map exactly the size of RAM
230
 
231
	lis r31, 0x8000
232
	ori r31, r31, 0x0ffe
233
 
234
	lis r30, 0x0000
235
	ori r30, r30, 0x0002
236
 
237
	mtspr ibat0u, r31
238
	mtspr ibat0l, r30
239
 
240
	mtspr dbat0u, r31
241
	mtspr dbat0l, r30
242
 
1058 decky 243
	tlbia
1381 decky 244
	tlbsync
1058 decky 245
 
246
	# start the kernel
1022 decky 247
	#
1131 decky 248
	# r3 = bootinfo (pa)
1022 decky 249
 
1058 decky 250
	lis r31, KERNEL_START_ADDR@ha
251
	addi r31, r31, KERNEL_START_ADDR@l
1022 decky 252
 
1058 decky 253
	mtspr srr0, r31
1022 decky 254
 
1058 decky 255
	mfmsr r31
256
	ori r31, r31, (msr_ir | msr_dr)@l
257
	mtspr srr1, r31
258
 
1146 decky 259
	sync
260
	isync
1478 decky 261
 
262
	DEBUG_rfi
1022 decky 263
	rfi
1058 decky 264
 
265
.align PAGE_WIDTH
266
.global trans
267
trans:
268
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)