ARM: KVM: Add VFP lazy save/restore handler
Similar to the arm64 version, add the code that deals with VFP traps, re-enabling VFP, save/restoring the registers and resuming the guest. Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
Родитель
89ef2b21ed
Коммит
96e5e670cc
|
@ -66,5 +66,36 @@ ENTRY(__guest_exit)
|
|||
bx lr
|
||||
ENDPROC(__guest_exit)
|
||||
|
||||
/*
|
||||
* If VFPv3 support is not available, then we will not switch the VFP
|
||||
* registers; however cp10 and cp11 accesses will still trap and fallback
|
||||
* to the regular coprocessor emulation code, which currently will
|
||||
* inject an undefined exception to the guest.
|
||||
*/
|
||||
#ifdef CONFIG_VFPv3
|
||||
ENTRY(__vfp_guest_restore)
|
||||
push {r3, r4, lr}
|
||||
|
||||
@ NEON/VFP used. Turn on VFP access.
|
||||
mrc p15, 4, r1, c1, c1, 2 @ HCPTR
|
||||
bic r1, r1, #(HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
mcr p15, 4, r1, c1, c1, 2 @ HCPTR
|
||||
isb
|
||||
|
||||
@ Switch VFP/NEON hardware state to the guest's
|
||||
mov r4, r0
|
||||
ldr r0, [r0, #VCPU_HOST_CTXT]
|
||||
add r0, r0, #CPU_CTXT_VFP
|
||||
bl __vfp_save_state
|
||||
add r0, r4, #(VCPU_GUEST_CTXT + CPU_CTXT_VFP)
|
||||
bl __vfp_restore_state
|
||||
|
||||
pop {r3, r4, lr}
|
||||
pop {r0, r1, r2}
|
||||
clrex
|
||||
eret
|
||||
ENDPROC(__vfp_guest_restore)
|
||||
#endif
|
||||
|
||||
.popsection
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче