Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include	"mem.h"
2
 
3
/* use of SPRG registers in save/restore */
4
#define	SAVER0	SPRG0
5
#define	SAVER1	SPRG1
6
#define	SAVELR	SPRG2
7
#define	SAVEXX	SPRG3
8
 
9
/* special instruction definitions */
10
#define	BDNZ	BC	16,0,
11
#define	BDNE	BC	0,2,
12
 
13
#define	TLBIA	WORD	$((31<<26)|(307<<1))
14
#define	TLBSYNC	WORD	$((31<<26)|(566<<1))
15
 
16
/* on some models mtmsr doesn't synchronise enough (eg, 603e) */
17
#define	MSRSYNC	SYNC; ISYNC
18
 
19
#define	UREGSPACE	(UREGSIZE+8)
20
 
21
	TEXT start(SB), $-4
22
 
23
	/*
24
	 * setup MSR
25
	 * turn off interrupts
26
	 * use 0x000 as exception prefix
27
	 * enable machine check
28
	 */
29
	MOVW	MSR, R3
30
	MOVW	$(MSR_EE|MSR_IP), R4
31
	ANDN	R4, R3
32
	OR		$(MSR_ME), R3
33
	ISYNC
34
	MOVW	R3, MSR
35
	MSRSYNC
36
 
37
	/* except during trap handling, R0 is zero from now on */
38
	MOVW	$0, R0
39
 
40
	/* setup SB for pre mmu */
41
	MOVW	$setSB(SB), R2
42
	MOVW	$KZERO, R3
43
	ANDN	R3, R2
44
 
45
	BL	mmuinit0(SB)
46
 
47
	/* running with MMU on!! */
48
 
49
	/* set R2 to correct value */
50
	MOVW	$setSB(SB), R2
51
 
52
	/* debugger sets R1 to top of usable memory +1 */
53
	MOVW R1, memsize(SB)
54
 
55
	BL		kfpinit(SB)
56
 
57
	/* set up Mach */
58
	MOVW	$mach0(SB), R(MACH)
59
	ADD	$(MACHSIZE-8), R(MACH), R1	/* set stack */
60
 
61
	MOVW	R0, R(USER)
62
	MOVW	R0, 0(R(MACH))
63
 
64
	BL	main(SB)
65
 
66
	RETURN		/* not reached */
67
 
68
GLOBL	mach0(SB), $(MAXMACH*BY2PG)
69
GLOBL	memsize(SB), $4
70
 
71
/*
72
 * on return from this function we will be running in virtual mode.
73
 * We set up the Block Address Translation (BAT) registers thus:
74
 * 1) first 3 BATs are 256M blocks, starting from KZERO->0
75
 * 2) remaining BAT maps last 256M directly
76
 */
77
TEXT	mmuinit0(SB), $0
78
	/* reset all the tlbs */
79
	MOVW	$64, R3
80
	MOVW	R3, CTR
81
	MOVW	$0, R4
82
tlbloop:
83
	TLBIE	R4
84
	ADD		$BIT(19), R4
85
	BDNZ	tlbloop
86
	TLBSYNC
87
 
88
	/* KZERO -> 0 */
89
	MOVW	$(KZERO|(0x7ff<<2)|2), R3
90
	MOVW	$(PTEVALID|PTEWRITE), R4
91
	MOVW	R3, SPR(IBATU(0))
92
	MOVW	R4, SPR(IBATL(0))
93
	MOVW	R3, SPR(DBATU(0))
94
	MOVW	R4, SPR(DBATL(0))
95
 
96
	/* KZERO+256M -> 256M */
97
	ADD		$(1<<28), R3
98
	ADD		$(1<<28), R4
99
	MOVW	R3, SPR(IBATU(1))
100
	MOVW	R4, SPR(IBATL(1))
101
	MOVW	R3, SPR(DBATU(1))
102
	MOVW	R4, SPR(DBATL(1))
103
 
104
	/* KZERO+512M -> 512M */
105
	ADD		$(1<<28), R3
106
	ADD		$(1<<28), R4
