Subversion Repositories HelenOS

Rev

Rev 1787 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1787 Rev 1800
Line 26... Line 26...
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
#include "asm.h"
29
#include "asm.h"
30
#include "regname.h"
30
#include "regname.h"
-
 
31
#include "debug.inc"
31
 
32
 
32
.text
33
.text
33
 
34
 
34
.global halt
35
.global halt
35
.global memcpy
36
.global memcpy
Line 106... Line 107...
106
	# r3 = bootinfo (pa)
107
	# r3 = bootinfo (pa)
107
	# r4 = bootinfo_size
108
	# r4 = bootinfo_size
108
	# r5 = trans (pa)
109
	# r5 = trans (pa)
109
	# r6 = bytes to copy
110
	# r6 = bytes to copy
110
	# r7 = real_mode (pa)
111
	# r7 = real_mode (pa)
-
 
112
	# r8 = framebuffer (pa)
-
 
113
	# r9 = scanline
111
	
114
	
112
	# disable interrupts
115
	# disable interrupts
113
	
116
	
114
	mfmsr r31
117
	mfmsr r31
115
	rlwinm r31, r31, 0, 17, 15
118
	rlwinm r31, r31, 0, 17, 15
Line 135... Line 138...
135
.align PAGE_WIDTH
138
.align PAGE_WIDTH
136
.global real_mode
139
.global real_mode
137
 
140
 
138
real_mode:
141
real_mode:
139
	
142
	
-
 
143
	DEBUG_INIT
-
 
144
	DEBUG_real_mode
-
 
145
	
140
	# copy kernel to proper location
146
	# copy kernel to proper location
141
	#
147
	#
142
	# r5 = trans (pa)
148
	# r5 = trans (pa)
143
	# r6 = bytes to copy
149
	# r6 = bytes to copy
-
 
150
	# r8 = framebuffer (pa)
-
 
151
	# r9 = scanline
144
	
152
	
145
	li r31, PAGE_SIZE >> 2
153
	li r31, PAGE_SIZE >> 2
146
	li r30, 0
154
	li r30, 0
147
	
155
	
148
	page_copy:
156
	page_copy:
Line 153... Line 161...
153
		# copy page
161
		# copy page
154
		
162
		
155
		mtctr r31
163
		mtctr r31
156
		lwz r29, 0(r5)
164
		lwz r29, 0(r5)
157
		
165
		
-
 
166
		DEBUG_INIT
-
 
167
		DEBUG_copy_loop
-
 
168
		
158
		copy_loop:
169
		copy_loop:
159
			
170
			
160
			lwz r28, 0(r29)
171
			lwz r28, 0(r29)
161
			stw r28, 0(r30)
172
			stw r28, 0(r30)
162
			
173
			
Line 166... Line 177...
166
			
177
			
167
			cmpwi r6, 0
178
			cmpwi r6, 0
168
			beq copy_end
179
			beq copy_end
169
			
180
			
170
			bdnz copy_loop
181
			bdnz copy_loop
-
 
182
			
-
 
183
			DEBUG_end_copy_loop
171
		
184
		
172
		addi r5, r5, 4
185
		addi r5, r5, 4
173
		b page_copy
186
		b page_copy
174
	
187
	
175
	copy_end:
188
	copy_end:
176
	
189
	
-
 
190
	DEBUG_segments
-
 
191
	
177
	# initially fill segment registers
192
	# initially fill segment registers
178
 
193
	
179
	li r31, 16
-
 
180
	mtctr r31
-
 
181
	li r31, 0
194
	li r31, 0
-
 
195
	
182
	li r30, 0x2000
196
	li r29, 8
-
 
197
	mtctr r29
-
 
198
	li r30, 0                     # ASID 0 (VSIDs 0 .. 7)
183
 
199
 
184
	seg_fill:
200
	seg_fill_uspace:
-
 
201
	
-
 
202
		mtsrin r30, r31
-
 
203
		addi r30, r30, 1
-
 
204
		addis r31, r31, 0x1000    # move to next SR
-
 
205
		
-
 
206
		bdnz seg_fill_uspace
-
 
207
	
-
 
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:
185
	
214
	
186
		mtsrin r30, r31
215
		mtsrin r30, r31
187
		addi r30, r30, 0x111
216
		addi r30, r30, 1
188
		addis r31, r31, 0x1000    # move to next SR
217
		addis r31, r31, 0x1000    # move to next SR
189
		
218
		
190
		bdnz seg_fill
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
191
	
261
	
192
	tlbia
262
	tlbia
193
	tlbsync
263
	tlbsync
194
	
264
	
-
 
265
	DEBUG_prepare
-
 
266
	
195
	# start the kernel
267
	# start the kernel
196
	#
268
	#
-
 
269
	# pc = KERNEL_START_ADDR
197
	# r3 = bootinfo (pa)
270
	# r3 = bootinfo (pa)
-
 
271
	# sprg0 = KA2PA(KERNEL_START_ADDR)
-
 
272
	# sprg3 = physical memory size
-
 
273
	# sp = 0 (pa)
198
	
274
	
199
	lis r31, KERNEL_START_ADDR@ha
275
	lis r31, KERNEL_START_ADDR@ha
200
	addi r31, r31, KERNEL_START_ADDR@l
276
	addi r31, r31, KERNEL_START_ADDR@l
201
	
277
	
202
	mtspr srr0, r31
278
	mtspr srr0, r31
203
	
279
	
-
 
280
	subis r31, r31, 0x8000
-
 
281
	mtsprg0 r31
-
 
282
	
-
 
283
	lwz r31, 0(r3)
-
 
284
	mtsprg3 r31
-
 
285
	
-
 
286
	li sp, 0
-
 
287
	
204
	mfmsr r31
288
	mfmsr r31
205
	ori r31, r31, (msr_ir | msr_dr)@l
289
	ori r31, r31, (msr_ir | msr_dr)@l
206
	mtspr srr1, r31
290
	mtspr srr1, r31
207
	
291
	
208
	sync
292
	sync
209
	isync
293
	isync
-
 
294
	
-
 
295
	DEBUG_rfi
210
	rfid
296
	rfid
211
 
297
 
212
.align PAGE_WIDTH
298
.align PAGE_WIDTH
213
.global trans
299
.global trans
214
trans:
300
trans: