Subversion Repositories HelenOS-historic

Rev

Rev 1373 | Rev 1478 | 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"
31
 
32
.text
33
 
1058 decky 34
.global halt
1075 decky 35
.global memcpy
913 decky 36
.global jump_to_kernel
37
 
1058 decky 38
halt:
39
	b halt
913 decky 40
 
1075 decky 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
 
913 decky 104
jump_to_kernel:
1022 decky 105
 
1131 decky 106
	# r3 = bootinfo (pa)
107
	# r4 = bootinfo_size
108
	# r5 = trans (pa)
1372 decky 109
	# r6 = bytes to copy
110
	# r7 = real_mode (pa)
1022 decky 111
 
1216 decky 112
	# disable interrupts
113
 
114
	mfmsr r31
115
	rlwinm r31, r31, 0, 17, 15
116
	mtmsr r31
117
 
118
	# set real_mode meeting point address
119
 
1372 decky 120
	mtspr srr0, r7
1022 decky 121
 
122
	# jumps to real_mode
123
 
1058 decky 124
	mfmsr r31
125
	lis r30, ~0@h
126
	ori r30, r30, ~(msr_ir | msr_dr)@l
127
	and r31, r31, r30
128
	mtspr srr1, r31
1157 decky 129
 
130
	sync
131
	isync
1022 decky 132
	rfi
133
 
1214 decky 134
.section REALMODE, "ax"
1058 decky 135
.align PAGE_WIDTH
1022 decky 136
.global real_mode
137
 
138
real_mode:
1058 decky 139
 
140
	# copy kernel to proper location
141
	#
1131 decky 142
	# r5 = trans (pa)
1372 decky 143
	# r6 = bytes to copy
1058 decky 144
 
1068 decky 145
	li r31, PAGE_SIZE >> 2
1058 decky 146
	li r30, 0
147
 
148
	page_copy:
149
 
1131 decky 150
		cmpwi r6, 0
1058 decky 151
		beq copy_end
152
 
1068 decky 153
		# copy page
1058 decky 154
 
155
		mtctr r31
1131 decky 156
		lwz r29, 0(r5)
1058 decky 157
 
158
		copy_loop:
159
 
160
			lwz r28, 0(r29)
161
			stw r28, 0(r30)
162
 
163
			addi r29, r29, 4
164
			addi r30, r30, 4
1131 decky 165
			subi r6, r6, 4
1058 decky 166
 
1131 decky 167
			cmpwi r6, 0
1068 decky 168
			beq copy_end
169
 
1058 decky 170
			bdnz copy_loop
171
 
1131 decky 172
		addi r5, r5, 4
1058 decky 173
		b page_copy
174
 
175
	copy_end:
1068 decky 176
 
1214 decky 177
	# initially fill segment registers
1022 decky 178
 
1071 decky 179
	li r31, 16
180
	mtctr r31
181
	li r31, 0
1214 decky 182
	li r30, 0x2000
1071 decky 183
 
1022 decky 184
	seg_fill:
185
 
1071 decky 186
		mtsrin r30, r31
1214 decky 187
		addi r30, r30, 0x111
1071 decky 188
		addis r31, r31, 0x1000    # move to next SR
189
 
190
		bdnz seg_fill
1022 decky 191
 
1068 decky 192
	# invalidate block address translation registers
193
 
1373 decky 194
	li r30, 0
195
 
1068 decky 196
	mtspr ibat0u, r30
197
	mtspr ibat0l, r30
198
 
199
	mtspr ibat1u, r30
200
	mtspr ibat1l, r30
201
 
202
	mtspr ibat2u, r30
203
	mtspr ibat2l, r30
204
 
205
	mtspr ibat3u, r30
206
	mtspr ibat3l, r30
207
 
208
	mtspr dbat0u, r30
209
	mtspr dbat0l, r30
210
 
211
	mtspr dbat1u, r30
212
	mtspr dbat1l, r30
213
 
214
	mtspr dbat2u, r30
215
	mtspr dbat2l, r30
216
 
217
	mtspr dbat3u, r30
218
	mtspr dbat3l, r30
219
 
1058 decky 220
	# create identity mapping
221
 
1068 decky 222
	# FIXME: map exactly the size of RAM
223
 
224
	lis r31, 0x8000
225
	ori r31, r31, 0x0ffe
226
 
227
	lis r30, 0x0000
228
	ori r30, r30, 0x0002
229
 
230
	mtspr ibat0u, r31
231
	mtspr ibat0l, r30
232
 
233
	mtspr dbat0u, r31
234
	mtspr dbat0l, r30
235
 
1058 decky 236
	tlbia
1381 decky 237
	tlbsync
1058 decky 238
 
239
	# start the kernel
1022 decky 240
	#
1131 decky 241
	# r3 = bootinfo (pa)
1022 decky 242
 
1058 decky 243
	lis r31, KERNEL_START_ADDR@ha
244
	addi r31, r31, KERNEL_START_ADDR@l
1022 decky 245
 
1058 decky 246
	mtspr srr0, r31
1022 decky 247
 
1058 decky 248
	mfmsr r31
249
	ori r31, r31, (msr_ir | msr_dr)@l
250
	mtspr srr1, r31
251
 
1146 decky 252
	sync
253
	isync
1022 decky 254
	rfi
1058 decky 255
 
256
.align PAGE_WIDTH
257
.global trans
258
trans:
259
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)