xref: /plan9/sys/src/9/teg2/notes/bug.rfe (revision 3de6a9c0b3d5cf34fc4090d0bf1930d83799a7fd)
1*3de6a9c0SDavid du Colombier/*
2*3de6a9c0SDavid du Colombier * return from user-mode exception.
3*3de6a9c0SDavid du Colombier * expects new SPSR in R0.  R13 must point to ureg->type.
4*3de6a9c0SDavid du Colombier */
5*3de6a9c0SDavid du Colombier_rfue:
6*3de6a9c0SDavid du ColombierTEXT rfue(SB), 1, $-4
7*3de6a9c0SDavid du Colombier//	CPSID
8*3de6a9c0SDavid du Colombier//	BIC	$PsrMbz, R0		/* force little-endian upon return */
9*3de6a9c0SDavid du Colombier	MOVW	R0, SPSR		/* ... */
10*3de6a9c0SDavid du Colombier
11*3de6a9c0SDavid du Colombier	/*
12*3de6a9c0SDavid du Colombier	 * order on stack is type, psr, pc, but RFEV7 needs pc, psr.
13*3de6a9c0SDavid du Colombier	 * step on type and previous word to hold temporary values.
14*3de6a9c0SDavid du Colombier	 * we could instead change the order in which psr & pc are pushed.
15*3de6a9c0SDavid du Colombier	 */
16*3de6a9c0SDavid du Colombier	MOVW	4(R13), R1		/* psr */
17*3de6a9c0SDavid du Colombier	MOVW	8(R13), R2		/* pc */
18*3de6a9c0SDavid du Colombier	MOVW	R2, 4(R13)		/* pc */
19*3de6a9c0SDavid du Colombier	MOVW	R1, 8(R13)		/* psr */
20*3de6a9c0SDavid du Colombier
21*3de6a9c0SDavid du Colombier	MOVM.DB.S (R13), [R0-R14]	/* restore user registers */
22*3de6a9c0SDavid du Colombier	ADD	$4, R13			/* pop type, sp -> pc */
23*3de6a9c0SDavid du Colombier
24*3de6a9c0SDavid du Colombier#ifdef OLDWAY
25*3de6a9c0SDavid du Colombier	ADD	$(2*4), R13		/* pop past ureg->{type+psr} to pc */
26*3de6a9c0SDavid du Colombier	/*
27*3de6a9c0SDavid du Colombier	 * this used to work on arm arch v[567] and still works on cpu 0.
28*3de6a9c0SDavid du Colombier	 * for some reason it sometimes sets PsrBigend on cpu 1.
29*3de6a9c0SDavid du Colombier	 * Ureg's tail was:
30*3de6a9c0SDavid du Colombier	 *
31*3de6a9c0SDavid du Colombier	 * typedef struct Ureg {
32*3de6a9c0SDavid du Colombier	 * 	⋯
33*3de6a9c0SDavid du Colombier	 * 	ulong	type;	/* of exception */
34*3de6a9c0SDavid du Colombier	 * 	ulong	psr;
35*3de6a9c0SDavid du Colombier	 * 	ulong	pc;	/* interrupted addr */
36*3de6a9c0SDavid du Colombier	 * } Ureg;
37*3de6a9c0SDavid du Colombier	 */
38*3de6a9c0SDavid du Colombier	RFE				/* MOVM.IA.S.W (R13), [R15] */
39*3de6a9c0SDavid du Colombier#endif
40*3de6a9c0SDavid du Colombier//	SETEND(0)
41*3de6a9c0SDavid du Colombier	RFEV7W(13)
42