107
	MOVW	R3, SPR(IBATU(2))
108
	MOVW	R4, SPR(IBATL(2))
109
	MOVW	R3, SPR(DBATU(2))
110
	MOVW	R4, SPR(DBATL(2))
111
 
112
	/* direct map last block, uncached, (?guarded) */
113
	MOVW	$((0xf<<28)|(0x7ff<<2)|2), R3
114
	MOVW	$((0xf<<28)|PTE1_I|PTE1_G|PTE1_RW), R4
115
	MOVW	R3, SPR(DBATU(3))
116
	MOVW	R4, SPR(DBATL(3))
117
 
118
	/* IBAT 3 unused */
119
	MOVW	R0, SPR(IBATU(3))
120
	MOVW	R0, SPR(IBATL(3))
121
 
122
	/* enable MMU */
123
	MOVW	LR, R3
124
	OR	$KZERO, R3
125
	MOVW	R3, SPR(SRR0)
126
	MOVW	MSR, R4
127
	OR	$(MSR_IR|MSR_DR), R4
128
	MOVW	R4, SPR(SRR1)
129
	RFI	/* resume in kernel mode in caller */
130
 
131
	RETURN
132
 
133
TEXT	kfpinit(SB), $0
134
	MOVFL	$0,FPSCR(7)
135
	MOVFL	$0xD,FPSCR(6)	/* VE, OE, ZE */
136
	MOVFL	$0, FPSCR(5)
137
	MOVFL	$0, FPSCR(3)
138
	MOVFL	$0, FPSCR(2)
139
	MOVFL	$0, FPSCR(1)
140
	MOVFL	$0, FPSCR(0)
141
 
142
	FMOVD	$4503601774854144.0, F27
143
	FMOVD	$0.5, F29
144
	FSUB		F29, F29, F28
145
	FADD	F29, F29, F30
146
	FADD	F30, F30, F31
147
	FMOVD	F28, F0
148
	FMOVD	F28, F1
149
	FMOVD	F28, F2
150
	FMOVD	F28, F3
151
	FMOVD	F28, F4
152
	FMOVD	F28, F5
153
	FMOVD	F28, F6
154
	FMOVD	F28, F7
155
	FMOVD	F28, F8
156
	FMOVD	F28, F9
157
	FMOVD	F28, F10
158
	FMOVD	F28, F11
159
	FMOVD	F28, F12
160
	FMOVD	F28, F13
161
	FMOVD	F28, F14
162
	FMOVD	F28, F15
163
	FMOVD	F28, F16
164
	FMOVD	F28, F17
165
	FMOVD	F28, F18
166
	FMOVD	F28, F19
167
	FMOVD	F28, F20
168
	FMOVD	F28, F21
169
	FMOVD	F28, F22
170
	FMOVD	F28, F23
171
	FMOVD	F28, F24
172
	FMOVD	F28, F25
173
	FMOVD	F28, F26
174
	RETURN
175
 
176
TEXT	splhi(SB), $0
177
	MOVW	LR, R31
178
	MOVW	R31, 4(R(MACH))	/* save PC in m->splpc */
179
	MOVW	MSR, R3
180
	RLWNM	$0, R3, $~MSR_EE, R4
181
	SYNC
182
	MOVW	R4, MSR
183
	MSRSYNC
184
	RETURN
185
 
186
TEXT	splx(SB), $0
187
	/* fall though */
188
 
189
TEXT	splxpc(SB), $0
190
	MOVW	LR, R31
191
	MOVW	R31, 4(R(MACH))	/* save PC in m->splpc */
192
	MOVW	MSR, R4
193
	RLWMI	$0, R3, $MSR_EE, R4
194
	SYNC
195
	MOVW	R4, MSR
196
	MSRSYNC
197
	RETURN
198
 
199
TEXT	spllo(SB), $0
200
	MOVW	MSR, R3
201
	OR	$MSR_EE, R3, R4
202
	SYNC
203
	MOVW	R4, MSR
204
	MSRSYNC
205
	RETURN
206
 
207
TEXT	spldone(SB), $0
208
	RETURN
209
 
210
TEXT	islo(SB), $0
211
	MOVW	MSR, R3
212
	RLWNM	$0, R3, $MSR_EE, R3
213
	RETURN
214
 
215
TEXT	setlabel(SB), $-4
216
	MOVW	LR, R31
217
	MOVW	R1, 0(R3)
218
	MOVW	R31, 4(R3)
219
	MOVW	$0, R3
220
	RETURN
221
 
222
TEXT	gotolabel(SB), $-4
223
	MOVW	4(R3), R31
224
	MOVW	R31, LR
225
	MOVW	0(R3), R1
226
	MOVW	$1, R3
227
	RETURN
228
 
229
TEXT	touser(SB), $-4
230
	MOVW	$(UTZERO+32), R5	/* header appears in text */
231
	MOVW	$(MSR_EE|MSR_PR|MSR_ME|MSR_IR|MSR_DR|MSR_RI), R4
232
	MOVW	R4, SPR(SRR1)
233
	MOVW	R3, R1
234
	MOVW	R5, SPR(SRR0)
235
	RFI
236
 
237
TEXT	icflush(SB), $-4	/* icflush(virtaddr, count) */
238
	MOVW	n+4(FP), R4
239
	RLWNM	$0, R3, $~(CACHELINESZ-1), R5
240
	SUB	R5, R3
241
	ADD	R3, R4
242
	ADD		$(CACHELINESZ-1), R4
243
	SRAW	$CACHELINELOG, R4
244
	MOVW	R4, CTR
245
icf0:	ICBI	(R5)
246
	ADD	$CACHELINESZ, R5
247
	BDNZ	icf0
248
	ISYNC
249
	RETURN
250
 
251
TEXT	dcflush(SB), $-4	/* dcflush(virtaddr, count) */
252
	MOVW	n+4(FP), R4
253
	RLWNM	$0, R3, $~(CACHELINESZ-1), R5
254
	CMP	R4, $0
255
	BLE	dcf1
256
	SUB	R5, R3
257
	ADD	R3, R4
258
	ADD		$(CACHELINESZ-1), R4
259
	SRAW	$CACHELINELOG, R4
260
	MOVW	R4, CTR
261
dcf0:	DCBF	(R5)
262
	ADD	$CACHELINESZ, R5
263
	BDNZ	dcf0
264
dcf1:
265
	SYNC
266
	RETURN
267
 
268
TEXT	tas(SB), $0
269
	SYNC
270
	MOVW	R3, R4
271
	MOVW	$0xdead,R5
272
tas1:
273
	DCBF	(R4)	/* fix for 603x bug */
274
	LWAR	(R4), R3
275
	CMP	R3, $0
276
	BNE	tas0
277
	STWCCC	R5, (R4)
278
	BNE	tas1
279
tas0:
280
	SYNC
281
	ISYNC
282
	RETURN
283
 
284
TEXT	_xinc(SB),$0	/* void _xinc(long *); */
285
	MOVW	R3, R4
286
xincloop:
287
	DCBF	(R4)	/* fix for 603x bug */
288
	LWAR	(R4), R3
289
	ADD		$1, R3
290
	STWCCC	R3, (R4)
291
	BNE		xincloop
292
	RETURN
293
 
294
TEXT	_xdec(SB),$0	/* long _xdec(long *); */
295
	MOVW	R3, R4
296
xdecloop:
297
	DCBF	(R4)	/* fix for 603x bug */
298
	LWAR	(R4), R3
299
	ADD		$-1, R3
300
	STWCCC	R3, (R4)
301
	BNE		xdecloop
302
	RETURN
303
 
304
TEXT cmpswap(SB),$0	/* int cmpswap(long*, long, long) */
305
	MOVW	R3, R4	/* addr */
306
	MOVW	old+4(FP), R5
307
	MOVW	new+8(FP), R6
308
	DCBF	(R4)		/* fix for 603x bug? */
309
	LWAR	(R4), R3
310
	CMP	R3, R5
311
	BNE fail
312
	STWCCC	R6, (R4)
313
	BNE fail
314
	MOVW $1, R3
315
	RETURN
316
fail:
317
	MOVW $0, R3
318
	RETURN
319
 
320
TEXT	getpvr(SB), $0
321
	MOVW	SPR(PVR), R3
322
	RETURN
323
 
324
TEXT	getdec(SB), $0
325
	MOVW	SPR(DEC), R3
326
	RETURN
327
 
328
TEXT	putdec(SB), $0
329
	MOVW	R3, SPR(DEC)
330
	RETURN
331
 
332
TEXT	getdar(SB), $0
333
	MOVW	SPR(DAR), R3
334
	RETURN
335
 
336
TEXT	getdsisr(SB), $0
337
	MOVW	SPR(DSISR), R3
338
	RETURN
339
 
340
TEXT	getmsr(SB), $0
341
	MOVW	MSR, R3
342
	RETURN
343
 
344
TEXT	putmsr(SB), $0
345
	SYNC
346
	MOVW	R3, MSR
347
	MSRSYNC
348
	RETURN
349
 
350
TEXT	putsdr1(SB), $0
351
	MOVW	R3, SPR(SDR1)
352
	RETURN
353
 
354
TEXT	putsr(SB), $0
355
	MOVW	4(FP), R4
356
	MOVW	R4, SEG(R3)
357
	RETURN
358
 
359
TEXT	gethid0(SB), $0
360
	MOVW	SPR(HID0), R3
361
	RETURN
362
 
363
TEXT	gethid1(SB), $0
364
	MOVW	SPR(HID1), R3
365
	RETURN
366
 
367
TEXT	puthid0(SB), $0
368
	MOVW	R3, SPR(HID0)
369
	RETURN
370
 
371
TEXT	puthid1(SB), $0
372
	MOVW	R3, SPR(HID1)
373
	RETURN
374
 
375
TEXT	eieio(SB), $0
376
	EIEIO
377
	RETURN
378
 
379
TEXT	sync(SB), $0
380
	SYNC
381
	RETURN
382
 
383
TEXT	tlbflushall(SB), $0
384
	MOVW	$64, R3
385
	MOVW	R3, CTR
386
	MOVW	$0, R4
387
tlbflushall0:
388
	TLBIE	R4
389
	ADD		$BIT(19), R4
390
	BDNZ	tlbflushall0
391
	EIEIO
392
	TLBSYNC
393
	SYNC
394
	RETURN
395
 
396
TEXT	tlbflush(SB), $0
397
	TLBIE	R3
398
	RETURN
399
 
400
TEXT	gotopc(SB), $0
401
	MOVW	R3, CTR
402
	MOVW	LR, R31	/* for trace back */
403
	BR	(CTR)
404
 
405
/*
406
 * traps force memory mapping off.
407
 * the following code has been executed at the exception
408
 * vector location
409
 *	MOVW R0, SPR(SAVER0)
410
 *	MOVW LR, R0
411
 *	MOVW R0, SPR(SAVELR) 
412
 *	bl	trapvec(SB)
413
 */
414
TEXT	trapvec(SB), $-4
415
	MOVW	LR, R0
416
	MOVW	R1, SPR(SAVER1)
417
	MOVW	R0, SPR(SAVEXX)	/* vector */
418
 
419
	/* did we come from user space */
420
	MOVW	SPR(SRR1), R0
421
	MOVW	CR, R1
422
	MOVW	R0, CR
423
	BC	4,17,ktrap
424
 
425
	/* switch to kernel stack */
426
	MOVW	R1, CR
427
	MOVW	R2, R0
428
	MOVW	$setSB(SB), R2
429
	RLWNM	$0, R2, $~KZERO, R2		/* PADDR(setSB) */
430
	MOVW	$mach0(SB), R1	/* m-> */
431
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(m->) */
432
	MOVW	8(R1), R1				/* m->proc  */
433
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(m->proc) */
434
	MOVW	8(R1), R1				/* m->proc->kstack */
435
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(m->proc->kstack) */
436
	ADD	$(KSTACK-UREGSIZE), R1
437
	MOVW	R0, R2
438
	BL	saveureg(SB)
439
	BL	trap(SB)
440
	BR	restoreureg
441
ktrap:
442
	MOVW	R1, CR
443
	MOVW	SPR(SAVER1), R1
444
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(R1) */
445
	SUB	$UREGSPACE, R1
446
	BL	saveureg(SB)
447
	BL	trap(SB)
448
	BR	restoreureg
449
 
450
/*
451
 * enter with stack set and mapped.
452
 * on return, SB (R2) has been set, and R3 has the Ureg*,
453
 * the MMU has been re-enabled, kernel text and PC are in KSEG,
454
 * R(MACH) has been set, and R0 contains 0.
455
 *
456
 */
457
TEXT	saveureg(SB), $-4
458
/*
459
 * save state
460
 */
461
	MOVMW	R2, 48(R1)	/* r2:r31 */
462
	MOVW	$setSB(SB), R2
463
	RLWNM	$0, R2, $~KZERO, R2		/* PADDR(setSB) */
464
	MOVW	$mach0(SB), R(MACH)
465
	RLWNM	$0, R(MACH), $~KZERO, R(MACH)		/* PADDR(m->) */
466
	MOVW	8(R(MACH)), R(USER)
467
	MOVW	$mach0(SB), R(MACH)
468
	MOVW	$setSB(SB), R2
469
	MOVW	SPR(SAVER1), R4
470
	MOVW	R4, 44(R1)
471
	MOVW	SPR(SAVER0), R5
472
	MOVW	R5, 40(R1)
473
	MOVW	CTR, R6
474
	MOVW	R6, 36(R1)
475
	MOVW	XER, R4
476
	MOVW	R4, 32(R1)
477
	MOVW	CR, R5
478
	MOVW	R5, 28(R1)
479
	MOVW	SPR(SAVELR), R6	/* LR */
480
	MOVW	R6, 24(R1)
481
	/* pad at 20(R1) */
482
	MOVW	SPR(SRR0), R0
483
	MOVW	R0, 16(R1)				/* old PC */
484
	MOVW	SPR(SRR1), R0
485
	MOVW	R0, 12(R1)				/* old status */
486
	MOVW	SPR(SAVEXX), R0
487
	MOVW	R0, 8(R1)	/* cause/vector */
488
	ADD	$8, R1, R3	/* Ureg* */
489
	OR	$KZERO, R3	/* fix ureg */
490
	STWCCC	R3, (R1)	/* break any pending reservations */
491
	MOVW	$0, R0	/* compiler/linker expect R0 to be zero */
492
 
493
	MOVW	MSR, R5
494
	OR	$(MSR_IR|MSR_DR|MSR_FP|MSR_RI), R5	/* enable MMU */
495
	MOVW	R5, SPR(SRR1)
496
	MOVW	LR, R31
497
	OR	$KZERO, R31	/* return PC in KSEG0 */
498
	MOVW	R31, SPR(SRR0)
499
	OR	$KZERO, R1	/* fix stack pointer */
500
	RFI	/* returns to trap handler */
501
 
502
/*
503
 * restore state from Ureg and return from trap/interrupt
504
 */
505
TEXT	forkret(SB), $0
506
	BR	restoreureg
507
 
508
restoreureg:
509
	MOVMW	48(R1), R2	/* r2:r31 */
510
	/* defer R1 */
511
	MOVW	40(R1), R0
512
	MOVW	R0, SPR(SAVER0)
513
	MOVW	36(R1), R0
514
	MOVW	R0, CTR
515
	MOVW	32(R1), R0
516
	MOVW	R0, XER
517
	MOVW	28(R1), R0
518
	MOVW	R0, CR	/* CR */
519
	MOVW	24(R1), R0
520
	MOVW	R0, LR
521
	/* pad, skip */
522
	MOVW	16(R1), R0
523
	MOVW	R0, SPR(SRR0)	/* old PC */
524
	MOVW	12(R1), R0
525
	MOVW	R0, SPR(SRR1)	/* old MSR */
526
	/* cause, skip */
527
	MOVW	44(R1), R1	/* old SP */
528
	MOVW	SPR(SAVER0), R0
529
	RFI
530
 
531
TEXT	fpsave(SB), $0
532
	FMOVD	F0, (0*8)(R3)
533
	FMOVD	F1, (1*8)(R3)
534
	FMOVD	F2, (2*8)(R3)
535
	FMOVD	F3, (3*8)(R3)
536
	FMOVD	F4, (4*8)(R3)
537
	FMOVD	F5, (5*8)(R3)
538
	FMOVD	F6, (6*8)(R3)
539
	FMOVD	F7, (7*8)(R3)
540
	FMOVD	F8, (8*8)(R3)
541
	FMOVD	F9, (9*8)(R3)
542
	FMOVD	F10, (10*8)(R3)
543
	FMOVD	F11, (11*8)(R3)
544
	FMOVD	F12, (12*8)(R3)
545
	FMOVD	F13, (13*8)(R3)
546
	FMOVD	F14, (14*8)(R3)
547
	FMOVD	F15, (15*8)(R3)
548
	FMOVD	F16, (16*8)(R3)
549
	FMOVD	F17, (17*8)(R3)
550
	FMOVD	F18, (18*8)(R3)
551
	FMOVD	F19, (19*8)(R3)
552
	FMOVD	F20, (20*8)(R3)
553
	FMOVD	F21, (21*8)(R3)
554
	FMOVD	F22, (22*8)(R3)
555
	FMOVD	F23, (23*8)(R3)
556
	FMOVD	F24, (24*8)(R3)
557
	FMOVD	F25, (25*8)(R3)
558
	FMOVD	F26, (26*8)(R3)
559
	FMOVD	F27, (27*8)(R3)
560
	FMOVD	F28, (28*8)(R3)
561
	FMOVD	F29, (29*8)(R3)
562
	FMOVD	F30, (30*8)(R3)
563
	FMOVD	F31, (31*8)(R3)
564
	MOVFL	FPSCR, F0
565
	FMOVD	F0, (32*8)(R3)
566
	RETURN
567
 
568
TEXT	fprestore(SB), $0
569
	FMOVD	(32*8)(R3), F0
570
	MOVFL	F0, FPSCR
571
	FMOVD	(0*8)(R3), F0
572
	FMOVD	(1*8)(R3), F1
573
	FMOVD	(2*8)(R3), F2
574
	FMOVD	(3*8)(R3), F3
575
	FMOVD	(4*8)(R3), F4
576
	FMOVD	(5*8)(R3), F5
577
	FMOVD	(6*8)(R3), F6
578
	FMOVD	(7*8)(R3), F7
579
	FMOVD	(8*8)(R3), F8
580
	FMOVD	(9*8)(R3), F9
581
	FMOVD	(10*8)(R3), F10
582
	FMOVD	(11*8)(R3), F11
583
	FMOVD	(12*8)(R3), F12
584
	FMOVD	(13*8)(R3), F13
585
	FMOVD	(14*8)(R3), F14
586
	FMOVD	(15*8)(R3), F15
587
	FMOVD	(16*8)(R3), F16
588
	FMOVD	(17*8)(R3), F17
589
	FMOVD	(18*8)(R3), F18
590
	FMOVD	(19*8)(R3), F19
591
	FMOVD	(20*8)(R3), F20
592
	FMOVD	(21*8)(R3), F21
593
	FMOVD	(22*8)(R3), F22
594
	FMOVD	(23*8)(R3), F23
595
	FMOVD	(24*8)(R3), F24
596
	FMOVD	(25*8)(R3), F25
597
	FMOVD	(26*8)(R3), F26
598
	FMOVD	(27*8)(R3), F27
599
	FMOVD	(28*8)(R3), F28
600
	FMOVD	(29*8)(R3), F29
601
	FMOVD	(30*8)(R3), F30
602
	FMOVD	(31*8)(R3), F31
603
	RETURN