Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+31
+31
arch/arm/kvm/hyp/entry.S
··· 66 66 bx lr 67 67 ENDPROC(__guest_exit) 68 68 69 + /* 70 + * If VFPv3 support is not available, then we will not switch the VFP 71 + * registers; however cp10 and cp11 accesses will still trap and fallback 72 + * to the regular coprocessor emulation code, which currently will 73 + * inject an undefined exception to the guest. 74 + */ 75 + #ifdef CONFIG_VFPv3 76 + ENTRY(__vfp_guest_restore) 77 + push {r3, r4, lr} 78 + 79 + @ NEON/VFP used. Turn on VFP access. 80 + mrc p15, 4, r1, c1, c1, 2 @ HCPTR 81 + bic r1, r1, #(HCPTR_TCP(10) | HCPTR_TCP(11)) 82 + mcr p15, 4, r1, c1, c1, 2 @ HCPTR 83 + isb 84 + 85 + @ Switch VFP/NEON hardware state to the guest's 86 + mov r4, r0 87 + ldr r0, [r0, #VCPU_HOST_CTXT] 88 + add r0, r0, #CPU_CTXT_VFP 89 + bl __vfp_save_state 90 + add r0, r4, #(VCPU_GUEST_CTXT + CPU_CTXT_VFP) 91 + bl __vfp_restore_state 92 + 93 + pop {r3, r4, lr} 94 + pop {r0, r1, r2} 95 + clrex 96 + eret 97 + ENDPROC(__vfp_guest_restore) 98 + #endif 99 + 69 100 .popsection 70 101