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