38 lines
872 B
ArmAsm
38 lines
872 B
ArmAsm
#include "arm.s"
|
|
|
|
/*
|
|
* This is the first jump from kernel to user mode.
|
|
* Fake a return from interrupt.
|
|
*
|
|
* Enter with R0 containing the user stack pointer.
|
|
* UTZERO + 0x20 is always the entry point.
|
|
*
|
|
*/
|
|
TEXT touser(SB), 1, $-4
|
|
/* store the user stack pointer into the USR_r13 */
|
|
MOVM.DB.W [R0], (R13)
|
|
/* avoid the ambiguity described in notes/movm.w. */
|
|
MOVM.S (R13), [R13]
|
|
ADD $4, R13 /* pop new user SP */
|
|
|
|
/* set up a PSR for user level */
|
|
MOVW $(PsrMusr), R0
|
|
MOVW R0, SPSR
|
|
|
|
/* push new user PSR */
|
|
MOVM.DB.W [R0], (R13)
|
|
|
|
/* push the new user PC on the stack */
|
|
MOVW $(UTZERO+0x20), R0
|
|
MOVM.DB.W [R0], (R13)
|
|
|
|
RFEV7W(13)
|
|
|
|
/*
|
|
* here to jump to a newly forked process
|
|
*/
|
|
TEXT forkret(SB), 1, $-4
|
|
ADD $(4*NREGS), R13 /* make r13 point to ureg->type */
|
|
MOVW 8(R13), R14 /* restore link */
|
|
MOVW 4(R13), R0 /* restore SPSR */
|
|
B rfue(SB)
|