Subversion Repositories HelenOS-historic

Rev

Rev 1068 | Rev 1075 | 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
 
914 decky 32
.data
33
 
34
flush_buffer:
933 decky 35
	.space (L1_CACHE_LINES * L1_CACHE_BYTES)
914 decky 36
 
913 decky 37
.text
38
 
1058 decky 39
.global halt
913 decky 40
.global jump_to_kernel
41
 
1058 decky 42
halt:
43
	b halt
913 decky 44
 
45
jump_to_kernel:
1022 decky 46
 
1058 decky 47
	# r3 = memmap (pa)
48
	# r4 = trans (pa)
1068 decky 49
	# r5 = kernel size
1058 decky 50
	# r6 = real_mode (pa)
1022 decky 51
 
1058 decky 52
	mtspr srr0, r6
1022 decky 53
 
54
	# jumps to real_mode
55
 
1058 decky 56
	mfmsr r31
57
	lis r30, ~0@h
58
	ori r30, r30, ~(msr_ir | msr_dr)@l
59
	and r31, r31, r30
60
	mtspr srr1, r31
1022 decky 61
	rfi
62
 
63
.section REALMODE
1058 decky 64
.align PAGE_WIDTH
1022 decky 65
.global real_mode
66
 
67
real_mode:
1058 decky 68
 
69
	# copy kernel to proper location
70
	#
71
	# r4 = trans (pa)
1068 decky 72
	# r5 = kernel size
1058 decky 73
 
1068 decky 74
	li r31, PAGE_SIZE >> 2
1058 decky 75
	li r30, 0
76
 
77
	page_copy:
78
 
79
		cmpwi r5, 0
80
		beq copy_end
81
 
1068 decky 82
		# copy page
1058 decky 83
 
84
		mtctr r31
85
		lwz r29, 0(r4)
86
 
87
		copy_loop:
88
 
89
			lwz r28, 0(r29)
90
			stw r28, 0(r30)
91
 
92
			addi r29, r29, 4
93
			addi r30, r30, 4
1068 decky 94
			subi r5, r5, 4
1058 decky 95
 
1068 decky 96
			cmpwi r5, 0
97
			beq copy_end
98
 
1058 decky 99
			bdnz copy_loop
100
 
101
		addi r4, r4, 4
102
		b page_copy
103
 
104
	copy_end:
1068 decky 105
 
106
	# invalidate segment registers
1022 decky 107
 
1071 decky 108
	li r31, 16
109
	mtctr r31
110
	li r31, 0
111
	li r30, 0
112
 
1022 decky 113
	seg_fill:
114
 
1071 decky 115
		mtsrin r30, r31
116
		addis r31, r31, 0x1000    # move to next SR
117
 
118
		bdnz seg_fill
1022 decky 119
 
1068 decky 120
	# invalidate block address translation registers
121
 
122
	mtspr ibat0u, r30
123
	mtspr ibat0l, r30
124
 
125
	mtspr ibat1u, r30
126
	mtspr ibat1l, r30
127
 
128
	mtspr ibat2u, r30
129
	mtspr ibat2l, r30
130
 
131
	mtspr ibat3u, r30
132
	mtspr ibat3l, r30
133
 
134
	mtspr dbat0u, r30
135
	mtspr dbat0l, r30
136
 
137
	mtspr dbat1u, r30
138
	mtspr dbat1l, r30
139
 
140
	mtspr dbat2u, r30
141
	mtspr dbat2l, r30
142
 
143
	mtspr dbat3u, r30
144
	mtspr dbat3l, r30
145
 
1058 decky 146
	# create identity mapping
147
 
1068 decky 148
	# FIXME: map exactly the size of RAM
149
 
150
	lis r31, 0x8000
151
	ori r31, r31, 0x0ffe
152
 
153
	lis r30, 0x0000
154
	ori r30, r30, 0x0002
155
 
156
	mtspr ibat0u, r31
157
	mtspr ibat0l, r30
158
 
159
	mtspr dbat0u, r31
160
	mtspr dbat0l, r30
161
 
162
	# FIXME: temporal framebuffer mapping
163
 
164
	lis r31, 0xf000
165
	ori r31, r31, 0x0ffe
166
 
167
	lis r30, 0x8400
168
	ori r30, r30, 0x0002
169
 
170
	mtspr dbat1u, r31
171
	mtspr dbat1l, r30
172
 
1058 decky 173
	tlbia
174
 
175
	# start the kernel
1022 decky 176
	#
1058 decky 177
	# r3 = memmap (pa)
1022 decky 178
 
1058 decky 179
	lis r31, KERNEL_START_ADDR@ha
180
	addi r31, r31, KERNEL_START_ADDR@l
1022 decky 181
 
1058 decky 182
	mtspr srr0, r31
1022 decky 183
 
1058 decky 184
	mfmsr r31
185
	ori r31, r31, (msr_ir | msr_dr)@l
186
	mtspr srr1, r31
187
 
1022 decky 188
	rfi
1058 decky 189
 
190
.align PAGE_WIDTH
191
.global trans
192
trans:
193
	.space (TRANS_SIZE * TRANS_ITEM_SIZE)