Merge pull request #1273 from lubinszARM:pr_ring_3

PiperOrigin-RevId: 288743614
This commit is contained in:
gVisor bot
2020-01-08 11:48:34 -08:00
+67
View File
@@ -357,6 +357,73 @@ TEXT ·Current(SB),NOSPLIT,$0-8
#define STACK_FRAME_SIZE 16
TEXT ·kernelExitToEl0(SB),NOSPLIT,$0
// Step1, save sentry context into memory.
REGISTERS_SAVE(RSV_REG, CPU_REGISTERS)
MOVD RSV_REG_APP, CPU_REGISTERS+PTRACE_R9(RSV_REG)
WORD $0xd5384003 // MRS SPSR_EL1, R3
MOVD R3, CPU_REGISTERS+PTRACE_PSTATE(RSV_REG)
MOVD R30, CPU_REGISTERS+PTRACE_PC(RSV_REG)
MOVD RSP, R3
MOVD R3, CPU_REGISTERS+PTRACE_SP(RSV_REG)
MOVD CPU_REGISTERS+PTRACE_R3(RSV_REG), R3
// Step2, save SP_EL1, PSTATE into kernel temporary stack.
// switch to temporary stack.
LOAD_KERNEL_STACK(RSV_REG)
WORD $0xd538d092 //MRS TPIDR_EL1, R18
SUB $STACK_FRAME_SIZE, RSP, RSP
MOVD CPU_REGISTERS+PTRACE_SP(RSV_REG), R11
MOVD CPU_REGISTERS+PTRACE_PSTATE(RSV_REG), R12
STP (R11, R12), 16*0(RSP)
MOVD CPU_REGISTERS+PTRACE_R11(RSV_REG), R11
MOVD CPU_REGISTERS+PTRACE_R12(RSV_REG), R12
// Step3, test user pagetable.
// If user pagetable is empty, trapped in el1_ia.
WORD $0xd538d092 //MRS TPIDR_EL1, R18
SWITCH_TO_APP_PAGETABLE(RSV_REG)
WORD $0xd538d092 //MRS TPIDR_EL1, R18
SWITCH_TO_KVM_PAGETABLE(RSV_REG)
WORD $0xd538d092 //MRS TPIDR_EL1, R18
// If pagetable is not empty, recovery kernel temporary stack.
ADD $STACK_FRAME_SIZE, RSP, RSP
// Step4, load app context pointer.
MOVD CPU_APP_ADDR(RSV_REG), RSV_REG_APP
// Step5, prepare the environment for container application.
// set sp_el0.
MOVD PTRACE_SP(RSV_REG_APP), R1
WORD $0xd5184101 //MSR R1, SP_EL0
// set pc.
MOVD PTRACE_PC(RSV_REG_APP), R1
MSR R1, ELR_EL1
// set pstate.
MOVD PTRACE_PSTATE(RSV_REG_APP), R1
WORD $0xd5184001 //MSR R1, SPSR_EL1
// RSV_REG & RSV_REG_APP will be loaded at the end.
REGISTERS_LOAD(RSV_REG_APP, 0)
// switch to user pagetable.
MOVD PTRACE_R18(RSV_REG_APP), RSV_REG
MOVD PTRACE_R9(RSV_REG_APP), RSV_REG_APP
SUB $STACK_FRAME_SIZE, RSP, RSP
STP (RSV_REG, RSV_REG_APP), 16*0(RSP)
WORD $0xd538d092 //MRS TPIDR_EL1, R18
SWITCH_TO_APP_PAGETABLE(RSV_REG)
LDP 16*0(RSP), (RSV_REG, RSV_REG_APP)
ADD $STACK_FRAME_SIZE, RSP, RSP
ERET()
TEXT ·kernelExitToEl1(SB),NOSPLIT,$0