On Fri, Mar 06, 2026 at 05:00:55PM +0000, Mark Brown wrote: > Some parts of the SME state are optional, enabled by additional features > on top of the base FEAT_SME and controlled with enable bits in SMCR_ELx. We > unconditionally enable these for the host but for KVM we will allow the > feature set exposed to guests to be restricted by the VMM. These are the > FFR register (FEAT_SME_FA64) and ZT0 (FEAT_SME2). > > We defer saving of guest floating point state for non-protected guests to > the host kernel. We also want to avoid having to reconfigure the guest > floating point state if nothing used the floating point state while running > the host. If the guest was running with the optional features disabled then > traps will be enabled for them so the host kernel will need to skip > accessing that state when saving state for the guest. > > Support this by moving the decision about saving this state to the point > where we bind floating point state to the CPU, adding a new variable to > the cpu_fp_state which uses the enable bits in SMCR_ELx to flag which > features are enabled. > > Reviewed-by: Fuad Tabba <[email protected]> > Signed-off-by: Mark Brown <[email protected]> > --- > arch/arm64/include/asm/fpsimd.h | 1 + > arch/arm64/kernel/fpsimd.c | 10 ++++++++-- > arch/arm64/kvm/fpsimd.c | 1 + > 3 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h > index 7361b3b4a5f5..e97729aa3b2f 100644 > --- a/arch/arm64/include/asm/fpsimd.h > +++ b/arch/arm64/include/asm/fpsimd.h > @@ -87,6 +87,7 @@ struct cpu_fp_state { > void *sme_state; > u64 *svcr; > u64 *fpmr; > + u64 sme_features; > unsigned int sve_vl; > unsigned int sme_vl;
It would be simpler to store the full SMCR value, and remove the 'sme_vl' field. Likewise for ZCR and the 'sve_vl` field. If nothing else, it would make the format of these fields more obvious, and easier to reason about. It would also potentially allow us to extend the VL sanity-check in fpsimd_save_user_state() to check all the relevant control bits prior to saving state. [...] > @@ -1632,6 +1632,12 @@ static void fpsimd_bind_task_to_cpu(void) > last->to_save = FP_STATE_CURRENT; > current->thread.fpsimd_cpu = smp_processor_id(); > > + last->sme_features = 0; > + if (system_supports_fa64()) > + last->sme_features |= SMCR_ELx_FA64; > + if (system_supports_sme2()) > + last->sme_features |= SMCR_ELx_EZT0; With my proposal on patch 2, this conditional logic would be centralised within a helper function. Mark.

