xref: /plan9-contrib/sys/src/cmd/ka/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#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
16*3e12c5d1SDavid du Colombier
17*3e12c5d1SDavid du Colombier#define	MAXMACH		1			/* max # cpus system can run */
18*3e12c5d1SDavid du Colombier
19*3e12c5d1SDavid du Colombier/*
20*3e12c5d1SDavid du Colombier * Time
21*3e12c5d1SDavid du Colombier */
22*3e12c5d1SDavid du Colombier#define	HZ		20			/* clock frequency */
23*3e12c5d1SDavid du Colombier#define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
24*3e12c5d1SDavid du Colombier#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
25*3e12c5d1SDavid du Colombier#define	TK2MS(t)	((((ulong)(t))*1000)/HZ)	/* ticks to milliseconds */
26*3e12c5d1SDavid du Colombier#define	MS2TK(t)	((((ulong)(t))*HZ)/1000)	/* milliseconds to ticks */
27*3e12c5d1SDavid du Colombier
28*3e12c5d1SDavid du Colombier/*
29*3e12c5d1SDavid du Colombier * PSR bits
30*3e12c5d1SDavid du Colombier */
31*3e12c5d1SDavid du Colombier#define	PSREC		0x00002000
32*3e12c5d1SDavid du Colombier#define	PSREF		0x00001000
33*3e12c5d1SDavid du Colombier#define PSRSUPER	0x00000080
34*3e12c5d1SDavid du Colombier#define PSRPSUPER	0x00000040
35*3e12c5d1SDavid du Colombier#define	PSRET		0x00000020
36*3e12c5d1SDavid du Colombier#define SPL(n)		(n<<8)
37*3e12c5d1SDavid du Colombier
38*3e12c5d1SDavid du Colombier/*
39*3e12c5d1SDavid du Colombier * Magic registers
40*3e12c5d1SDavid du Colombier */
41*3e12c5d1SDavid du Colombier
42*3e12c5d1SDavid du Colombier#define	MACH		6		/* R6 is m-> */
43*3e12c5d1SDavid du Colombier#define	USER		5		/* R5 is u-> */
44*3e12c5d1SDavid du Colombier
45*3e12c5d1SDavid du Colombier/*
46*3e12c5d1SDavid du Colombier * Fundamental addresses
47*3e12c5d1SDavid du Colombier */
48*3e12c5d1SDavid du Colombier
49*3e12c5d1SDavid du Colombier#define	USERADDR	0xE0000000
50*3e12c5d1SDavid du Colombier#define	UREGADDR	(USERADDR+BY2PG-((32+6)*BY2WD))
51*3e12c5d1SDavid du Colombier#define	BOOTSTACK	(KTZERO-0*BY2PG)
52*3e12c5d1SDavid du Colombier#define	TRAPS		(KTZERO-2*BY2PG)
53*3e12c5d1SDavid du Colombier
54*3e12c5d1SDavid du Colombier/*
55*3e12c5d1SDavid du Colombier * MMU
56*3e12c5d1SDavid du Colombier */
57*3e12c5d1SDavid du Colombier
58*3e12c5d1SDavid du Colombier#define	VAMASK		0x3FFFFFFF
59*3e12c5d1SDavid du Colombier#define	NPMEG		(1<<12)
60*3e12c5d1SDavid du Colombier#define	BY2SEGM		(1<<18)
61*3e12c5d1SDavid du Colombier#define	PG2SEGM		(1<<6)
62*3e12c5d1SDavid du Colombier#define	NTLBPID		(1+NCONTEXT)	/* TLBPID 0 is unallocated */
63*3e12c5d1SDavid du Colombier#define	NCONTEXT	8
64*3e12c5d1SDavid du Colombier#define	CONTEXT		0x30000000	/* in ASI 2 */
65*3e12c5d1SDavid du Colombier
66*3e12c5d1SDavid du Colombier/*
67*3e12c5d1SDavid du Colombier * MMU regions
68*3e12c5d1SDavid du Colombier */
69*3e12c5d1SDavid du Colombier#define	INVALIDSEGM	0xFFFC0000	/* highest seg of VA reserved as invalid */
70*3e12c5d1SDavid du Colombier#define	INVALIDPMEG	0x7F
71*3e12c5d1SDavid du Colombier#define	SCREENSEGM	0xFFF80000
72*3e12c5d1SDavid du Colombier#define	SCREENPMEG	0x7E
73*3e12c5d1SDavid du Colombier#define	ROMSEGM		0xFFE80000
74*3e12c5d1SDavid du Colombier#define	ROMEND		0xFFEA0000
75*3e12c5d1SDavid du Colombier#define	PG2ROM		((ROMEND-ROMSEGM)/BY2PG)
76*3e12c5d1SDavid du Colombier#define	IOSEGM0		ROMSEGM		/* see mmuinit() */
77*3e12c5d1SDavid du Colombier#define	NIOSEGM		((SCREENSEGM-ROMSEGM)/BY2SEGM)
78*3e12c5d1SDavid du Colombier#define	IOPMEG0		(SCREENPMEG-NIOSEGM)
79*3e12c5d1SDavid du Colombier#define	IOSEGM		ROMEND
80*3e12c5d1SDavid du Colombier#define	IOEND		SCREENSEGM
81*3e12c5d1SDavid du Colombier#define	TOPPMEG		IOPMEG0
82*3e12c5d1SDavid du Colombier
83*3e12c5d1SDavid du Colombier/*
84*3e12c5d1SDavid du Colombier * MMU entries
85*3e12c5d1SDavid du Colombier */
86*3e12c5d1SDavid du Colombier#define	PTEVALID	(1<<31)
87*3e12c5d1SDavid du Colombier#define	PTERONLY	(0<<30)
88*3e12c5d1SDavid du Colombier#define	PTEWRITE	(1<<30)
89*3e12c5d1SDavid du Colombier#define	PTEKERNEL	(1<<29)
90*3e12c5d1SDavid du Colombier#define	PTENOCACHE	(1<<28)
91*3e12c5d1SDavid du Colombier#define	PTEMAINMEM	(0<<26)
92*3e12c5d1SDavid du Colombier#define	PTEIO		(1<<26)
93*3e12c5d1SDavid du Colombier#define	PTEACCESS	(1<<25)
94*3e12c5d1SDavid du Colombier#define	PTEMODIFY	(1<<24)
95*3e12c5d1SDavid du Colombier#define PTEUNCACHED	0
96*3e12c5d1SDavid du Colombier#define PTEMAPMEM	(1024*1024)
97*3e12c5d1SDavid du Colombier#define	PTEPERTAB	(PTEMAPMEM/BY2PG)
98*3e12c5d1SDavid du Colombier#define SEGMAPSIZE	16
99*3e12c5d1SDavid du Colombier
100*3e12c5d1SDavid du Colombier#define	INVALIDPTE	0
101*3e12c5d1SDavid du Colombier#define	PPN(pa)		((pa>>12)&0xFFFF)
102*3e12c5d1SDavid du Colombier
103*3e12c5d1SDavid du Colombier/*
104*3e12c5d1SDavid du Colombier * Weird addresses in various ASI's
105*3e12c5d1SDavid du Colombier */
106*3e12c5d1SDavid du Colombier#define	CACHETAGS	0x80000000		/* ASI 2 */
107*3e12c5d1SDavid du Colombier#define	CACHEDATA	0x90000000		/* ASI 2 */
108*3e12c5d1SDavid du Colombier#define	SER		0x60000000		/* ASI 2 */
109*3e12c5d1SDavid du Colombier#define	SEVAR		0x60000004		/* ASI 2 */
110*3e12c5d1SDavid du Colombier#define	ASER		0x60000008		/* ASI 2 */
111*3e12c5d1SDavid du Colombier#define	ASEVAR		0x6000000C		/* ASI 2 */
112*3e12c5d1SDavid du Colombier#define	ENAB		0x40000000		/* ASI 2 */
113*3e12c5d1SDavid du Colombier#define	ENABCACHE	0x10
114*3e12c5d1SDavid du Colombier#define	ENABRESET	0x04
115*3e12c5d1SDavid du Colombier
116*3e12c5d1SDavid du Colombier/*
117*3e12c5d1SDavid du Colombier * Virtual addresses
118*3e12c5d1SDavid du Colombier */
119*3e12c5d1SDavid du Colombier#define	VTAG(va)	((va>>22)&0x03F)
120*3e12c5d1SDavid du Colombier#define	VPN(va)		((va>>13)&0x1FF)
121*3e12c5d1SDavid du Colombier
122*3e12c5d1SDavid du Colombier#define	PARAM		((char*)0x40500000)
123*3e12c5d1SDavid du Colombier#define	TLBFLUSH_	0x01
124*3e12c5d1SDavid du Colombier
125*3e12c5d1SDavid du Colombier/*
126*3e12c5d1SDavid du Colombier * Address spaces
127*3e12c5d1SDavid du Colombier */
128*3e12c5d1SDavid du Colombier
129*3e12c5d1SDavid du Colombier#define	UZERO	0x00000000		/* base of user address space */
130*3e12c5d1SDavid du Colombier#define	UTZERO	(UZERO+BY2PG)		/* first address in user text */
131*3e12c5d1SDavid du Colombier#define	TSTKTOP	0x10000000		/* end of new stack in sysexec */
132*3e12c5d1SDavid du Colombier#define TSTKSIZ 32
133*3e12c5d1SDavid du Colombier#define	USTKTOP	(TSTKTOP-TSTKSIZ*BY2PG)	/* byte just beyond user stack */
134*3e12c5d1SDavid du Colombier#define	KZERO	0xE0000000		/* base of kernel address space */
135*3e12c5d1SDavid du Colombier#define	KTZERO	(KZERO+4*BY2PG)		/* first address in kernel text */
136*3e12c5d1SDavid du Colombier#define	USTKSIZE	(4*1024*1024)	/* size of user stack */
137*3e12c5d1SDavid du Colombier
138*3e12c5d1SDavid du Colombier#define	MACHSIZE	4096
139*3e12c5d1SDavid du Colombier
140*3e12c5d1SDavid du Colombier#define isphys(x) (((ulong)(x)&0xF0000000) == KZERO)
141*3e12c5d1SDavid du Colombier
142*3e12c5d1SDavid du Colombier#define	SYSPSR	(SPL(0x0)|PSREF|PSRSUPER|0)
143*3e12c5d1SDavid du Colombier#define	NOOP	OR R0, R0; OR R0, R0; OR R0, R0
144*3e12c5d1SDavid du Colombier
145*3e12c5d1SDavid du ColombierTEXT	start(SB), $-4
146*3e12c5d1SDavid du Colombier
147*3e12c5d1SDavid du Colombier	/* get virtual, fast */
148*3e12c5d1SDavid du Colombier	/* we are executing in segment 0, mapped to pmeg 0. stack is there too */
149*3e12c5d1SDavid du Colombier	/* get virtual by mapping segment(KZERO) to pmeg 0., and next to 1 */
150*3e12c5d1SDavid du Colombier	MOVW	$KZERO, R7
151*3e12c5d1SDavid du Colombier	MOVB	R0, (R7, 3)
152*3e12c5d1SDavid du Colombier	MOVW	$(KZERO+BY2SEGM), R7
153*3e12c5d1SDavid du Colombier	MOVW	$1, R8
154*3e12c5d1SDavid du Colombier	MOVB	R8, (R7, 3)
155*3e12c5d1SDavid du Colombier	/* now mapped correctly.  jmpl to where we want to be */
156*3e12c5d1SDavid du Colombier	MOVW	$setSB(SB), R2
157*3e12c5d1SDavid du Colombier	MOVW	$startvirt(SB), R7
158*3e12c5d1SDavid du Colombier	JMPL	(R7)
159*3e12c5d1SDavid du Colombier	MOVW	$_mul(SB), R0	/* touch _mul etc.; doesn't need to execute */
160*3e12c5d1SDavid du Colombier	RETURN			/* can't get here */
161*3e12c5d1SDavid du Colombier
162*3e12c5d1SDavid du ColombierTEXT	startvirt(SB), $-4
163*3e12c5d1SDavid du Colombier
164*3e12c5d1SDavid du Colombier	MOVW	$BOOTSTACK, R1
165*3e12c5d1SDavid du Colombier
166*3e12c5d1SDavid du Colombier	MOVW	$(SPL(0xF)|PSREF|PSRSUPER), R7
167*3e12c5d1SDavid du Colombier	MOVW	R7, PSR
168*3e12c5d1SDavid du Colombier
169*3e12c5d1SDavid du Colombier	MOVW	$(0x35<<22), R7		/* NVM OFM DZM AU */
170*3e12c5d1SDavid du Colombier	MOVW	R7, fsr+0(SB)
171*3e12c5d1SDavid du Colombier	MOVW	fsr+0(SB), FSR
172*3e12c5d1SDavid du Colombier	FMOVD	$0.5, F26		/* 0.5 -> F26 */
173*3e12c5d1SDavid du Colombier	FSUBD	F26, F26, F24		/* 0.0 -> F24 */
174*3e12c5d1SDavid du Colombier	FADDD	F26, F26, F28		/* 1.0 -> F28 */
175*3e12c5d1SDavid du Colombier	FADDD	F28, F28, F30		/* 2.0 -> F30 */
176*3e12c5d1SDavid du Colombier
177*3e12c5d1SDavid du Colombier	FMOVD	F24, F0
178*3e12c5d1SDavid du Colombier	FMOVD	F24, F2
179*3e12c5d1SDavid du Colombier	FMOVD	F24, F4
180*3e12c5d1SDavid du Colombier	FMOVD	F24, F6
181*3e12c5d1SDavid du Colombier	FMOVD	F24, F8
182*3e12c5d1SDavid du Colombier	FMOVD	F24, F10
183*3e12c5d1SDavid du Colombier	FMOVD	F24, F12
184*3e12c5d1SDavid du Colombier	FMOVD	F24, F14
185*3e12c5d1SDavid du Colombier	FMOVD	F24, F16
186*3e12c5d1SDavid du Colombier	FMOVD	F24, F18
187*3e12c5d1SDavid du Colombier	FMOVD	F24, F20
188*3e12c5d1SDavid du Colombier	FMOVD	F24, F22
189*3e12c5d1SDavid du Colombier
190*3e12c5d1SDavid du Colombier	MOVW	$mach0(SB), R(MACH)
191*3e12c5d1SDavid du Colombier/*	MOVW	$0x8, R7 /**/
192*3e12c5d1SDavid du Colombier	MOVW	R0, WIM
193*3e12c5d1SDavid du Colombier	JMPL	main(SB)
194*3e12c5d1SDavid du Colombier	MOVW	(R0), R0
195*3e12c5d1SDavid du Colombier	RETURN
196*3e12c5d1SDavid du Colombier
197*3e12c5d1SDavid du ColombierTEXT	swap1(SB), $0
198*3e12c5d1SDavid du Colombier
199*3e12c5d1SDavid du Colombier	TAS	(R7), R7		/* LDSTUB, thank you ken */
200*3e12c5d1SDavid du Colombier	RETURN
201*3e12c5d1SDavid du Colombier
202*3e12c5d1SDavid du ColombierTEXT	swap1_should_work(SB), $0
203*3e12c5d1SDavid du Colombier
204*3e12c5d1SDavid du Colombier	MOVW	R7, R8
205*3e12c5d1SDavid du Colombier	MOVW	$1, R7
206*3e12c5d1SDavid du Colombier	SWAP	(R8), R7
207*3e12c5d1SDavid du Colombier	RETURN
208*3e12c5d1SDavid du Colombier
209*3e12c5d1SDavid du ColombierTEXT	swap1x(SB), $0
210*3e12c5d1SDavid du Colombier
211*3e12c5d1SDavid du Colombier	MOVW	PSR, R9
212*3e12c5d1SDavid du Colombier	MOVW	R9, R10
213*3e12c5d1SDavid du Colombier	AND	$~PSRET, R10		/* BUG: book says this is buggy */
214*3e12c5d1SDavid du Colombier	MOVW	R10, PSR
215*3e12c5d1SDavid du Colombier	NOOP
216*3e12c5d1SDavid du Colombier	MOVW	(R7), R7
217*3e12c5d1SDavid du Colombier	CMP	R7, R0
218*3e12c5d1SDavid du Colombier	BNE	was1
219*3e12c5d1SDavid du Colombier	MOVW	$1, R10
220*3e12c5d1SDavid du Colombier	MOVW	R10, (R8)
221*3e12c5d1SDavid du Colombierwas1:
222*3e12c5d1SDavid du Colombier	MOVW	R9, PSR
223*3e12c5d1SDavid du Colombier	RETURN
224*3e12c5d1SDavid du Colombier
225*3e12c5d1SDavid du ColombierTEXT	spllo(SB), $0
226*3e12c5d1SDavid du Colombier
227*3e12c5d1SDavid du Colombier	MOVW	PSR, R7
228*3e12c5d1SDavid du Colombier	MOVW	R7, R10
229*3e12c5d1SDavid du Colombier	OR	$PSRET, R10
230*3e12c5d1SDavid du Colombier	MOVW	R10, PSR
231*3e12c5d1SDavid du Colombier	NOOP
232*3e12c5d1SDavid du Colombier	RETURN
233*3e12c5d1SDavid du Colombier
234*3e12c5d1SDavid du ColombierTEXT	splhi(SB), $0
235*3e12c5d1SDavid du Colombier
236*3e12c5d1SDavid du Colombier	MOVW	R15, 4(R(MACH))	/* save PC in m->splpc */
237*3e12c5d1SDavid du Colombier	MOVW	PSR, R7
238*3e12c5d1SDavid du Colombier	MOVW	R7, R10
239*3e12c5d1SDavid du Colombier	AND	$~PSRET, R10	/* BUG: book says this is buggy */
240*3e12c5d1SDavid du Colombier	MOVW	R10, PSR
241*3e12c5d1SDavid du Colombier	NOOP
242*3e12c5d1SDavid du Colombier	RETURN
243*3e12c5d1SDavid du Colombier
244*3e12c5d1SDavid du ColombierTEXT	splx(SB), $0
245*3e12c5d1SDavid du Colombier
246*3e12c5d1SDavid du Colombier	MOVW	R15, 4(R(MACH))	/* save PC in m->splpc */
247*3e12c5d1SDavid du Colombier	MOVW	R7, PSR		/* BUG: book says this is buggy */
248*3e12c5d1SDavid du Colombier	NOOP
249*3e12c5d1SDavid du Colombier	RETURN
250*3e12c5d1SDavid du Colombier
251*3e12c5d1SDavid du ColombierTEXT	spldone(SB), $0
252*3e12c5d1SDavid du Colombier
253*3e12c5d1SDavid du Colombier	RETURN
254*3e12c5d1SDavid du Colombier
255*3e12c5d1SDavid du ColombierTEXT	touser(SB), $0
256*3e12c5d1SDavid du Colombier	MOVW	$(SYSPSR&~PSREF), R8
257*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
258*3e12c5d1SDavid du Colombier	NOOP
259*3e12c5d1SDavid du Colombier
260*3e12c5d1SDavid du Colombier	MOVW	R7, R1
261*3e12c5d1SDavid du Colombier	SAVE	R0, R0			/* RETT is implicit RESTORE */
262*3e12c5d1SDavid du Colombier	MOVW	$(UTZERO+32), R7	/* PC; header appears in text */
263*3e12c5d1SDavid du Colombier	MOVW	$(UTZERO+32+4), R8	/* nPC */
264*3e12c5d1SDavid du Colombier	RETT	R7, R8
265*3e12c5d1SDavid du Colombier
266*3e12c5d1SDavid du ColombierTEXT	rfnote(SB), $0
267*3e12c5d1SDavid du Colombier
268*3e12c5d1SDavid du Colombier	MOVW	R7, R1			/* 1st arg is &uregpointer */
269*3e12c5d1SDavid du Colombier	ADD	$4, R1			/* point at ureg */
270*3e12c5d1SDavid du Colombier	JMP	restore
271*3e12c5d1SDavid du Colombier
272*3e12c5d1SDavid du ColombierTEXT	traplink(SB), $-4
273*3e12c5d1SDavid du Colombier
274*3e12c5d1SDavid du Colombier	/* R8 to R23 are free to play with */
275*3e12c5d1SDavid du Colombier	/* R17 contains PC, R18 contains nPC */
276*3e12c5d1SDavid du Colombier	/* R19 has PSR loaded from vector code */
277*3e12c5d1SDavid du Colombier
278*3e12c5d1SDavid du Colombier	ANDCC	$PSRPSUPER, R19, R0
279*3e12c5d1SDavid du Colombier	BE	usertrap
280*3e12c5d1SDavid du Colombier
281*3e12c5d1SDavid du Colombierkerneltrap:
282*3e12c5d1SDavid du Colombier	/*
283*3e12c5d1SDavid du Colombier	 * Interrupt or fault from kernel
284*3e12c5d1SDavid du Colombier	 */
285*3e12c5d1SDavid du Colombier	ANDN	$7, R1, R20			/* dbl aligned */
286*3e12c5d1SDavid du Colombier	MOVW	R1, (0-(4*(32+6))+(4*1))(R20)	/* save R1=SP */
287*3e12c5d1SDavid du Colombier	/* really clumsy: store these in Ureg so can be restored below */
288*3e12c5d1SDavid du Colombier	MOVW	R2, (0-(4*(32+6))+(4*2))(R20)	/* SB */
289*3e12c5d1SDavid du Colombier	MOVW	R5, (0-(4*(32+6))+(4*5))(R20)	/* USER */
290*3e12c5d1SDavid du Colombier	MOVW	R6, (0-(4*(32+6))+(4*6))(R20)	/* MACH */
291*3e12c5d1SDavid du Colombier	SUB	$(4*(32+6)), R20, R1
292*3e12c5d1SDavid du Colombier
293*3e12c5d1SDavid du Colombiertrap1:
294*3e12c5d1SDavid du Colombier	MOVW	Y, R20
295*3e12c5d1SDavid du Colombier	MOVW	R20, (4*(32+0))(R1)		/* Y */
296*3e12c5d1SDavid du Colombier	MOVW	TBR, R20
297*3e12c5d1SDavid du Colombier	MOVW	R20, (4*(32+1))(R1)		/* TBR */
298*3e12c5d1SDavid du Colombier	AND	$~0x1F, R19			/* force CWP=0 */
299*3e12c5d1SDavid du Colombier	MOVW	R19, (4*(32+2))(R1)		/* PSR */
300*3e12c5d1SDavid du Colombier	MOVW	R18, (4*(32+3))(R1)		/* nPC */
301*3e12c5d1SDavid du Colombier	MOVW	R17, (4*(32+4))(R1)		/* PC */
302*3e12c5d1SDavid du Colombier	MOVW	R0, (4*0)(R1)
303*3e12c5d1SDavid du Colombier	MOVW	R3, (4*3)(R1)
304*3e12c5d1SDavid du Colombier	MOVW	R4, (4*4)(R1)
305*3e12c5d1SDavid du Colombier	MOVW	R7, (4*7)(R1)
306*3e12c5d1SDavid du Colombier	RESTORE	R0, R0
307*3e12c5d1SDavid du Colombier	/* now our registers R8-R31 are same as before trap */
308*3e12c5d1SDavid du Colombier	/* save registers two at a time */
309*3e12c5d1SDavid du Colombier	MOVD	R8, (4*8)(R1)
310*3e12c5d1SDavid du Colombier	MOVD	R10, (4*10)(R1)
311*3e12c5d1SDavid du Colombier	MOVD	R12, (4*12)(R1)
312*3e12c5d1SDavid du Colombier	MOVD	R14, (4*14)(R1)
313*3e12c5d1SDavid du Colombier	MOVD	R16, (4*16)(R1)
314*3e12c5d1SDavid du Colombier	MOVD	R18, (4*18)(R1)
315*3e12c5d1SDavid du Colombier	MOVD	R20, (4*20)(R1)
316*3e12c5d1SDavid du Colombier	MOVD	R22, (4*22)(R1)
317*3e12c5d1SDavid du Colombier	MOVD	R24, (4*24)(R1)
318*3e12c5d1SDavid du Colombier	MOVD	R26, (4*26)(R1)
319*3e12c5d1SDavid du Colombier	MOVD	R28, (4*28)(R1)
320*3e12c5d1SDavid du Colombier	MOVD	R30, (4*30)(R1)
321*3e12c5d1SDavid du Colombier	/* SP and SB and u and m are already set; away we go */
322*3e12c5d1SDavid du Colombier	MOVW	R1, R7		/* pointer to Ureg */
323*3e12c5d1SDavid du Colombier	SUB	$8, R1
324*3e12c5d1SDavid du Colombier	MOVW	$SYSPSR, R8
325*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
326*3e12c5d1SDavid du Colombier	NOOP
327*3e12c5d1SDavid du Colombier	JMPL	trap(SB)
328*3e12c5d1SDavid du Colombier
329*3e12c5d1SDavid du Colombier	ADD	$8, R1
330*3e12c5d1SDavid du Colombierrestore:
331*3e12c5d1SDavid du Colombier	MOVW	(4*(32+2))(R1), R8		/* PSR */
332*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
333*3e12c5d1SDavid du Colombier	NOOP
334*3e12c5d1SDavid du Colombier
335*3e12c5d1SDavid du Colombier	MOVD	(4*30)(R1), R30
336*3e12c5d1SDavid du Colombier	MOVD	(4*28)(R1), R28
337*3e12c5d1SDavid du Colombier	MOVD	(4*26)(R1), R26
338*3e12c5d1SDavid du Colombier	MOVD	(4*24)(R1), R24
339*3e12c5d1SDavid du Colombier	MOVD	(4*22)(R1), R22
340*3e12c5d1SDavid du Colombier	MOVD	(4*20)(R1), R20
341*3e12c5d1SDavid du Colombier	MOVD	(4*18)(R1), R18
342*3e12c5d1SDavid du Colombier	MOVD	(4*16)(R1), R16
343*3e12c5d1SDavid du Colombier	MOVD	(4*14)(R1), R14
344*3e12c5d1SDavid du Colombier	MOVD	(4*12)(R1), R12
345*3e12c5d1SDavid du Colombier	MOVD	(4*10)(R1), R10
346*3e12c5d1SDavid du Colombier	MOVD	(4*8)(R1), R8
347*3e12c5d1SDavid du Colombier	SAVE	R0, R0
348*3e12c5d1SDavid du Colombier	MOVD	(4*6)(R1), R6
349*3e12c5d1SDavid du Colombier	MOVD	(4*4)(R1), R4
350*3e12c5d1SDavid du Colombier	MOVD	(4*2)(R1), R2
351*3e12c5d1SDavid du Colombier	MOVW	(4*(32+0))(R1), R20		/* Y */
352*3e12c5d1SDavid du Colombier	MOVW	R20, Y
353*3e12c5d1SDavid du Colombier	MOVW	(4*(32+4))(R1), R17		/* PC */
354*3e12c5d1SDavid du Colombier	MOVW	(4*(32+3))(R1), R18		/* nPC */
355*3e12c5d1SDavid du Colombier	MOVW	(4*1)(R1), R1	/* restore R1=SP */
356*3e12c5d1SDavid du Colombier	RETT	R17, R18
357*3e12c5d1SDavid du Colombier
358*3e12c5d1SDavid du Colombierusertrap:
359*3e12c5d1SDavid du Colombier	/*
360*3e12c5d1SDavid du Colombier	 * Interrupt or fault from user
361*3e12c5d1SDavid du Colombier	 */
362*3e12c5d1SDavid du Colombier	MOVW	R1, R8
363*3e12c5d1SDavid du Colombier	MOVW	R2, R9
364*3e12c5d1SDavid du Colombier	MOVW	$setSB(SB), R2
365*3e12c5d1SDavid du Colombier	MOVW	$(USERADDR+BY2PG), R1
366*3e12c5d1SDavid du Colombier	MOVW	R8, (0-(4*(32+6))+(4*1))(R1)	/* save R1=SP */
367*3e12c5d1SDavid du Colombier	MOVW	R9, (0-(4*(32+6))+(4*2))(R1)	/* save R2=SB */
368*3e12c5d1SDavid du Colombier	MOVW	R5, (0-(4*(32+6))+(4*5))(R1)	/* save R5=USER */
369*3e12c5d1SDavid du Colombier	MOVW	R6, (0-(4*(32+6))+(4*6))(R1)	/* save R6=MACH */
370*3e12c5d1SDavid du Colombier	MOVW	$USERADDR, R(USER)
371*3e12c5d1SDavid du Colombier	MOVW	$mach0(SB), R(MACH)
372*3e12c5d1SDavid du Colombier	SUB	$(4*(32+6)), R1
373*3e12c5d1SDavid du Colombier	JMP	trap1
374*3e12c5d1SDavid du Colombier
375*3e12c5d1SDavid du ColombierTEXT	syslink(SB), $-4
376*3e12c5d1SDavid du Colombier
377*3e12c5d1SDavid du Colombier	/* R8 to R23 are free to play with */
378*3e12c5d1SDavid du Colombier	/* R17 contains PC, R18 contains nPC */
379*3e12c5d1SDavid du Colombier	/* R19 has PSR loaded from vector code */
380*3e12c5d1SDavid du Colombier	/* assume user did it; syscall checks */
381*3e12c5d1SDavid du Colombier
382*3e12c5d1SDavid du Colombier	MOVW	R1, R8
383*3e12c5d1SDavid du Colombier	MOVW	R2, R9
384*3e12c5d1SDavid du Colombier	MOVW	$setSB(SB), R2
385*3e12c5d1SDavid du Colombier	MOVW	$(USERADDR+BY2PG), R1
386*3e12c5d1SDavid du Colombier	MOVW	R8, (0-(4*(32+6))+4)(R1)	/* save R1=SP */
387*3e12c5d1SDavid du Colombier	SUB	$(4*(32+6)), R1
388*3e12c5d1SDavid du Colombier	MOVW	R9, (4*2)(R1)			/* save R2=SB */
389*3e12c5d1SDavid du Colombier	MOVW	R3, (4*3)(R1)			/* global register */
390*3e12c5d1SDavid du Colombier	MOVD	R4, (4*4)(R1)			/* global register, R5=USER */
391*3e12c5d1SDavid du Colombier	MOVD	R6, (4*6)(R1)			/* save R6=MACH, R7=syscall# */
392*3e12c5d1SDavid du Colombier	MOVW	$USERADDR, R(USER)
393*3e12c5d1SDavid du Colombier	MOVW	$mach0(SB), R(MACH)
394*3e12c5d1SDavid du Colombier	MOVW	TBR, R20
395*3e12c5d1SDavid du Colombier	MOVW	R20, (4*(32+1))(R1)		/* TBR */
396*3e12c5d1SDavid du Colombier	AND	$~0x1F, R19
397*3e12c5d1SDavid du Colombier	MOVW	R19, (4*(32+2))(R1)		/* PSR */
398*3e12c5d1SDavid du Colombier	MOVW	R18, (4*(32+3))(R1)		/* nPC */
399*3e12c5d1SDavid du Colombier	MOVW	R17, (4*(32+4))(R1)		/* PC */
400*3e12c5d1SDavid du Colombier	RESTORE	R0, R0
401*3e12c5d1SDavid du Colombier	/* now our registers R8-R31 are same as before trap */
402*3e12c5d1SDavid du Colombier	MOVW	R15, (4*15)(R1)
403*3e12c5d1SDavid du Colombier	/* SP and SB and u and m are already set; away we go */
404*3e12c5d1SDavid du Colombier	MOVW	R1, R7			/* pointer to Ureg */
405*3e12c5d1SDavid du Colombier	SUB	$8, R1
406*3e12c5d1SDavid du Colombier	MOVW	$SYSPSR, R8
407*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
408*3e12c5d1SDavid du Colombier	JMPL	syscall(SB)
409*3e12c5d1SDavid du Colombier	/* R7 contains return value from syscall */
410*3e12c5d1SDavid du Colombier
411*3e12c5d1SDavid du Colombier	ADD	$8, R1
412*3e12c5d1SDavid du Colombier	MOVW	(4*(32+2))(R1), R8		/* PSR */
413*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
414*3e12c5d1SDavid du Colombier	NOOP
415*3e12c5d1SDavid du Colombier
416*3e12c5d1SDavid du Colombier	MOVW	(4*15)(R1), R15
417*3e12c5d1SDavid du Colombier	SAVE	R0, R0
418*3e12c5d1SDavid du Colombier	MOVW	(4*6)(R1), R6
419*3e12c5d1SDavid du Colombier	MOVD	(4*4)(R1), R4
420*3e12c5d1SDavid du Colombier	MOVD	(4*2)(R1), R2
421*3e12c5d1SDavid du Colombier	MOVW	(4*(32+4))(R1), R17		/* PC */
422*3e12c5d1SDavid du Colombier	MOVW	(4*(32+3))(R1), R18		/* nPC */
423*3e12c5d1SDavid du Colombier	MOVW	(4*1)(R1), R1	/* restore R1=SP */
424*3e12c5d1SDavid du Colombier	RETT	R17, R18
425*3e12c5d1SDavid du Colombier
426*3e12c5d1SDavid du ColombierTEXT	puttbr(SB), $0
427*3e12c5d1SDavid du Colombier
428*3e12c5d1SDavid du Colombier	MOVW	R7, TBR
429*3e12c5d1SDavid du Colombier	NOOP
430*3e12c5d1SDavid du Colombier	RETURN
431*3e12c5d1SDavid du Colombier
432*3e12c5d1SDavid du ColombierTEXT	gettbr(SB), $0
433*3e12c5d1SDavid du Colombier
434*3e12c5d1SDavid du Colombier	MOVW	TBR, R7
435*3e12c5d1SDavid du Colombier	RETURN
436*3e12c5d1SDavid du Colombier
437*3e12c5d1SDavid du ColombierTEXT	r1(SB), $0
438*3e12c5d1SDavid du Colombier
439*3e12c5d1SDavid du Colombier	MOVW	R1, R7
440*3e12c5d1SDavid du Colombier	RETURN
441*3e12c5d1SDavid du Colombier
442*3e12c5d1SDavid du ColombierTEXT	getwim(SB), $0
443*3e12c5d1SDavid du Colombier
444*3e12c5d1SDavid du Colombier	MOVW	WIM, R7
445*3e12c5d1SDavid du Colombier	RETURN
446*3e12c5d1SDavid du Colombier
447*3e12c5d1SDavid du ColombierTEXT	setlabel(SB), $0
448*3e12c5d1SDavid du Colombier
449*3e12c5d1SDavid du Colombier	MOVW	R1, (R7)
450*3e12c5d1SDavid du Colombier	MOVW	R15, 4(R7)
451*3e12c5d1SDavid du Colombier	MOVW	$0, R7
452*3e12c5d1SDavid du Colombier	RETURN
453*3e12c5d1SDavid du Colombier
454*3e12c5d1SDavid du ColombierTEXT	gotolabel(SB), $0
455*3e12c5d1SDavid du Colombier
456*3e12c5d1SDavid du Colombier	MOVW	(R7), R1
457*3e12c5d1SDavid du Colombier	MOVW	4(R7), R15
458*3e12c5d1SDavid du Colombier	MOVW	$1, R7
459*3e12c5d1SDavid du Colombier	RETURN
460*3e12c5d1SDavid du Colombier
461*3e12c5d1SDavid du ColombierTEXT	putcxsegm(SB), $0
462*3e12c5d1SDavid du Colombier
463*3e12c5d1SDavid du Colombier	MOVW	R7, R8			/* context */
464*3e12c5d1SDavid du Colombier	MOVW	4(FP), R9		/* segment addr */
465*3e12c5d1SDavid du Colombier	MOVW	8(FP), R10		/* segment value */
466*3e12c5d1SDavid du Colombier	MOVW	$0xFFE80118, R7
467*3e12c5d1SDavid du Colombier	JMPL	(R7)
468*3e12c5d1SDavid du Colombier	RETURN
469*3e12c5d1SDavid du Colombier
470*3e12c5d1SDavid du ColombierTEXT	getpsr(SB), $0
471*3e12c5d1SDavid du Colombier
472*3e12c5d1SDavid du Colombier	MOVW	PSR, R7
473*3e12c5d1SDavid du Colombier	RETURN
474*3e12c5d1SDavid du Colombier
475*3e12c5d1SDavid du ColombierTEXT	putcxreg(SB), $0
476*3e12c5d1SDavid du Colombier
477*3e12c5d1SDavid du Colombier	MOVW	$CONTEXT, R8
478*3e12c5d1SDavid du Colombier	MOVB	R7, (R8, 2)
479*3e12c5d1SDavid du Colombier	RETURN
480*3e12c5d1SDavid du Colombier
481*3e12c5d1SDavid du ColombierTEXT	putb2(SB), $0
482*3e12c5d1SDavid du Colombier
483*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
484*3e12c5d1SDavid du Colombier	MOVB	R8, (R7, 2)
485*3e12c5d1SDavid du Colombier	RETURN
486*3e12c5d1SDavid du Colombier
487*3e12c5d1SDavid du ColombierTEXT	getb2(SB), $0
488*3e12c5d1SDavid du Colombier
489*3e12c5d1SDavid du Colombier	MOVB	(R7, 2), R7
490*3e12c5d1SDavid du Colombier	RETURN
491*3e12c5d1SDavid du Colombier
492*3e12c5d1SDavid du ColombierTEXT	getw2(SB), $0
493*3e12c5d1SDavid du Colombier
494*3e12c5d1SDavid du Colombier	MOVW	(R7, 2), R7
495*3e12c5d1SDavid du Colombier	RETURN
496*3e12c5d1SDavid du Colombier
497*3e12c5d1SDavid du ColombierTEXT	putw2(SB), $0
498*3e12c5d1SDavid du Colombier
499*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
500*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 2)
501*3e12c5d1SDavid du Colombier	RETURN
502*3e12c5d1SDavid du Colombier
503*3e12c5d1SDavid du ColombierTEXT	putw4(SB), $0
504*3e12c5d1SDavid du Colombier
505*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
506*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 4)
507*3e12c5d1SDavid du Colombier	RETURN
508*3e12c5d1SDavid du Colombier
509*3e12c5d1SDavid du ColombierTEXT	getw4(SB), $0
510*3e12c5d1SDavid du Colombier
511*3e12c5d1SDavid du Colombier	MOVW	(R7, 4), R7
512*3e12c5d1SDavid du Colombier	RETURN
513*3e12c5d1SDavid du Colombier
514*3e12c5d1SDavid du ColombierTEXT	putwC(SB), $0
515*3e12c5d1SDavid du Colombier
516*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
517*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xC)
518*3e12c5d1SDavid du Colombier	RETURN
519*3e12c5d1SDavid du Colombier
520*3e12c5d1SDavid du ColombierTEXT	putwD(SB), $0
521*3e12c5d1SDavid du Colombier
522*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
523*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
524*3e12c5d1SDavid du Colombier	RETURN
525*3e12c5d1SDavid du Colombier
526*3e12c5d1SDavid du ColombierTEXT	putwD16(SB), $0
527*3e12c5d1SDavid du Colombier
528*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
529*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
530*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
531*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
532*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
533*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
534*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
535*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
536*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
537*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
538*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
539*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
540*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
541*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
542*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
543*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
544*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
545*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
546*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
547*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
548*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
549*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
550*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
551*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
552*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
553*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
554*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
555*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
556*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
557*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
558*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
559*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xD)
560*3e12c5d1SDavid du Colombier	RETURN
561*3e12c5d1SDavid du Colombier
562*3e12c5d1SDavid du ColombierTEXT	putwE(SB), $0
563*3e12c5d1SDavid du Colombier
564*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
565*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
566*3e12c5d1SDavid du Colombier	RETURN
567*3e12c5d1SDavid du Colombier
568*3e12c5d1SDavid du ColombierTEXT	putwE16(SB), $0
569*3e12c5d1SDavid du Colombier
570*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
571*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
572*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
573*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
574*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
575*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
576*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
577*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
578*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
579*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
580*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
581*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
582*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
583*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
584*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
585*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
586*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
587*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
588*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
589*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
590*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
591*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
592*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
593*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
594*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
595*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
596*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
597*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
598*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
599*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
600*3e12c5d1SDavid du Colombier	ADD	$(1<<4), R7
601*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 0xE)
602*3e12c5d1SDavid du Colombier	RETURN
603*3e12c5d1SDavid du Colombier
604*3e12c5d1SDavid du ColombierTEXT	putsegm(SB), $0
605*3e12c5d1SDavid du Colombier
606*3e12c5d1SDavid du Colombier	MOVW	4(FP), R8
607*3e12c5d1SDavid du Colombier	MOVW	R8, (R7, 3)
608*3e12c5d1SDavid du Colombier	RETURN
609*3e12c5d1SDavid du Colombier
610*3e12c5d1SDavid du Colombier/*
611*3e12c5d1SDavid du Colombier * in savefpregs and restfpregs, incoming R7 points to doubleword
612*3e12c5d1SDavid du Colombier * below where F0 will go; doubleword align in and backfill FSR
613*3e12c5d1SDavid du Colombier */
614*3e12c5d1SDavid du ColombierTEXT	savefpregs(SB), $0
615*3e12c5d1SDavid du Colombier
616*3e12c5d1SDavid du Colombier	ADD	$8, R7
617*3e12c5d1SDavid du Colombier	ANDN	$7, R7		/* now MOVD-aligned */
618*3e12c5d1SDavid du Colombier	MOVW	FSR, -4(R7)
619*3e12c5d1SDavid du Colombier
620*3e12c5d1SDavid du Colombier	MOVD	F0, (0*4)(R7)
621*3e12c5d1SDavid du Colombier	MOVD	F2, (2*4)(R7)
622*3e12c5d1SDavid du Colombier	MOVD	F4, (4*4)(R7)
623*3e12c5d1SDavid du Colombier	MOVD	F6, (6*4)(R7)
624*3e12c5d1SDavid du Colombier	MOVD	F8, (8*4)(R7)
625*3e12c5d1SDavid du Colombier	MOVD	F10, (10*4)(R7)
626*3e12c5d1SDavid du Colombier	MOVD	F12, (12*4)(R7)
627*3e12c5d1SDavid du Colombier	MOVD	F14, (14*4)(R7)
628*3e12c5d1SDavid du Colombier	MOVD	F16, (16*4)(R7)
629*3e12c5d1SDavid du Colombier	MOVD	F18, (18*4)(R7)
630*3e12c5d1SDavid du Colombier	MOVD	F20, (20*4)(R7)
631*3e12c5d1SDavid du Colombier	MOVD	F22, (22*4)(R7)
632*3e12c5d1SDavid du Colombier	MOVD	F24, (24*4)(R7)
633*3e12c5d1SDavid du Colombier	MOVD	F26, (26*4)(R7)
634*3e12c5d1SDavid du Colombier	MOVD	F28, (28*4)(R7)
635*3e12c5d1SDavid du Colombier	MOVD	F30, (30*4)(R7)
636*3e12c5d1SDavid du Colombier
637*3e12c5d1SDavid du Colombier	MOVW	PSR, R8
638*3e12c5d1SDavid du Colombier	ANDN	$PSREF, R8
639*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
640*3e12c5d1SDavid du Colombier	RETURN
641*3e12c5d1SDavid du Colombier
642*3e12c5d1SDavid du ColombierTEXT	restfpregs(SB), $0
643*3e12c5d1SDavid du Colombier
644*3e12c5d1SDavid du Colombier	MOVW	PSR, R8
645*3e12c5d1SDavid du Colombier	OR	$PSREF, R8
646*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
647*3e12c5d1SDavid du Colombier
648*3e12c5d1SDavid du Colombier	ADD	$8, R7
649*3e12c5d1SDavid du Colombier	ANDN	$7, R7		/* now MOVD-aligned */
650*3e12c5d1SDavid du Colombier	OR	R0, R0
651*3e12c5d1SDavid du Colombier
652*3e12c5d1SDavid du Colombier	MOVW	-4(R7), FSR
653*3e12c5d1SDavid du Colombier
654*3e12c5d1SDavid du Colombier	MOVD	(0*4)(R7), F0
655*3e12c5d1SDavid du Colombier	MOVD	(2*4)(R7), F2
656*3e12c5d1SDavid du Colombier	MOVD	(4*4)(R7), F4
657*3e12c5d1SDavid du Colombier	MOVD	(6*4)(R7), F6
658*3e12c5d1SDavid du Colombier	MOVD	(8*4)(R7), F8
659*3e12c5d1SDavid du Colombier	MOVD	(10*4)(R7), F10
660*3e12c5d1SDavid du Colombier	MOVD	(12*4)(R7), F12
661*3e12c5d1SDavid du Colombier	MOVD	(14*4)(R7), F14
662*3e12c5d1SDavid du Colombier	MOVD	(16*4)(R7), F16
663*3e12c5d1SDavid du Colombier	MOVD	(18*4)(R7), F18
664*3e12c5d1SDavid du Colombier	MOVD	(20*4)(R7), F20
665*3e12c5d1SDavid du Colombier	MOVD	(22*4)(R7), F22
666*3e12c5d1SDavid du Colombier	MOVD	(24*4)(R7), F24
667*3e12c5d1SDavid du Colombier	MOVD	(26*4)(R7), F26
668*3e12c5d1SDavid du Colombier	MOVD	(28*4)(R7), F28
669*3e12c5d1SDavid du Colombier	MOVD	(30*4)(R7), F30
670*3e12c5d1SDavid du Colombier
671*3e12c5d1SDavid du Colombier	ANDN	$PSREF, R8
672*3e12c5d1SDavid du Colombier	MOVW	R8, PSR
673*3e12c5d1SDavid du Colombier	RETURN
674*3e12c5d1SDavid du Colombier
675*3e12c5d1SDavid du ColombierTEXT	clearfpintr(SB), $0
676*3e12c5d1SDavid du Colombier
677*3e12c5d1SDavid du Colombier	MOVW	$fpq+BY2WD(SB), R7
678*3e12c5d1SDavid du Colombier	ANDN	$0x7, R7		/* must be D aligned */
679*3e12c5d1SDavid du Colombier	MOVW	$fsr+0(SB), R9
680*3e12c5d1SDavid du Colombierclrq:
681*3e12c5d1SDavid du Colombier	MOVD	FQ, (R7)
682*3e12c5d1SDavid du Colombier	MOVW	FSR, (R9)
683*3e12c5d1SDavid du Colombier	MOVW	(R9), R8
684*3e12c5d1SDavid du Colombier	AND	$(1<<13), R8		/* queue not empty? */
685*3e12c5d1SDavid du Colombier	BNE	clrq
686*3e12c5d1SDavid du Colombier	RETURN
687*3e12c5d1SDavid du Colombier
688*3e12c5d1SDavid du ColombierTEXT	getfsr(SB), $0
689*3e12c5d1SDavid du Colombier	MOVW	$fsr+0(SB), R7
690*3e12c5d1SDavid du Colombier	MOVW	FSR, (R7)
691*3e12c5d1SDavid du Colombier	MOVW	(R7), R7
692*3e12c5d1SDavid du Colombier	RETURN
693*3e12c5d1SDavid du Colombier
694*3e12c5d1SDavid du ColombierGLOBL	mach0+0(SB), $MACHSIZE
695*3e12c5d1SDavid du ColombierGLOBL	fpq+0(SB), $(3*BY2WD)
696*3e12c5d1SDavid du ColombierGLOBL	fsr+0(SB), $BY2WD
697