On Fri, Mar 06, 2026 at 05:01:11PM +0000, Mark Brown wrote: > Provide versions of the SME state save and restore functions for the > hypervisor to allow it to restore ZA and ZT for guests. > > Signed-off-by: Mark Brown <[email protected]> > --- > arch/arm64/include/asm/kvm_hyp.h | 2 ++ > arch/arm64/kvm/hyp/fpsimd.S | 23 +++++++++++++++++++++++ > 2 files changed, 25 insertions(+)
While this specific instance is simple enough, I don't think we should continue to duplicate the low level save/restore routines between the main kernel and KVM hyp code. I've sent a series that avoids the need for this, and cleans up some other bits): https://lore.kernel.org/linux-arm-kernel/[email protected]/ Assuming Marc and Oliver are on board, I'd prefer that we do that cleanup first, and build the KVM SME support atop. Mark. > > diff --git a/arch/arm64/include/asm/kvm_hyp.h > b/arch/arm64/include/asm/kvm_hyp.h > index 0317790dd3b7..9b1354d1122c 100644 > --- a/arch/arm64/include/asm/kvm_hyp.h > +++ b/arch/arm64/include/asm/kvm_hyp.h > @@ -116,6 +116,8 @@ void __fpsimd_save_state(struct user_fpsimd_state > *fp_regs); > void __fpsimd_restore_state(struct user_fpsimd_state *fp_regs); > void __sve_save_state(void *sve_pffr, u32 *fpsr, int save_ffr); > void __sve_restore_state(void *sve_pffr, u32 *fpsr, int restore_ffr); > +void __sme_save_state(void const *state, bool save_zt); > +void __sme_restore_state(void const *state, bool restore_zt); > > u64 __guest_enter(struct kvm_vcpu *vcpu); > > diff --git a/arch/arm64/kvm/hyp/fpsimd.S b/arch/arm64/kvm/hyp/fpsimd.S > index 6e16cbfc5df2..18b7a666016c 100644 > --- a/arch/arm64/kvm/hyp/fpsimd.S > +++ b/arch/arm64/kvm/hyp/fpsimd.S > @@ -29,3 +29,26 @@ SYM_FUNC_START(__sve_save_state) > sve_save 0, x1, x2, 3 > ret > SYM_FUNC_END(__sve_save_state) > + > +SYM_FUNC_START(__sme_save_state) > + // Caller needs to ensure SMCR updates are visible > + _sme_rdsvl 2, 1 // x2 = VL/8 > + sme_save_za 0, x2, 12 // Leaves x0 pointing to the end of ZA > + > + cbz x1, 1f > + _str_zt 0 > +1: > + ret > +SYM_FUNC_END(__sme_save_state) > + > +SYM_FUNC_START(__sme_restore_state) > + // Caller needs to ensure SMCR updates are visible > + _sme_rdsvl 2, 1 // x2 = VL/8 > + sme_load_za 0, x2, 12 // Leaves x0 pointing to end of ZA > + > + cbz x1, 1f > + _ldr_zt 0 > + > +1: > + ret > +SYM_FUNC_END(__sme_restore_state) > > -- > 2.47.3 >

