Prepare the vcpu environment for a container application

Mainly 2 jobs were finished in this patch:
    1, context switching for a container application:
        a, R0-R30 b, pc\pstate\sp_el0 c, pagetable_el0 for container application
       This job can help us to pass the following test cases:
       "TestApplicationSyscall", "TestApplicationFault"
    2, checking pagetable_el0 is empty
       This job can help us to pass the following test case: "TestInvalidate"

Signed-off-by: Bin Lu <bin.lu@arm.com>
This commit is contained in:
Bin Lu
2019-11-26 15:53:30 +08:00
parent b72e1b3c08
commit e710f65401
+67
View File
@@ -337,6 +337,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