Commit aed34b6d authored by Marc Zyngier's avatar Marc Zyngier
Browse files

KVM: arm64: Use computed FGT masks to setup FGT registers



Flip the hyervisor FGT configuration over to the computed FGT
masks.

Reviewed-by: default avatarJoey Gouly <joey.gouly@arm.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 311ba55a
Loading
Loading
Loading
Loading
+38 −7
Original line number Diff line number Diff line
@@ -65,12 +65,41 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
	}
}

#define reg_to_fgt_masks(reg)						\
	({								\
		struct fgt_masks *m;					\
		switch(reg) {						\
		case HFGRTR_EL2:					\
			m = &hfgrtr_masks;				\
			break;						\
		case HFGWTR_EL2:					\
			m = &hfgwtr_masks;				\
			break;						\
		case HFGITR_EL2:					\
			m = &hfgitr_masks;				\
			break;						\
		case HDFGRTR_EL2:					\
			m = &hdfgrtr_masks;				\
			break;						\
		case HDFGWTR_EL2:					\
			m = &hdfgwtr_masks;				\
			break;						\
		case HAFGRTR_EL2:					\
			m = &hafgrtr_masks;				\
			break;						\
		default:						\
			BUILD_BUG_ON(1);				\
		}							\
									\
		m;							\
	})

#define compute_clr_set(vcpu, reg, clr, set)				\
	do {								\
		u64 hfg;						\
		hfg = __vcpu_sys_reg(vcpu, reg) & ~__ ## reg ## _RES0;	\
		set |= hfg & __ ## reg ## _MASK; 			\
		clr |= ~hfg & __ ## reg ## _nMASK; 			\
		u64 hfg = __vcpu_sys_reg(vcpu, reg);			\
		struct fgt_masks *m = reg_to_fgt_masks(reg);		\
		set |= hfg & m->mask;					\
		clr |= ~hfg & m->nmask;					\
	} while(0)

#define reg_to_fgt_group_id(reg)					\
@@ -101,12 +130,14 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
#define compute_undef_clr_set(vcpu, kvm, reg, clr, set)			\
	do {								\
		u64 hfg = kvm->arch.fgu[reg_to_fgt_group_id(reg)];	\
		set |= hfg & __ ## reg ## _MASK;			\
		clr |= hfg & __ ## reg ## _nMASK; 			\
		struct fgt_masks *m = reg_to_fgt_masks(reg);		\
		set |= hfg & m->mask;					\
		clr |= hfg & m->nmask;					\
	} while(0)

#define update_fgt_traps_cs(hctxt, vcpu, kvm, reg, clr, set)		\
	do {								\
		struct fgt_masks *m = reg_to_fgt_masks(reg);		\
		u64 c = clr, s = set;					\
		u64 val;						\
									\
@@ -116,7 +147,7 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
									\
		compute_undef_clr_set(vcpu, kvm, reg, c, s);		\
									\
		val = __ ## reg ## _nMASK;				\
		val = m->nmask;						\
		val |= s;						\
		val &= ~c;						\
		write_sysreg_s(val, SYS_ ## reg);			\