Commit ea266c72 authored by Mark Rutland's avatar Mark Rutland Committed by Marc Zyngier
Browse files

KVM: arm64: Unconditionally configure fine-grain traps



... otherwise we can inherit the host configuration if this differs from
the KVM configuration.

Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
[maz: simplified a couple of things]
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 7ed43d84
Loading
Loading
Loading
Loading
+15 −24
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)

#define update_fgt_traps_cs(hctxt, vcpu, kvm, reg, clr, set)		\
	do {								\
		u64 c = 0, s = 0;					\
		u64 c = clr, s = set;					\
		u64 val;						\
									\
		ctxt_sys_reg(hctxt, reg) = read_sysreg_s(SYS_ ## reg);	\
		if (vcpu_has_nv(vcpu) && !is_hyp_ctxt(vcpu))		\
@@ -115,14 +116,10 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
									\
		compute_undef_clr_set(vcpu, kvm, reg, c, s);		\
									\
		s |= set;						\
		c |= clr;						\
		if (c || s) {						\
			u64 val = __ ## reg ## _nMASK;			\
		val = __ ## reg ## _nMASK;				\
		val |= s;						\
		val &= ~c;						\
		write_sysreg_s(val, SYS_ ## reg);			\
		}							\
	} while(0)

#define update_fgt_traps(hctxt, vcpu, kvm, reg)		\
@@ -175,10 +172,8 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
		update_fgt_traps(hctxt, vcpu, kvm, HAFGRTR_EL2);
}

#define __deactivate_fgt(htcxt, vcpu, kvm, reg)				\
#define __deactivate_fgt(htcxt, vcpu, reg)				\
	do {								\
		if ((vcpu_has_nv(vcpu) && !is_hyp_ctxt(vcpu)) ||	\
		    kvm->arch.fgu[reg_to_fgt_group_id(reg)])		\
		write_sysreg_s(ctxt_sys_reg(hctxt, reg),		\
			       SYS_ ## reg);				\
	} while(0)
@@ -186,22 +181,18 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
{
	struct kvm_cpu_context *hctxt = host_data_ptr(host_ctxt);
	struct kvm *kvm = kern_hyp_va(vcpu->kvm);

	if (!cpus_have_final_cap(ARM64_HAS_FGT))
		return;

	__deactivate_fgt(hctxt, vcpu, kvm, HFGRTR_EL2);
	if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38))
		write_sysreg_s(ctxt_sys_reg(hctxt, HFGWTR_EL2), SYS_HFGWTR_EL2);
	else
		__deactivate_fgt(hctxt, vcpu, kvm, HFGWTR_EL2);
	__deactivate_fgt(hctxt, vcpu, kvm, HFGITR_EL2);
	__deactivate_fgt(hctxt, vcpu, kvm, HDFGRTR_EL2);
	__deactivate_fgt(hctxt, vcpu, kvm, HDFGWTR_EL2);
	__deactivate_fgt(hctxt, vcpu, HFGRTR_EL2);
	__deactivate_fgt(hctxt, vcpu, HFGWTR_EL2);
	__deactivate_fgt(hctxt, vcpu, HFGITR_EL2);
	__deactivate_fgt(hctxt, vcpu, HDFGRTR_EL2);
	__deactivate_fgt(hctxt, vcpu, HDFGWTR_EL2);

	if (cpu_has_amu())
		__deactivate_fgt(hctxt, vcpu, kvm, HAFGRTR_EL2);
		__deactivate_fgt(hctxt, vcpu, HAFGRTR_EL2);
}

static inline void  __activate_traps_mpam(struct kvm_vcpu *vcpu)