On Thu, Mar 18, 2021 at 12:25:30PM +0000, Marc Zyngier wrote: > ZCR_EL2 controls the upper bound for ZCR_EL1, and is set to > a potentially lower limit when the guest uses SVE. In order > to restore the SVE state on the EL1 host, we must first > reset ZCR_EL2 to its original value. > > To make it as lazy as possible on the EL1 host side, set > the SVE trapping in place when returning exiting from "returning exiting"? > diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c > index f3d0e9eca56c..60adc7ff4caa 100644 > --- a/arch/arm64/kvm/hyp/nvhe/switch.c > +++ b/arch/arm64/kvm/hyp/nvhe/switch.c > @@ -68,7 +68,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu) > static void __deactivate_traps(struct kvm_vcpu *vcpu) > { > extern char __kvm_hyp_host_vector[]; > - u64 mdcr_el2; > + u64 mdcr_el2, cptr; > > ___deactivate_traps(vcpu); > > @@ -101,7 +101,12 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu) > write_sysreg(HCR_HOST_NVHE_PROTECTED_FLAGS, hcr_el2); > else > write_sysreg(HCR_HOST_NVHE_FLAGS, hcr_el2); > - write_sysreg(CPTR_EL2_DEFAULT, cptr_el2); > + > + cptr = CPTR_EL2_DEFAULT; > + if (vcpu_has_sve(vcpu) && (vcpu->arch.flags & KVM_ARM64_FP_ENABLED)) > + cptr |= CPTR_EL2_TZ; Acked-by: Will Deacon <will@xxxxxxxxxx> Will