mirror of https://gitee.com/openkylin/linux.git
arm64: kvm: Move lr save/restore from do_el2_call into EL1
Today the 'hvc' calling KVM or the hyp-stub is expected to preserve all registers. KVM saves/restores the registers it needs on the EL2 stack using do_el2_call(). The hyp-stub has no stack, later patches need to be able to be able to clobber the link register. Move the link register save/restore to the the call sites. Signed-off-by: James Morse <james.morse@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
e7227d0e52
commit
00a44cdaba
|
@ -101,10 +101,16 @@ ENDPROC(\label)
|
|||
*/
|
||||
|
||||
ENTRY(__hyp_get_vectors)
|
||||
str lr, [sp, #-16]!
|
||||
mov x0, xzr
|
||||
// fall through
|
||||
ENTRY(__hyp_set_vectors)
|
||||
hvc #0
|
||||
ldr lr, [sp], #16
|
||||
ret
|
||||
ENDPROC(__hyp_get_vectors)
|
||||
|
||||
ENTRY(__hyp_set_vectors)
|
||||
str lr, [sp, #-16]!
|
||||
hvc #0
|
||||
ldr lr, [sp], #16
|
||||
ret
|
||||
ENDPROC(__hyp_set_vectors)
|
||||
|
|
|
@ -38,13 +38,18 @@
|
|||
* A function pointer with a value of 0 has a special meaning, and is
|
||||
* used to implement __hyp_get_vectors in the same way as in
|
||||
* arch/arm64/kernel/hyp_stub.S.
|
||||
* HVC behaves as a 'bl' call and will clobber lr.
|
||||
*/
|
||||
ENTRY(__kvm_call_hyp)
|
||||
alternative_if_not ARM64_HAS_VIRT_HOST_EXTN
|
||||
alternative_if_not ARM64_HAS_VIRT_HOST_EXTN
|
||||
str lr, [sp, #-16]!
|
||||
hvc #0
|
||||
ldr lr, [sp], #16
|
||||
ret
|
||||
alternative_else
|
||||
b __vhe_hyp_call
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
alternative_endif
|
||||
ENDPROC(__kvm_call_hyp)
|
||||
|
|
|
@ -42,19 +42,17 @@
|
|||
* Shuffle the parameters before calling the function
|
||||
* pointed to in x0. Assumes parameters in x[1,2,3].
|
||||
*/
|
||||
sub sp, sp, #16
|
||||
str lr, [sp]
|
||||
mov lr, x0
|
||||
mov x0, x1
|
||||
mov x1, x2
|
||||
mov x2, x3
|
||||
blr lr
|
||||
ldr lr, [sp]
|
||||
add sp, sp, #16
|
||||
.endm
|
||||
|
||||
ENTRY(__vhe_hyp_call)
|
||||
str lr, [sp, #-16]!
|
||||
do_el2_call
|
||||
ldr lr, [sp], #16
|
||||
/*
|
||||
* We used to rely on having an exception return to get
|
||||
* an implicit isb. In the E2H case, we don't have it anymore.
|
||||
|
|
Loading…
Reference in New Issue