mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Merge pull request #1273 from lubinszARM:pr_ring_3
PiperOrigin-RevId: 288743614
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user