Commit 297b8603 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

KVM: arm64: Provide KVM's own save/restore SVE primitives



as we are about to change the way KVM deals with SVE, provide
KVM with its own save/restore SVE primitives.

No functional change intended.

Acked-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent a38fd874
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
 * Author: Catalin Marinas <catalin.marinas@arm.com>
 */

#include <asm/assembler.h>

.macro fpsimd_save state, tmpnr
	stp	q0, q1, [\state, #16 * 0]
	stp	q2, q3, [\state, #16 * 2]
+2 −0
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ void __debug_switch_to_host(struct kvm_vcpu *vcpu);

void __fpsimd_save_state(struct user_fpsimd_state *fp_regs);
void __fpsimd_restore_state(struct user_fpsimd_state *fp_regs);
void __sve_save_state(void *sve_pffr, u32 *fpsr);
void __sve_restore_state(void *sve_pffr, u32 *fpsr, unsigned int vqminus1);

#ifndef __KVM_NVHE_HYPERVISOR__
void activate_traps_vhe_load(struct kvm_vcpu *vcpu);
+10 −0
Original line number Diff line number Diff line
@@ -19,3 +19,13 @@ SYM_FUNC_START(__fpsimd_restore_state)
	fpsimd_restore	x0, 1
	ret
SYM_FUNC_END(__fpsimd_restore_state)

SYM_FUNC_START(__sve_restore_state)
	sve_load 0, x1, x2, 3, x4
	ret
SYM_FUNC_END(__sve_restore_state)

SYM_FUNC_START(__sve_save_state)
	sve_save 0, x1, 2
	ret
SYM_FUNC_END(__sve_save_state)
+5 −5
Original line number Diff line number Diff line
@@ -256,7 +256,7 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)
				vcpu->arch.host_fpsimd_state,
				struct thread_struct, uw.fpsimd_state);

			sve_save_state(sve_pffr(thread),
			__sve_save_state(sve_pffr(thread),
					 &vcpu->arch.host_fpsimd_state->fpsr);
		} else {
			__fpsimd_save_state(vcpu->arch.host_fpsimd_state);
@@ -266,7 +266,7 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)
	}

	if (sve_guest) {
		sve_load_state(vcpu_sve_pffr(vcpu),
		__sve_restore_state(vcpu_sve_pffr(vcpu),
				    &vcpu->arch.ctxt.fp_regs.fpsr,
				    sve_vq_from_vl(vcpu->arch.sve_max_vl) - 1);
		write_sysreg_s(__vcpu_sys_reg(vcpu, ZCR_EL1), SYS_ZCR_EL12);