xref: /plan9/sys/src/cmd/va/l.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier/*
2*3e12c5d1SDavid du Colombier * Memory and machine-specific definitions.  Used in C and assembler.
3*3e12c5d1SDavid du Colombier */
4*3e12c5d1SDavid du Colombier
5*3e12c5d1SDavid du Colombier/*
6*3e12c5d1SDavid du Colombier * Sizes
7*3e12c5d1SDavid du Colombier */
8*3e12c5d1SDavid du Colombier
9*3e12c5d1SDavid du Colombier#define	BI2BY		8			/* bits per byte */
10*3e12c5d1SDavid du Colombier#define BI2WD		32			/* bits per word */
11*3e12c5d1SDavid du Colombier#define	BY2WD		4			/* bytes per word */
12*3e12c5d1SDavid du Colombier#define	BY2PG		4096			/* bytes per page */
13*3e12c5d1SDavid du Colombier#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
14*3e12c5d1SDavid du Colombier#define	PGSHIFT		12			/* log(BY2PG) */
15*3e12c5d1SDavid du Colombier
16*3e12c5d1SDavid du Colombier#define	MAXMACH		4			/* max # cpus system can run */
17*3e12c5d1SDavid du Colombier
18*3e12c5d1SDavid du Colombier/*
19*3e12c5d1SDavid du Colombier * Time
20*3e12c5d1SDavid du Colombier */
21*3e12c5d1SDavid du Colombier#define	MS2HZ		50			/* millisec per clock tick */
22*3e12c5d1SDavid du Colombier#define	TK2SEC(t)	((t)/20)		/* ticks to seconds */
23*3e12c5d1SDavid du Colombier#define	TK2MS(t)	((t)*MS2HZ)		/* ticks to milliseconds */
24*3e12c5d1SDavid du Colombier#define	MS2TK(t)	((t)/MS2HZ)		/* milliseconds to ticks */
25*3e12c5d1SDavid du Colombier
26*3e12c5d1SDavid du Colombier/*
27*3e12c5d1SDavid du Colombier * CP0 registers
28*3e12c5d1SDavid du Colombier */
29*3e12c5d1SDavid du Colombier
30*3e12c5d1SDavid du Colombier#define INDEX		0
31*3e12c5d1SDavid du Colombier#define RANDOM		1
32*3e12c5d1SDavid du Colombier#define TLBPHYS		2
33*3e12c5d1SDavid du Colombier#define CONTEXT		4
34*3e12c5d1SDavid du Colombier#define BADVADDR	8
35*3e12c5d1SDavid du Colombier#define TLBVIRT		10
36*3e12c5d1SDavid du Colombier#define STATUS		12
37*3e12c5d1SDavid du Colombier#define CAUSE		13
38*3e12c5d1SDavid du Colombier#define EPC		14
39*3e12c5d1SDavid du Colombier#define	PRID		15
40*3e12c5d1SDavid du Colombier
41*3e12c5d1SDavid du Colombier/*
42*3e12c5d1SDavid du Colombier * M(STATUS) bits
43*3e12c5d1SDavid du Colombier */
44*3e12c5d1SDavid du Colombier#define IEC		0x00000001
45*3e12c5d1SDavid du Colombier#define KUC		0x00000002
46*3e12c5d1SDavid du Colombier#define IEP		0x00000004
47*3e12c5d1SDavid du Colombier#define KUP		0x00000008
48*3e12c5d1SDavid du Colombier#define INTMASK		0x0000ff00
49*3e12c5d1SDavid du Colombier#define SW0		0x00000100
50*3e12c5d1SDavid du Colombier#define SW1		0x00000200
51*3e12c5d1SDavid du Colombier#define INTR0		0x00000400
52*3e12c5d1SDavid du Colombier#define INTR1		0x00000800
53*3e12c5d1SDavid du Colombier#define INTR2		0x00001000
54*3e12c5d1SDavid du Colombier#define INTR3		0x00002000
55*3e12c5d1SDavid du Colombier#define INTR4		0x00004000
56*3e12c5d1SDavid du Colombier#define INTR5		0x00008000
57*3e12c5d1SDavid du Colombier#define ISC		0x00010000
58*3e12c5d1SDavid du Colombier#define SWC		0x00020000
59*3e12c5d1SDavid du Colombier#define CU1		0x20000000
60*3e12c5d1SDavid du Colombier
61*3e12c5d1SDavid du Colombier/*
62*3e12c5d1SDavid du Colombier * Traps
63*3e12c5d1SDavid du Colombier */
64*3e12c5d1SDavid du Colombier
65*3e12c5d1SDavid du Colombier#define	UTLBMISS	(KSEG0+0x00)
66*3e12c5d1SDavid du Colombier#define	EXCEPTION	(KSEG0+0x80)
67*3e12c5d1SDavid du Colombier
68*3e12c5d1SDavid du Colombier/*
69*3e12c5d1SDavid du Colombier * Magic registers
70*3e12c5d1SDavid du Colombier */
71*3e12c5d1SDavid du Colombier
72*3e12c5d1SDavid du Colombier#define	MACH		25		/* R25 is m-> */
73*3e12c5d1SDavid du Colombier#define	USER		24		/* R24 is u-> */
74*3e12c5d1SDavid du Colombier#define	MPID		0xBF000000	/* long; low 3 bits identify mp bus slot */
75*3e12c5d1SDavid du Colombier#define WBFLUSH		0xBC000000	/* D-CACHE data; used for write buffer flush */
76*3e12c5d1SDavid du Colombier
77*3e12c5d1SDavid du Colombier/*
78*3e12c5d1SDavid du Colombier * Fundamental addresses
79*3e12c5d1SDavid du Colombier */
80*3e12c5d1SDavid du Colombier
81*3e12c5d1SDavid du Colombier#define	MACHADDR	0x80014000
82*3e12c5d1SDavid du Colombier#define	USERADDR	0xC0000000
83*3e12c5d1SDavid du Colombier#define	UREGADDR	(USERADDR+BY2PG-4-0xA0)
84*3e12c5d1SDavid du Colombier/*
85*3e12c5d1SDavid du Colombier * MMU
86*3e12c5d1SDavid du Colombier */
87*3e12c5d1SDavid du Colombier
88*3e12c5d1SDavid du Colombier#define	KUSEG	0x00000000
89*3e12c5d1SDavid du Colombier#define KSEG0	0x80000000
90*3e12c5d1SDavid du Colombier#define KSEG1	0xA0000000
91*3e12c5d1SDavid du Colombier#define	KSEG2	0xC0000000
92*3e12c5d1SDavid du Colombier#define	KSEGM	0xE0000000	/* mask to check which seg */
93*3e12c5d1SDavid du Colombier
94*3e12c5d1SDavid du Colombier#define	PTEGLOBL	(1<<8)
95*3e12c5d1SDavid du Colombier#define	PTEVALID	(1<<9)
96*3e12c5d1SDavid du Colombier#define	PTEWRITE	(1<<10)
97*3e12c5d1SDavid du Colombier#define	PTEPID(n)	((n)<<6)
98*3e12c5d1SDavid du Colombier
99*3e12c5d1SDavid du Colombier#define	NTLBPID	64	/* number of pids */
100*3e12c5d1SDavid du Colombier#define	NTLB	64	/* number of entries */
101*3e12c5d1SDavid du Colombier#define	TLBROFF	8	/* offset of first randomly indexed entry */
102*3e12c5d1SDavid du Colombier
103*3e12c5d1SDavid du Colombier/*
104*3e12c5d1SDavid du Colombier * Address spaces
105*3e12c5d1SDavid du Colombier */
106*3e12c5d1SDavid du Colombier
107*3e12c5d1SDavid du Colombier#define	UZERO	KUSEG			/* base of user address space */
108*3e12c5d1SDavid du Colombier#define	UTZERO	(UZERO+BY2PG)		/* first address in user text */
109*3e12c5d1SDavid du Colombier#define	USTKTOP	KZERO			/* byte just beyond user stack */
110*3e12c5d1SDavid du Colombier#define	TSTKTOP	(USERADDR+100*BY2PG)	/* top of temporary stack */
111*3e12c5d1SDavid du Colombier#define	KZERO	KSEG0			/* base of kernel address space */
112*3e12c5d1SDavid du Colombier#define	KTZERO	(KSEG0+0x20000)		/* first address in kernel text */
113*3e12c5d1SDavid du Colombier#define	USTACKSIZE	(4*1024*1024)	/* size of user stack */
114*3e12c5d1SDavid du Colombier/*
115*3e12c5d1SDavid du Colombier * Exception codes
116*3e12c5d1SDavid du Colombier */
117*3e12c5d1SDavid du Colombier#define	CINT	 0		/* external interrupt */
118*3e12c5d1SDavid du Colombier#define	CTLBM	 1		/* TLB modification */
119*3e12c5d1SDavid du Colombier#define	CTLBL	 2		/* TLB miss (load or fetch) */
120*3e12c5d1SDavid du Colombier#define	CTLBS	 3		/* TLB miss (store) */
121*3e12c5d1SDavid du Colombier#define	CADREL	 4		/* address error (load or fetch) */
122*3e12c5d1SDavid du Colombier#define	CADRES	 5		/* address error (store) */
123*3e12c5d1SDavid du Colombier#define	CBUSI	 6		/* bus error (fetch) */
124*3e12c5d1SDavid du Colombier#define	CBUSD	 7		/* bus error (data load or store) */
125*3e12c5d1SDavid du Colombier#define	CSYS	 8		/* system call */
126*3e12c5d1SDavid du Colombier#define	CBRK	 9		/* breakpoint */
127*3e12c5d1SDavid du Colombier#define	CRES	10		/* reserved instruction */
128*3e12c5d1SDavid du Colombier#define	CCPU	11		/* coprocessor unusable */
129*3e12c5d1SDavid du Colombier#define	COVF	12		/* arithmetic overflow */
130*3e12c5d1SDavid du Colombier#define	CUNK13	13		/* undefined 13 */
131*3e12c5d1SDavid du Colombier#define	CUNK14	14		/* undefined 14 */
132*3e12c5d1SDavid du Colombier#define	CUNK15	15		/* undefined 15 */
133*3e12c5d1SDavid du Colombier
134*3e12c5d1SDavid du Colombier#define	NSEG	5
135*3e12c5d1SDavid du Colombier
136*3e12c5d1SDavid du Colombier#define SP		R29
137*3e12c5d1SDavid du Colombier
138*3e12c5d1SDavid du Colombier#define PROM		(KSEG1+0x1FC00000)
139*3e12c5d1SDavid du Colombier#define	NOOP		NOR R0,R0
140*3e12c5d1SDavid du Colombier#define	WAIT		NOOP; NOOP
141*3e12c5d1SDavid du Colombier
142*3e12c5d1SDavid du Colombier/*
143*3e12c5d1SDavid du Colombier * Boot first processor
144*3e12c5d1SDavid du Colombier *   - why is the processor number loaded from R0 ?????
145*3e12c5d1SDavid du Colombier */
146*3e12c5d1SDavid du ColombierTEXT	start(SB), $-4
147*3e12c5d1SDavid du Colombier
148*3e12c5d1SDavid du Colombier	MOVW	$setR30(SB), R30
149*3e12c5d1SDavid du Colombier	MOVW	$(CU1|INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1
150*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
151*3e12c5d1SDavid du Colombier	WAIT
152*3e12c5d1SDavid du Colombier
153*3e12c5d1SDavid du Colombier	MOVW	$(0x1C<<7), R1
154*3e12c5d1SDavid du Colombier	MOVW	R1, FCR31	/* permit only inexact and underflow */
155*3e12c5d1SDavid du Colombier	NOOP
156*3e12c5d1SDavid du Colombier	MOVD	$0.5, F26
157*3e12c5d1SDavid du Colombier	SUBD	F26, F26, F24
158*3e12c5d1SDavid du Colombier	ADDD	F26, F26, F28
159*3e12c5d1SDavid du Colombier	ADDD	F28, F28, F30
160*3e12c5d1SDavid du Colombier
161*3e12c5d1SDavid du Colombier	MOVD	F24, F0
162*3e12c5d1SDavid du Colombier	MOVD	F24, F2
163*3e12c5d1SDavid du Colombier	MOVD	F24, F4
164*3e12c5d1SDavid du Colombier	MOVD	F24, F6
165*3e12c5d1SDavid du Colombier	MOVD	F24, F8
166*3e12c5d1SDavid du Colombier	MOVD	F24, F10
167*3e12c5d1SDavid du Colombier	MOVD	F24, F12
168*3e12c5d1SDavid du Colombier	MOVD	F24, F14
169*3e12c5d1SDavid du Colombier	MOVD	F24, F16
170*3e12c5d1SDavid du Colombier	MOVD	F24, F18
171*3e12c5d1SDavid du Colombier	MOVD	F24, F20
172*3e12c5d1SDavid du Colombier	MOVD	F24, F22
173*3e12c5d1SDavid du Colombier
174*3e12c5d1SDavid du Colombier	MOVW	$MACHADDR, R(MACH)
175*3e12c5d1SDavid du Colombier	ADDU	$(BY2PG-4), R(MACH), SP
176*3e12c5d1SDavid du Colombier	MOVW	$0, R(USER)
177*3e12c5d1SDavid du Colombier	MOVW	R0, 0(R(MACH))
178*3e12c5d1SDavid du Colombier
179*3e12c5d1SDavid du Colombier	MOVW	$edata(SB), R1
180*3e12c5d1SDavid du Colombier	MOVW	$end(SB), R2
181*3e12c5d1SDavid du Colombier
182*3e12c5d1SDavid du Colombierclrbss:
183*3e12c5d1SDavid du Colombier	MOVB	$0, (R1)
184*3e12c5d1SDavid du Colombier	ADDU	$1, R1
185*3e12c5d1SDavid du Colombier	BNE	R1, R2, clrbss
186*3e12c5d1SDavid du Colombier
187*3e12c5d1SDavid du Colombier	MOVW	R4, _argc(SB)
188*3e12c5d1SDavid du Colombier	MOVW	R5, _argv(SB)
189*3e12c5d1SDavid du Colombier	MOVW	R6, _env(SB)
190*3e12c5d1SDavid du Colombier	JAL	main(SB)
191*3e12c5d1SDavid du Colombier	JMP	(R0)
192*3e12c5d1SDavid du Colombier
193*3e12c5d1SDavid du Colombier/*
194*3e12c5d1SDavid du Colombier * Take first processor into user mode
195*3e12c5d1SDavid du Colombier * 	- argument is stack pointer to user
196*3e12c5d1SDavid du Colombier */
197*3e12c5d1SDavid du Colombier
198*3e12c5d1SDavid du ColombierTEXT	touser(SB), $-4
199*3e12c5d1SDavid du Colombier
200*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R1
201*3e12c5d1SDavid du Colombier	OR	$(KUP|IEP), R1
202*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
203*3e12c5d1SDavid du Colombier	NOOP
204*3e12c5d1SDavid du Colombier	MOVW	0(FP), SP
205*3e12c5d1SDavid du Colombier	MOVW	$(UTZERO+32), R26	/* header appears in text */
206*3e12c5d1SDavid du Colombier	RFE	(R26)
207*3e12c5d1SDavid du Colombier
208*3e12c5d1SDavid du Colombier/*
209*3e12c5d1SDavid du Colombier * Bring subsequent processors on line
210*3e12c5d1SDavid du Colombier */
211*3e12c5d1SDavid du ColombierTEXT	newstart(SB), $0
212*3e12c5d1SDavid du Colombier
213*3e12c5d1SDavid du Colombier	MOVW	$setR30(SB), R30
214*3e12c5d1SDavid du Colombier	MOVW	$(INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1
215*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
216*3e12c5d1SDavid du Colombier	NOOP
217*3e12c5d1SDavid du Colombier	MOVW	$MACHADDR, R(MACH)
218*3e12c5d1SDavid du Colombier	MOVB	(MPID+3), R1
219*3e12c5d1SDavid du Colombier	AND	$7, R1
220*3e12c5d1SDavid du Colombier	SLL	$PGSHIFT, R1, R2
221*3e12c5d1SDavid du Colombier	ADDU	R2, R(MACH)
222*3e12c5d1SDavid du Colombier	ADDU	$(BY2PG-4), R(MACH), SP
223*3e12c5d1SDavid du Colombier	MOVW	$0, R(USER)
224*3e12c5d1SDavid du Colombier	MOVW	R1, 0(R(MACH))
225*3e12c5d1SDavid du Colombier	JAL	online(SB)
226*3e12c5d1SDavid du Colombier	JMP	(R0)
227*3e12c5d1SDavid du Colombier
228*3e12c5d1SDavid du ColombierTEXT	firmware(SB), $0
229*3e12c5d1SDavid du Colombier
230*3e12c5d1SDavid du Colombier	MOVW	$(PROM+0x18), R1 /**/
231*3e12c5d1SDavid du Colombier/*	MOVW	$(PROM+0x00), R1 /**/
232*3e12c5d1SDavid du Colombier	JMP	(R1)
233*3e12c5d1SDavid du Colombier
234*3e12c5d1SDavid du ColombierTEXT	splhi(SB), $0
235*3e12c5d1SDavid du Colombier
236*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R1
237*3e12c5d1SDavid du Colombier	AND	$~IEC, R1, R2
238*3e12c5d1SDavid du Colombier	MOVW	R2, M(STATUS)
239*3e12c5d1SDavid du Colombier	NOOP
240*3e12c5d1SDavid du Colombier	RET
241*3e12c5d1SDavid du Colombier
242*3e12c5d1SDavid du ColombierTEXT	spllo(SB), $0
243*3e12c5d1SDavid du Colombier
244*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R1
245*3e12c5d1SDavid du Colombier	OR	$IEC, R1, R2
246*3e12c5d1SDavid du Colombier	MOVW	R2, M(STATUS)
247*3e12c5d1SDavid du Colombier	NOOP
248*3e12c5d1SDavid du Colombier	RET
249*3e12c5d1SDavid du Colombier
250*3e12c5d1SDavid du ColombierTEXT	splx(SB), $0
251*3e12c5d1SDavid du Colombier
252*3e12c5d1SDavid du Colombier	MOVW	0(FP), R1
253*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R2
254*3e12c5d1SDavid du Colombier	AND	$IEC, R1
255*3e12c5d1SDavid du Colombier	AND	$~IEC, R2
256*3e12c5d1SDavid du Colombier	OR	R2, R1
257*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
258*3e12c5d1SDavid du Colombier	NOOP
259*3e12c5d1SDavid du Colombier	RET
260*3e12c5d1SDavid du Colombier
261*3e12c5d1SDavid du ColombierTEXT	wbflush(SB), $-4
262*3e12c5d1SDavid du Colombier
263*3e12c5d1SDavid du Colombier	MOVW	$WBFLUSH, R1
264*3e12c5d1SDavid du Colombier	MOVW	0(R1), R1
265*3e12c5d1SDavid du Colombier	RET
266*3e12c5d1SDavid du Colombier
267*3e12c5d1SDavid du ColombierTEXT	setlabel(SB), $0
268*3e12c5d1SDavid du Colombier
269*3e12c5d1SDavid du Colombier	MOVW	0(FP), R2
270*3e12c5d1SDavid du Colombier	MOVW	$0, R1
271*3e12c5d1SDavid du Colombier	MOVW	R31, 0(R2)
272*3e12c5d1SDavid du Colombier	MOVW	R29, 4(R2)
273*3e12c5d1SDavid du Colombier	RET
274*3e12c5d1SDavid du Colombier
275*3e12c5d1SDavid du ColombierTEXT	gotolabel(SB), $0
276*3e12c5d1SDavid du Colombier
277*3e12c5d1SDavid du Colombier	MOVW	0(FP), R2
278*3e12c5d1SDavid du Colombier	MOVW	$1, R1
279*3e12c5d1SDavid du Colombier	MOVW	0(R2), R31
280*3e12c5d1SDavid du Colombier	MOVW	4(R2), R29
281*3e12c5d1SDavid du Colombier	RET
282*3e12c5d1SDavid du Colombier
283*3e12c5d1SDavid du ColombierTEXT	gotopc(SB), $8
284*3e12c5d1SDavid du Colombier
285*3e12c5d1SDavid du Colombier	MOVW	0(FP), R7		/* save arguments for later */
286*3e12c5d1SDavid du Colombier	MOVW	_argc(SB), R4
287*3e12c5d1SDavid du Colombier	MOVW	_argv(SB), R5
288*3e12c5d1SDavid du Colombier	MOVW	_env(SB), R6
289*3e12c5d1SDavid du Colombier	MOVW	R0, 4(SP)
290*3e12c5d1SDavid du Colombier	MOVW	$(64*1024), R1
291*3e12c5d1SDavid du Colombier	MOVW	R1, 8(SP)
292*3e12c5d1SDavid du Colombier	JAL	icflush(SB)
293*3e12c5d1SDavid du Colombier	JMP	(R7)
294*3e12c5d1SDavid du Colombier
295*3e12c5d1SDavid du ColombierTEXT	puttlb(SB), $4
296*3e12c5d1SDavid du Colombier
297*3e12c5d1SDavid du Colombier	JAL	splhi(SB)
298*3e12c5d1SDavid du Colombier	MOVW	0(FP), R2
299*3e12c5d1SDavid du Colombier	MOVW	4(FP), R3
300*3e12c5d1SDavid du Colombier	MOVW	R1, 4(SP)
301*3e12c5d1SDavid du Colombier	MOVW	R2, M(TLBVIRT)
302*3e12c5d1SDavid du Colombier	MOVW	R3, M(TLBPHYS)
303*3e12c5d1SDavid du Colombier	NOOP
304*3e12c5d1SDavid du Colombier	TLBP
305*3e12c5d1SDavid du Colombier	NOOP
306*3e12c5d1SDavid du Colombier	MOVW	M(INDEX), R4
307*3e12c5d1SDavid du Colombier	BGEZ	R4, index
308*3e12c5d1SDavid du Colombier	TLBWR
309*3e12c5d1SDavid du Colombier	NOOP
310*3e12c5d1SDavid du Colombier	JAL	splx(SB)
311*3e12c5d1SDavid du Colombier	RET
312*3e12c5d1SDavid du Colombierindex:
313*3e12c5d1SDavid du Colombier	TLBWI
314*3e12c5d1SDavid du Colombier	NOOP
315*3e12c5d1SDavid du Colombier	JAL	splx(SB)
316*3e12c5d1SDavid du Colombier	RET
317*3e12c5d1SDavid du Colombier
318*3e12c5d1SDavid du ColombierTEXT	puttlbx(SB), $0
319*3e12c5d1SDavid du Colombier
320*3e12c5d1SDavid du Colombier	MOVW	0(FP), R4
321*3e12c5d1SDavid du Colombier	MOVW	4(FP), R2
322*3e12c5d1SDavid du Colombier	MOVW	8(FP), R3
323*3e12c5d1SDavid du Colombier	SLL	$8, R4
324*3e12c5d1SDavid du Colombier	MOVW	R2, M(TLBVIRT)
325*3e12c5d1SDavid du Colombier	MOVW	R3, M(TLBPHYS)
326*3e12c5d1SDavid du Colombier	MOVW	R4, M(INDEX)
327*3e12c5d1SDavid du Colombier	NOOP
328*3e12c5d1SDavid du Colombier	TLBWI
329*3e12c5d1SDavid du Colombier	NOOP
330*3e12c5d1SDavid du Colombier	RET
331*3e12c5d1SDavid du Colombier
332*3e12c5d1SDavid du ColombierTEXT	tlbp(SB), $0
333*3e12c5d1SDavid du Colombier	TLBP
334*3e12c5d1SDavid du Colombier	NOOP
335*3e12c5d1SDavid du Colombier	MOVW	M(INDEX), R1
336*3e12c5d1SDavid du Colombier	RET
337*3e12c5d1SDavid du Colombier
338*3e12c5d1SDavid du ColombierTEXT	tlbvirt(SB), $0
339*3e12c5d1SDavid du Colombier	TLBP
340*3e12c5d1SDavid du Colombier	NOOP
341*3e12c5d1SDavid du Colombier	MOVW	M(TLBVIRT), R1
342*3e12c5d1SDavid du Colombier	RET
343*3e12c5d1SDavid du Colombier
344*3e12c5d1SDavid du Colombier
345*3e12c5d1SDavid du ColombierTEXT	gettlb(SB), $0
346*3e12c5d1SDavid du Colombier
347*3e12c5d1SDavid du Colombier	MOVW	0(FP), R3
348*3e12c5d1SDavid du Colombier	MOVW	4(FP), R4
349*3e12c5d1SDavid du Colombier	SLL	$8, R3
350*3e12c5d1SDavid du Colombier	MOVW	R3, M(INDEX)
351*3e12c5d1SDavid du Colombier	NOOP
352*3e12c5d1SDavid du Colombier	TLBR
353*3e12c5d1SDavid du Colombier	NOOP
354*3e12c5d1SDavid du Colombier	MOVW	M(TLBVIRT), R1
355*3e12c5d1SDavid du Colombier	MOVW	M(TLBPHYS), R2
356*3e12c5d1SDavid du Colombier	NOOP
357*3e12c5d1SDavid du Colombier	MOVW	R1, 0(R4)
358*3e12c5d1SDavid du Colombier	MOVW	R2, 4(R4)
359*3e12c5d1SDavid du Colombier	RET
360*3e12c5d1SDavid du Colombier
361*3e12c5d1SDavid du ColombierTEXT	gettlbvirt(SB), $0
362*3e12c5d1SDavid du Colombier
363*3e12c5d1SDavid du Colombier	MOVW	0(FP), R3
364*3e12c5d1SDavid du Colombier	SLL	$8, R3
365*3e12c5d1SDavid du Colombier	MOVW	R3, M(INDEX)
366*3e12c5d1SDavid du Colombier	NOOP
367*3e12c5d1SDavid du Colombier	TLBR
368*3e12c5d1SDavid du Colombier	NOOP
369*3e12c5d1SDavid du Colombier	MOVW	M(TLBVIRT), R1
370*3e12c5d1SDavid du Colombier	NOOP
371*3e12c5d1SDavid du Colombier	RET
372*3e12c5d1SDavid du Colombier
373*3e12c5d1SDavid du ColombierTEXT	vector80(SB), $-4
374*3e12c5d1SDavid du Colombier
375*3e12c5d1SDavid du Colombier	MOVW	$exception(SB), R26
376*3e12c5d1SDavid du Colombier	JMP	(R26)
377*3e12c5d1SDavid du Colombier
378*3e12c5d1SDavid du ColombierTEXT	exception(SB), $-4
379*3e12c5d1SDavid du Colombier
380*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R26
381*3e12c5d1SDavid du Colombier	AND	$KUP, R26
382*3e12c5d1SDavid du Colombier	BEQ	R26, waskernel
383*3e12c5d1SDavid du Colombier
384*3e12c5d1SDavid du Colombierwasuser:
385*3e12c5d1SDavid du Colombier	MOVW	SP, R26
386*3e12c5d1SDavid du Colombier		/*
387*3e12c5d1SDavid du Colombier		 * set kernel sp: ureg - ureg* - pc
388*3e12c5d1SDavid du Colombier		 * done in 2 steps because R30 is not set
389*3e12c5d1SDavid du Colombier		 * and the loader will make a literal
390*3e12c5d1SDavid du Colombier		 */
391*3e12c5d1SDavid du Colombier	MOVW	$((UREGADDR-2*BY2WD) & 0xffff0000), SP
392*3e12c5d1SDavid du Colombier	OR	$((UREGADDR-2*BY2WD) & 0xffff), SP
393*3e12c5d1SDavid du Colombier	MOVW	R26, 0x10(SP)			/* user SP */
394*3e12c5d1SDavid du Colombier	MOVW	R31, 0x28(SP)
395*3e12c5d1SDavid du Colombier	MOVW	R30, 0x2C(SP)
396*3e12c5d1SDavid du Colombier	MOVW	M(CAUSE), R26
397*3e12c5d1SDavid du Colombier	MOVW	R(MACH), 0x3C(SP)
398*3e12c5d1SDavid du Colombier	MOVW	R(USER), 0x40(SP)
399*3e12c5d1SDavid du Colombier	AND	$(0xF<<2), R26
400*3e12c5d1SDavid du Colombier	SUB	$(CSYS<<2), R26
401*3e12c5d1SDavid du Colombier
402*3e12c5d1SDavid du Colombier	JAL	saveregs(SB)
403*3e12c5d1SDavid du Colombier
404*3e12c5d1SDavid du Colombier	MOVW	$setR30(SB), R30
405*3e12c5d1SDavid du Colombier	SUBU	$(UREGADDR-2*BY2WD-USERADDR), SP, R(USER)
406*3e12c5d1SDavid du Colombier	MOVW	$MPID, R1
407*3e12c5d1SDavid du Colombier	MOVB	3(R1), R1
408*3e12c5d1SDavid du Colombier	MOVW	$MACHADDR, R(MACH)		/* locn of mach 0 */
409*3e12c5d1SDavid du Colombier	AND	$7, R1
410*3e12c5d1SDavid du Colombier	SLL	$PGSHIFT, R1
411*3e12c5d1SDavid du Colombier	ADDU	R1, R(MACH)			/* add offset for mach # */
412*3e12c5d1SDavid du Colombier
413*3e12c5d1SDavid du Colombier	BNE	R26, notsys
414*3e12c5d1SDavid du Colombier
415*3e12c5d1SDavid du Colombier	JAL	syscall(SB)
416*3e12c5d1SDavid du Colombier
417*3e12c5d1SDavid du Colombier	MOVW	0x28(SP), R31
418*3e12c5d1SDavid du Colombier	MOVW	0x08(SP), R26
419*3e12c5d1SDavid du Colombier	MOVW	0x2C(SP), R30
420*3e12c5d1SDavid du Colombier	MOVW	R26, M(STATUS)
421*3e12c5d1SDavid du Colombier	NOOP
422*3e12c5d1SDavid du Colombier	MOVW	0x0C(SP), R26		/* old pc */
423*3e12c5d1SDavid du Colombier	MOVW	0x10(SP), SP
424*3e12c5d1SDavid du Colombier	RFE	(R26)
425*3e12c5d1SDavid du Colombier
426*3e12c5d1SDavid du Colombiernotsys:
427*3e12c5d1SDavid du Colombier	JAL	trap(SB)
428*3e12c5d1SDavid du Colombier
429*3e12c5d1SDavid du Colombierrestore:
430*3e12c5d1SDavid du Colombier	JAL	restregs(SB)
431*3e12c5d1SDavid du Colombier	MOVW	0x28(SP), R31
432*3e12c5d1SDavid du Colombier	MOVW	0x2C(SP), R30
433*3e12c5d1SDavid du Colombier	MOVW	0x3C(SP), R(MACH)
434*3e12c5d1SDavid du Colombier	MOVW	0x40(SP), R(USER)
435*3e12c5d1SDavid du Colombier	MOVW	0x10(SP), SP
436*3e12c5d1SDavid du Colombier	RFE	(R26)
437*3e12c5d1SDavid du Colombier
438*3e12c5d1SDavid du Colombierwaskernel:
439*3e12c5d1SDavid du Colombier	MOVW	$1, R26			/* not sys call */
440*3e12c5d1SDavid du Colombier	MOVW	SP, -0x90(SP)		/* drop this if possible */
441*3e12c5d1SDavid du Colombier	SUB	$0xA0, SP
442*3e12c5d1SDavid du Colombier	MOVW	R31, 0x28(SP)
443*3e12c5d1SDavid du Colombier	JAL	saveregs(SB)
444*3e12c5d1SDavid du Colombier	JAL	trap(SB)
445*3e12c5d1SDavid du Colombier	JAL	restregs(SB)
446*3e12c5d1SDavid du Colombier	MOVW	0x28(SP), R31
447*3e12c5d1SDavid du Colombier	ADD	$0xA0, SP
448*3e12c5d1SDavid du Colombier	RFE	(R26)
449*3e12c5d1SDavid du Colombier
450*3e12c5d1SDavid du ColombierTEXT	saveregs(SB), $-4
451*3e12c5d1SDavid du Colombier	MOVW	R1, 0x9C(SP)
452*3e12c5d1SDavid du Colombier	MOVW	R2, 0x98(SP)
453*3e12c5d1SDavid du Colombier	ADDU	$8, SP, R1
454*3e12c5d1SDavid du Colombier	MOVW	R1, 0x04(SP)		/* arg to base of regs */
455*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R1
456*3e12c5d1SDavid du Colombier	MOVW	M(EPC), R2
457*3e12c5d1SDavid du Colombier	MOVW	R1, 0x08(SP)
458*3e12c5d1SDavid du Colombier	MOVW	R2, 0x0C(SP)
459*3e12c5d1SDavid du Colombier
460*3e12c5d1SDavid du Colombier	BEQ	R26, return		/* sys call, don't save */
461*3e12c5d1SDavid du Colombier
462*3e12c5d1SDavid du Colombier	MOVW	M(CAUSE), R1
463*3e12c5d1SDavid du Colombier	MOVW	M(BADVADDR), R2
464*3e12c5d1SDavid du Colombier	MOVW	R1, 0x14(SP)
465*3e12c5d1SDavid du Colombier	MOVW	M(TLBVIRT), R1
466*3e12c5d1SDavid du Colombier	MOVW	R2, 0x18(SP)
467*3e12c5d1SDavid du Colombier	MOVW	R1, 0x1C(SP)
468*3e12c5d1SDavid du Colombier	MOVW	HI, R1
469*3e12c5d1SDavid du Colombier	MOVW	LO, R2
470*3e12c5d1SDavid du Colombier	MOVW	R1, 0x20(SP)
471*3e12c5d1SDavid du Colombier	MOVW	R2, 0x24(SP)
472*3e12c5d1SDavid du Colombier					/* LINK,SB,SP missing */
473*3e12c5d1SDavid du Colombier	MOVW	R28, 0x30(SP)
474*3e12c5d1SDavid du Colombier					/* R27, R26 not saved */
475*3e12c5d1SDavid du Colombier					/* R25, R24 missing */
476*3e12c5d1SDavid du Colombier	MOVW	R23, 0x44(SP)
477*3e12c5d1SDavid du Colombier	MOVW	R22, 0x48(SP)
478*3e12c5d1SDavid du Colombier	MOVW	R21, 0x4C(SP)
479*3e12c5d1SDavid du Colombier	MOVW	R20, 0x50(SP)
480*3e12c5d1SDavid du Colombier	MOVW	R19, 0x54(SP)
481*3e12c5d1SDavid du Colombier	MOVW	R18, 0x58(SP)
482*3e12c5d1SDavid du Colombier	MOVW	R17, 0x5C(SP)
483*3e12c5d1SDavid du Colombier	MOVW	R16, 0x60(SP)
484*3e12c5d1SDavid du Colombier	MOVW	R15, 0x64(SP)
485*3e12c5d1SDavid du Colombier	MOVW	R14, 0x68(SP)
486*3e12c5d1SDavid du Colombier	MOVW	R13, 0x6C(SP)
487*3e12c5d1SDavid du Colombier	MOVW	R12, 0x70(SP)
488*3e12c5d1SDavid du Colombier	MOVW	R11, 0x74(SP)
489*3e12c5d1SDavid du Colombier	MOVW	R10, 0x78(SP)
490*3e12c5d1SDavid du Colombier	MOVW	R9, 0x7C(SP)
491*3e12c5d1SDavid du Colombier	MOVW	R8, 0x80(SP)
492*3e12c5d1SDavid du Colombier	MOVW	R7, 0x84(SP)
493*3e12c5d1SDavid du Colombier	MOVW	R6, 0x88(SP)
494*3e12c5d1SDavid du Colombier	MOVW	R5, 0x8C(SP)
495*3e12c5d1SDavid du Colombier	MOVW	R4, 0x90(SP)
496*3e12c5d1SDavid du Colombier	MOVW	R3, 0x94(SP)
497*3e12c5d1SDavid du Colombierreturn:
498*3e12c5d1SDavid du Colombier	RET
499*3e12c5d1SDavid du Colombier
500*3e12c5d1SDavid du ColombierTEXT	restregs(SB), $-4
501*3e12c5d1SDavid du Colombier					/* LINK,SB,SP missing */
502*3e12c5d1SDavid du Colombier	MOVW	0x30(SP), R28
503*3e12c5d1SDavid du Colombier					/* R27, R26 not saved */
504*3e12c5d1SDavid du Colombier					/* R25, R24 missing */
505*3e12c5d1SDavid du Colombier	MOVW	0x44(SP), R23
506*3e12c5d1SDavid du Colombier	MOVW	0x48(SP), R22
507*3e12c5d1SDavid du Colombier	MOVW	0x4C(SP), R21
508*3e12c5d1SDavid du Colombier	MOVW	0x50(SP), R20
509*3e12c5d1SDavid du Colombier	MOVW	0x54(SP), R19
510*3e12c5d1SDavid du Colombier	MOVW	0x58(SP), R18
511*3e12c5d1SDavid du Colombier	MOVW	0x5C(SP), R17
512*3e12c5d1SDavid du Colombier	MOVW	0x60(SP), R16
513*3e12c5d1SDavid du Colombier	MOVW	0x64(SP), R15
514*3e12c5d1SDavid du Colombier	MOVW	0x68(SP), R14
515*3e12c5d1SDavid du Colombier	MOVW	0x6C(SP), R13
516*3e12c5d1SDavid du Colombier	MOVW	0x70(SP), R12
517*3e12c5d1SDavid du Colombier	MOVW	0x74(SP), R11
518*3e12c5d1SDavid du Colombier	MOVW	0x78(SP), R10
519*3e12c5d1SDavid du Colombier	MOVW	0x7C(SP), R9
520*3e12c5d1SDavid du Colombier	MOVW	0x80(SP), R8
521*3e12c5d1SDavid du Colombier	MOVW	0x84(SP), R7
522*3e12c5d1SDavid du Colombier	MOVW	0x88(SP), R6
523*3e12c5d1SDavid du Colombier	MOVW	0x8C(SP), R5
524*3e12c5d1SDavid du Colombier	MOVW	0x90(SP), R4
525*3e12c5d1SDavid du Colombier	MOVW	0x94(SP), R3
526*3e12c5d1SDavid du Colombier	MOVW	0x24(SP), R2
527*3e12c5d1SDavid du Colombier	MOVW	0x20(SP), R1
528*3e12c5d1SDavid du Colombier	MOVW	R2, LO
529*3e12c5d1SDavid du Colombier	MOVW	R1, HI
530*3e12c5d1SDavid du Colombier	MOVW	0x08(SP), R1
531*3e12c5d1SDavid du Colombier	MOVW	0x98(SP), R2
532*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
533*3e12c5d1SDavid du Colombier	NOOP
534*3e12c5d1SDavid du Colombier	MOVW	0x9C(SP), R1
535*3e12c5d1SDavid du Colombier	MOVW	0x0C(SP), R26		/* old pc */
536*3e12c5d1SDavid du Colombier	RET
537*3e12c5d1SDavid du Colombier
538*3e12c5d1SDavid du ColombierTEXT	rfnote(SB), $0
539*3e12c5d1SDavid du Colombier	MOVW	0(FP), R26		/* 1st arg is &uregpointer */
540*3e12c5d1SDavid du Colombier	SUBU	$(BY2WD), R26, SP	/* pc hole */
541*3e12c5d1SDavid du Colombier	BNE	R26, restore
542*3e12c5d1SDavid du Colombier
543*3e12c5d1SDavid du Colombier
544*3e12c5d1SDavid du ColombierTEXT	clrfpintr(SB), $0
545*3e12c5d1SDavid du Colombier	MOVW	FCR31, R1
546*3e12c5d1SDavid du Colombier	MOVW	R1, R2
547*3e12c5d1SDavid du Colombier	AND	$~(0x3F<<12), R2
548*3e12c5d1SDavid du Colombier	MOVW	R2, FCR31
549*3e12c5d1SDavid du Colombier	RET
550*3e12c5d1SDavid du Colombier
551*3e12c5d1SDavid du ColombierTEXT	savefpregs(SB), $0
552*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R3
553*3e12c5d1SDavid du Colombier	MOVW	0(FP), R1
554*3e12c5d1SDavid du Colombier	MOVW	FCR31, R2
555*3e12c5d1SDavid du Colombier
556*3e12c5d1SDavid du Colombier	MOVD	F0, 0x00(R1)
557*3e12c5d1SDavid du Colombier	MOVD	F2, 0x08(R1)
558*3e12c5d1SDavid du Colombier	MOVD	F4, 0x10(R1)
559*3e12c5d1SDavid du Colombier	MOVD	F6, 0x18(R1)
560*3e12c5d1SDavid du Colombier	MOVD	F8, 0x20(R1)
561*3e12c5d1SDavid du Colombier	MOVD	F10, 0x28(R1)
562*3e12c5d1SDavid du Colombier	MOVD	F12, 0x30(R1)
563*3e12c5d1SDavid du Colombier	MOVD	F14, 0x38(R1)
564*3e12c5d1SDavid du Colombier	MOVD	F16, 0x40(R1)
565*3e12c5d1SDavid du Colombier	MOVD	F18, 0x48(R1)
566*3e12c5d1SDavid du Colombier	MOVD	F20, 0x50(R1)
567*3e12c5d1SDavid du Colombier	MOVD	F22, 0x58(R1)
568*3e12c5d1SDavid du Colombier	MOVD	F24, 0x60(R1)
569*3e12c5d1SDavid du Colombier	MOVD	F26, 0x68(R1)
570*3e12c5d1SDavid du Colombier	MOVD	F28, 0x70(R1)
571*3e12c5d1SDavid du Colombier	MOVD	F30, 0x78(R1)
572*3e12c5d1SDavid du Colombier
573*3e12c5d1SDavid du Colombier	MOVW	R2, 0x80(R1)
574*3e12c5d1SDavid du Colombier	AND	$~CU1, R3
575*3e12c5d1SDavid du Colombier	MOVW	R3, M(STATUS)
576*3e12c5d1SDavid du Colombier	RET
577*3e12c5d1SDavid du Colombier
578*3e12c5d1SDavid du ColombierTEXT	restfpregs(SB), $0
579*3e12c5d1SDavid du Colombier
580*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R3
581*3e12c5d1SDavid du Colombier	MOVW	0(FP), R1
582*3e12c5d1SDavid du Colombier	OR	$CU1, R3
583*3e12c5d1SDavid du Colombier	MOVW	R3, M(STATUS)
584*3e12c5d1SDavid du Colombier	MOVW	0x80(R1), R2
585*3e12c5d1SDavid du Colombier
586*3e12c5d1SDavid du Colombier	MOVD	0x00(R1), F0
587*3e12c5d1SDavid du Colombier	MOVD	0x08(R1), F2
588*3e12c5d1SDavid du Colombier	MOVD	0x10(R1), F4
589*3e12c5d1SDavid du Colombier	MOVD	0x18(R1), F6
590*3e12c5d1SDavid du Colombier	MOVD	0x20(R1), F8
591*3e12c5d1SDavid du Colombier	MOVD	0x28(R1), F10
592*3e12c5d1SDavid du Colombier	MOVD	0x30(R1), F12
593*3e12c5d1SDavid du Colombier	MOVD	0x38(R1), F14
594*3e12c5d1SDavid du Colombier	MOVD	0x40(R1), F16
595*3e12c5d1SDavid du Colombier	MOVD	0x48(R1), F18
596*3e12c5d1SDavid du Colombier	MOVD	0x50(R1), F20
597*3e12c5d1SDavid du Colombier	MOVD	0x58(R1), F22
598*3e12c5d1SDavid du Colombier	MOVD	0x60(R1), F24
599*3e12c5d1SDavid du Colombier	MOVD	0x68(R1), F26
600*3e12c5d1SDavid du Colombier	MOVD	0x70(R1), F28
601*3e12c5d1SDavid du Colombier	MOVD	0x78(R1), F30
602*3e12c5d1SDavid du Colombier
603*3e12c5d1SDavid du Colombier	MOVW	R2, FCR31
604*3e12c5d1SDavid du Colombier	AND	$~CU1, R3
605*3e12c5d1SDavid du Colombier	MOVW	R3, M(STATUS)
606*3e12c5d1SDavid du Colombier	RET
607*3e12c5d1SDavid du Colombier
608*3e12c5d1SDavid du Colombier/*
609*3e12c5d1SDavid du Colombier *  we avoid using R4, R5, R6, and R7 so gotopc can call us without saving them
610*3e12c5d1SDavid du Colombier */
611*3e12c5d1SDavid du ColombierTEXT icflush(SB), $-4			/* icflush(physaddr, nbytes) */
612*3e12c5d1SDavid du Colombier
613*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R10
614*3e12c5d1SDavid du Colombier	MOVW	0(FP), R8
615*3e12c5d1SDavid du Colombier	MOVW	4(FP), R9
616*3e12c5d1SDavid du Colombier	MOVW	$KSEG0, R3
617*3e12c5d1SDavid du Colombier	OR	R3, R8
618*3e12c5d1SDavid du Colombier	MOVW	$0, M(STATUS)
619*3e12c5d1SDavid du Colombier	MOVW	$WBFLUSH, R1		/* wbflush */
620*3e12c5d1SDavid du Colombier	MOVW	0(R1), R1
621*3e12c5d1SDavid du Colombier	NOOP
622*3e12c5d1SDavid du Colombier	MOVW	$KSEG1, R3
623*3e12c5d1SDavid du Colombier	MOVW	$icflush0(SB), R2	/* make sure PC is in uncached address space */
624*3e12c5d1SDavid du Colombier	MOVW	$(SWC|ISC), R1
625*3e12c5d1SDavid du Colombier	OR	R3, R2
626*3e12c5d1SDavid du Colombier	JMP	(R2)
627*3e12c5d1SDavid du Colombier
628*3e12c5d1SDavid du ColombierTEXT icflush0(SB), $-4
629*3e12c5d1SDavid du Colombier
630*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)		/* swap and isolate cache, splhi */
631*3e12c5d1SDavid du Colombier	MOVW	$icflush1(SB), R2
632*3e12c5d1SDavid du Colombier	JMP	(R2)
633*3e12c5d1SDavid du Colombier
634*3e12c5d1SDavid du ColombierTEXT icflush1(SB), $-4
635*3e12c5d1SDavid du Colombier
636*3e12c5d1SDavid du Colombier_icflush1:
637*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x00(R8)
638*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x04(R8)
639*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x08(R8)
640*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x0C(R8)
641*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x10(R8)
642*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x14(R8)
643*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x18(R8)
644*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x1C(R8)
645*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x20(R8)
646*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x24(R8)
647*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x28(R8)
648*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x2C(R8)
649*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x30(R8)
650*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x34(R8)
651*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x38(R8)
652*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x3C(R8)
653*3e12c5d1SDavid du Colombier	SUB	$0x40, R9
654*3e12c5d1SDavid du Colombier	ADD	$0x40, R8
655*3e12c5d1SDavid du Colombier	BGTZ	R9, _icflush1
656*3e12c5d1SDavid du Colombier	MOVW	$icflush2(SB), R2	/* make sure PC is in uncached address space */
657*3e12c5d1SDavid du Colombier	OR	R3, R2
658*3e12c5d1SDavid du Colombier	JMP	(R2)
659*3e12c5d1SDavid du Colombier
660*3e12c5d1SDavid du ColombierTEXT icflush2(SB), $-4
661*3e12c5d1SDavid du Colombier
662*3e12c5d1SDavid du Colombier	MOVW	$0, M(STATUS)		/* swap back caches, de-isolate them, and stay splhi */
663*3e12c5d1SDavid du Colombier	NOOP				/* +++ */
664*3e12c5d1SDavid du Colombier	MOVW	R10, M(STATUS)
665*3e12c5d1SDavid du Colombier	RET
666*3e12c5d1SDavid du Colombier
667*3e12c5d1SDavid du ColombierTEXT dcflush(SB), $-4			/* dcflush(physaddr, nbytes) */
668*3e12c5d1SDavid du Colombier
669*3e12c5d1SDavid du Colombier	MOVW	M(STATUS), R6
670*3e12c5d1SDavid du Colombier	MOVW	0(FP), R4
671*3e12c5d1SDavid du Colombier	MOVW	4(FP), R5
672*3e12c5d1SDavid du Colombier	MOVW	$KSEG0, R3
673*3e12c5d1SDavid du Colombier	OR	R3, R4
674*3e12c5d1SDavid du Colombier	MOVW	$0, M(STATUS)
675*3e12c5d1SDavid du Colombier	MOVW	$WBFLUSH, R1
676*3e12c5d1SDavid du Colombier	MOVW	0(R1), R1
677*3e12c5d1SDavid du Colombier	NOOP
678*3e12c5d1SDavid du Colombier	MOVW	$ISC, R1
679*3e12c5d1SDavid du Colombier	MOVW	R1, M(STATUS)
680*3e12c5d1SDavid du Colombier_dcflush0:
681*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x00(R4)
682*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x04(R4)
683*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x08(R4)
684*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x0C(R4)
685*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x10(R4)
686*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x14(R4)
687*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x18(R4)
688*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x1C(R4)
689*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x20(R4)
690*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x24(R4)
691*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x28(R4)
692*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x2C(R4)
693*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x30(R4)
694*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x34(R4)
695*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x38(R4)
696*3e12c5d1SDavid du Colombier	MOVBU	R0, 0x3C(R4)
697*3e12c5d1SDavid du Colombier	SUB	$0x40, R5
698*3e12c5d1SDavid du Colombier	ADD	$0x40, R4
699*3e12c5d1SDavid du Colombier	BGTZ	R5, _dcflush0
700*3e12c5d1SDavid du Colombier	MOVW	$0, M(STATUS)
701*3e12c5d1SDavid du Colombier	NOOP				/* +++ */
702*3e12c5d1SDavid du Colombier	MOVW	R6, M(STATUS)
703*3e12c5d1SDavid du Colombier	RET
704