On Fri, Mar 06, 2026 at 05:01:04PM +0000, Mark Brown wrote:
> Since the function will grow as a result of adding SME support move the
> SVE code out of fpsimd_lazy_switch_to_host(). No functional change, just
> code motion.
> 
> Signed-off-by: Mark Brown <[email protected]>

Reviewed-by: Jean-Philippe Brucker <[email protected]>

>  arch/arm64/kvm/hyp/include/hyp/switch.h | 46 
> +++++++++++++++++++--------------
>  1 file changed, 26 insertions(+), 20 deletions(-)
> 
> diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h 
> b/arch/arm64/kvm/hyp/include/hyp/switch.h
> index 4e38610be19a..5b99aa479c59 100644
> --- a/arch/arm64/kvm/hyp/include/hyp/switch.h
> +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h
> @@ -483,11 +483,11 @@ static inline void fpsimd_lazy_switch_to_guest(struct 
> kvm_vcpu *vcpu)
>       }
>  }
>  
> -static inline void fpsimd_lazy_switch_to_host(struct kvm_vcpu *vcpu)
> +static inline void sve_lazy_switch_to_host(struct kvm_vcpu *vcpu)
>  {
>       u64 zcr_el1, zcr_el2;
>  
> -     if (!guest_owns_fp_regs())
> +     if (!vcpu_has_sve(vcpu))
>               return;
>  
>       /*
> @@ -498,29 +498,35 @@ static inline void fpsimd_lazy_switch_to_host(struct 
> kvm_vcpu *vcpu)
>        * synchronization event, we don't need an ISB here to avoid taking
>        * traps for anything that was exposed to the guest.
>        */
> -     if (vcpu_has_sve(vcpu)) {
> -             zcr_el1 = read_sysreg_el1(SYS_ZCR);
> -             __vcpu_assign_sys_reg(vcpu, vcpu_sve_zcr_elx(vcpu), zcr_el1);
> +     zcr_el1 = read_sysreg_el1(SYS_ZCR);
> +     __vcpu_assign_sys_reg(vcpu, vcpu_sve_zcr_elx(vcpu), zcr_el1);
>  
> -             /*
> -              * The guest's state is always saved using the guest's max VL.
> -              * Ensure that the host has the guest's max VL active such that
> -              * the host can save the guest's state lazily, but don't
> -              * artificially restrict the host to the guest's max VL.
> -              */
> -             if (has_vhe()) {
> -                     zcr_el2 = vcpu_sve_max_vq(vcpu) - 1;
> -                     write_sysreg_el2(zcr_el2, SYS_ZCR);
> -             } else {
> -                     zcr_el2 = 
> sve_vq_from_vl(kvm_host_max_vl[ARM64_VEC_SVE]) - 1;
> -                     write_sysreg_el2(zcr_el2, SYS_ZCR);
> +     /*
> +      * The guest's state is always saved using the guest's max VL.
> +      * Ensure that the host has the guest's max VL active such
> +      * that the host can save the guest's state lazily, but don't
> +      * artificially restrict the host to the guest's max VL.
> +      */
> +     if (has_vhe()) {
> +             zcr_el2 = vcpu_sve_max_vq(vcpu) - 1;
> +             write_sysreg_el2(zcr_el2, SYS_ZCR);
> +     } else {
> +             zcr_el2 = sve_vq_from_vl(kvm_host_max_vl[ARM64_VEC_SVE]) - 1;
> +             write_sysreg_el2(zcr_el2, SYS_ZCR);
>  
> -                     zcr_el1 = vcpu_sve_max_vq(vcpu) - 1;
> -                     write_sysreg_el1(zcr_el1, SYS_ZCR);
> -             }
> +             zcr_el1 = vcpu_sve_max_vq(vcpu) - 1;
> +             write_sysreg_el1(zcr_el1, SYS_ZCR);
>       }
>  }
>  
> +static inline void fpsimd_lazy_switch_to_host(struct kvm_vcpu *vcpu)
> +{
> +     if (!guest_owns_fp_regs())
> +             return;
> +
> +     sve_lazy_switch_to_host(vcpu);
> +}
> +
>  static void kvm_hyp_save_fpsimd_host(struct kvm_vcpu *vcpu)
>  {
>       /*
> 
> -- 
> 2.47.3
> 
> 

Reply via email to