]> www.infradead.org Git - nvme.git/commitdiff
KVM: arm64: nv: Load guest hyp's ZCR into EL1 state
authorOliver Upton <oliver.upton@linux.dev>
Thu, 20 Jun 2024 16:46:41 +0000 (16:46 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 20 Jun 2024 19:02:40 +0000 (19:02 +0000)
Load the guest hypervisor's ZCR_EL2 into the corresponding EL1 register
when restoring SVE state, as ZCR_EL2 affects the VL in the hypervisor
context.

Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20240620164653.1130714-5-oliver.upton@linux.dev
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/hyp/include/hyp/switch.h

index 0ff1ed1341fc11473cbd10fcef3856f72c98740f..9118716d05fc4218d5f231eee2e1cf1f03f08de1 100644 (file)
@@ -868,6 +868,9 @@ struct kvm_vcpu_arch {
 
 #define vcpu_sve_max_vq(vcpu)  sve_vq_from_vl((vcpu)->arch.sve_max_vl)
 
+#define vcpu_sve_zcr_elx(vcpu)                                         \
+       (unlikely(is_hyp_ctxt(vcpu)) ? ZCR_EL2 : ZCR_EL1)
+
 #define vcpu_sve_state_size(vcpu) ({                                   \
        size_t __size_ret;                                              \
        unsigned int __vcpu_vq;                                         \
index be1b22b9c324627d7d1bb51f977c1b7689b4ab8e..16809e74c7f982323549902b90311880fa47bfbb 100644 (file)
@@ -318,7 +318,8 @@ static inline void __hyp_sve_restore_guest(struct kvm_vcpu *vcpu)
        __sve_restore_state(vcpu_sve_pffr(vcpu),
                            &vcpu->arch.ctxt.fp_regs.fpsr,
                            true);
-       write_sysreg_el1(__vcpu_sys_reg(vcpu, ZCR_EL1), SYS_ZCR);
+
+       write_sysreg_el1(__vcpu_sys_reg(vcpu, vcpu_sve_zcr_elx(vcpu)), SYS_ZCR);
 }
 
 static inline void __hyp_sve_save_host(void)