Hi Mark,
On Thu, 9 Jul 2026 at 19:40, Mark Brown <[email protected]> wrote: > > [ Note: I've spoken with both Mark Rutland and James Morse both of whom > might potentially have some overlapping changes, they've both agreed > that they'll deal with any rebasing if it's a question of this getting > in or something else. ] > > I've removed the RFC tag from this version of the series, but the items > that I'm looking for feedback on remains the same: > > - The userspace ABI, in particular: > - The vector length used for the SVE registers, access to the SVE > registers and access to ZA and (if available) ZT0 depending on > the current state of PSTATE.{SM,ZA}. > - The use of a single finalisation for both SVE and SME. > - There was some review from the qemu people who seemed OK with the > structure, and there's some initial patches from them at: > > https://patchew.org/QEMU/[email protected]/ The state-dependent Z/P view and SVCR.ZA gating make sense to me, and lossless: the inaccessible state is only reachable via an SM/ZA transition, which zeroes the affected registers. Single finalisation via KVM_ARM_VCPU_VEC makes sense too: splitting it would leave the SVE registers writable while their VL could still move. Unrelated: on the get-reg-list restructuring you mention deferring to a separate series: since ZA, ZT0 and SME_VLS are the migration-critical SME state, it'd be good if that series also covered a save/restore round-trip for them, not just get-reg-list enumeration. Cheers, /fuad > This series implements support for SME use in non-protected KVM guests. > Much of this is very similar to SVE, the main additional challenge that > SME presents is that it introduces a new vector length similar to the > SVE vector length and two new controls which change the registers seen > by guests: > > - PSTATE.ZA enables the ZA matrix register and, if SME2 is supported, > the ZT0 LUT register. > - PSTATE.SM enables streaming mode, a new floating point mode which > uses the SVE register set with the separately configured SME vector > length. In streaming mode implementation of the FFR register is > optional. > > It is also permitted to build systems which support SME without SVE, in > this case when not in streaming mode no SVE registers or instructions > are available. Further, there is no requirement that there be any > overlap in the set of vector lengths supported by SVE and SME in a > system, this is expected to be a common situation in practical systems. > > Since there is a new vector length to configure we introduce a new > feature parallel to the existing SVE one with a new pseudo register for > the streaming mode vector length. Due to the overlap with SVE caused by > streaming mode rather than finalising SME as a separate feature we use > the existing SVE finalisation to also finalise SME, a new define > KVM_ARM_VCPU_VEC is provided to help make user code clearer. Finalising > SVE and SME separately would introduce complication with register access > since finalising SVE makes the SVE registers writeable by userspace and > doing multiple finalisations results in an error being reported. > Dealing with a state where the SVE registers are writeable due to one of > SVE or SME being finalised but may have their VL changed by the other > being finalised seems like needless complexity with minimal practical > utility, it seems clearer to just express directly that only one > finalisation can be done in the ABI. > > Access to the floating point registers follows the architecture: > > - When both SVE and SME are present: > - If PSTATE.SM == 0 the vector length used for the Z and P registers > is the SVE vector length. > - If PSTATE.SM == 1 the vector length used for the Z and P registers > is the SME vector length. > - If only SME is present: > - If PSTATE.SM == 0 the Z and P registers are inaccessible and the > floating point state accessed via the encodings for the V registers. > - If PSTATE.SM == 1 the vector length used for the Z and P registers > - The SME specific ZA and ZT0 registers are only accessible if SVCR.ZA is 1. > > The VMM must understand this, in particular when loading state SVCR > should be configured before other state. It should be noted that while > the architecture refers to PSTATE.SM and PSTATE.ZA these PSTATE bits are > not preserved in SPSR_ELx, they are only accessible via SVCR. > > There are a large number of subfeatures for SME, most of which only > offer additional instructions but some of which (SME2 and FA64) add > architectural state. These are configured via the ID registers as per > usual. > > Protected KVM is supported, with the implementation maintaining the > existing restriction that the hypervisor will refuse to run if streaming > mode or ZA is enabled. This both simplfies the code and avoids the need > to allocate storage for host ZA and ZT0 state, there seems to be little > practical use case for supporting this and the memory usage would be > non-trivial. SME is not made available to protected guests, only normal > guests. > > The new KVM_ARM_VCPU_VEC feature and ZA and ZT0 registers have not been > added to the get-reg-list selftest, the idea of supporting additional > features there without restructuring the program to generate all > possible feature combinations has been rejected. I will post a separate > series which does that restructuring. > > Signed-off-by: Mark Brown <[email protected]> > --- > Changes in v12: > - Resend with commit rather than tag object specified as the base. > - Link to v11: > https://patch.msgid.link/[email protected] > > Changes in v11: > - Rebase onto v7.2-rc2. > - Rework VL enumeration. > - Refactor ZCR and SMCR value generation for the host into helper > functions. > - Add handling of FEAT_IDST for hidden system registers. > - Ensure we manage traps correctly for emulated EL2. > - Always allocate space for ZT0 if the hardware supports it. > - Tighten the register enumeration ABI to reflect current VM state. > - Sanitise SMIDR_EL1. > - Fix generation of invalid values in set_id_regs. > - Various smaller fixups, including from Jean-Phillipe's review. > - Link to v10: > https://patch.msgid.link/[email protected] > > Changes in v10: > - Define and use a SME_VQ_INVALID for the case where there is no > virtuablisable SME VL. > - Fix handling of SMCR_EL2 accesses. > - Correct VNCR constant for SMPRI_EL2. > - Correct trapping for SMPRI_EL1. > - Reject userspace access to FFR when in streaming mode without FA64. > - Constrain the VL set by sme_cond_update_smcr() to fit within LEN. > - Reject userspace access to ZA and ZT0 when SVCR.SM is 0. > - Use -EACCESS for inaccessible SME registers. > - Remove some unused functions. > - Further bugfixes from review. > - Commit log typo fixes. > > - Link to v9: > https://patch.msgid.link/[email protected] > > Changes in v9: > - Rebase onto v6.19-rc1. > - ABI document clarifications. > - Add changes dropping asserts on single bit wide bitfields in set_id_regs. > - Link to v8: > https://lore.kernel.org/r/[email protected] > > Changes in v8: > - Small fixes in ABI documentation. > - Link to v7: > https://lore.kernel.org/r/[email protected] > > Changes in v7: > - Rebase onto v6.17-rc1. > - Handle SMIDR_EL1 as a VM wide ID register and use this in feat_sme_smps(). > - Expose affinity fields in SMIDR_EL1. > - Remove SMPRI_EL1 from vcpu_sysreg, the value is always 0 currently. > - Prevent userspace writes to SMPRIMAP_EL2. > - Link to v6: > https://lore.kernel.org/r/[email protected] > > Changes in v6: > - Rebase onto v6.16-rc3. > - Link to v5: > https://lore.kernel.org/r/[email protected] > > Changes in v5: > - Rebase onto v6.15-rc2. > - Add pKVM guest support. > - Always restore SVCR. > - Link to v4: > https://lore.kernel.org/r/[email protected] > > Changes in v4: > - Rebase onto v6.14-rc2 and Mark Rutland's fixes. > - Expose SME to nested guests. > - Additional cleanups and test fixes following on from the rebase. > - Flush register state on VMM PSTATE.{SM,ZA}. > - Link to v3: > https://lore.kernel.org/r/[email protected] > > Changes in v3: > - Rebase onto v6.12-rc2. > - Link to v2: > https://lore.kernel.org/r/[email protected] > > Changes in v2: > - Rebase onto v6.7-rc3. > - Configure subfeatures based on host system only. > - Complete nVHE support. > - There was some snafu with sending v1 out, it didn't make it to the > lists but in case it hit people's inboxes I'm sending as v2. > > --- > Mark Brown (29): > arm64/sysreg: Define full value read/modify/write helpers > arm64/fpsimd: Update FA64 and ZT0 enables when loading SME state > arm64/fpsimd: Decide to save ZT0 and streaming mode FFR at bind time > arm64/sve: Factor virtualizable VL discovery out of SVE specific code > arm64/fpsimd: Determine maximum virtualisable SME vector length > KVM: arm64: Handle FEAT_IDST for guest accesses to hidden registers > KVM: arm64: Pull ctxt_has_ helpers to start of sysreg-sr.h > KVM: arm64: Rename SVE finalization constants to be more general > KVM: arm64: Define internal features for SME > KVM: arm64: Rename sve_state_reg_region > KVM: arm64: Store vector lengths in an array > KVM: arm64: Factor SVE code out of fpsimd_lazy_switch_to_host() > KVM: arm64: Document the KVM ABI for SME > KVM: arm64: Implement SME vector length configuration > KVM: arm64: Support SME control registers > KVM: arm64: Support TPIDR2_EL0 > KVM: arm64: Support SME identification registers for guests > KVM: arm64: Support SME priority registers > KVM: arm64: Support userspace access to streaming mode Z and P registers > KVM: arm64: Flush register state on writes to SVCR.SM and SVCR.ZA > KVM: arm64: Expose SME specific state to userspace > KVM: arm64: Context switch SME state for guests > KVM: arm64: Handle SME exceptions > KVM: arm64: Expose SME to nested guests > KVM: arm64: Provide interface for configuring and enabling SME for > guests > KVM: arm64: selftests: Remove spurious check for single bit safe values > KVM: arm64: selftests: Skip impossible invalid value tests > KVM: arm64: selftests: Add SME system registers to get-reg-list > KVM: arm64: selftests: Add SME to set_id_regs test > > Documentation/virt/kvm/api.rst | 124 +++++--- > arch/arm64/include/asm/fpsimd.h | 17 +- > arch/arm64/include/asm/kvm_emulate.h | 16 + > arch/arm64/include/asm/kvm_host.h | 113 ++++++- > arch/arm64/include/asm/kvm_hyp.h | 2 +- > arch/arm64/include/asm/kvm_nested.h | 2 + > arch/arm64/include/asm/kvm_pkvm.h | 2 +- > arch/arm64/include/asm/sysreg.h | 8 + > arch/arm64/include/asm/vncr_mapping.h | 2 + > arch/arm64/include/uapi/asm/kvm.h | 34 +++ > arch/arm64/kernel/cpufeature.c | 2 - > arch/arm64/kernel/fpsimd.c | 134 ++++---- > arch/arm64/kvm/arm.c | 10 + > arch/arm64/kvm/config.c | 12 +- > arch/arm64/kvm/emulate-nested.c | 6 +- > arch/arm64/kvm/fpsimd.c | 27 +- > arch/arm64/kvm/guest.c | 369 > ++++++++++++++++++++--- > arch/arm64/kvm/handle_exit.c | 14 + > arch/arm64/kvm/hyp/include/hyp/switch.h | 234 +++++++++++--- > arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 96 +++--- > arch/arm64/kvm/hyp/nvhe/hyp-main.c | 129 ++++++-- > arch/arm64/kvm/hyp/nvhe/pkvm.c | 90 ++++-- > arch/arm64/kvm/hyp/nvhe/switch.c | 2 + > arch/arm64/kvm/hyp/nvhe/sys_regs.c | 6 + > arch/arm64/kvm/hyp/vhe/switch.c | 17 +- > arch/arm64/kvm/hyp/vhe/sysreg-sr.c | 7 + > arch/arm64/kvm/inject_fault.c | 15 + > arch/arm64/kvm/nested.c | 8 +- > arch/arm64/kvm/reset.c | 159 +++++++--- > arch/arm64/kvm/sys_regs.c | 152 +++++++++- > include/uapi/linux/kvm.h | 1 + > tools/testing/selftests/kvm/arm64/get-reg-list.c | 15 +- > tools/testing/selftests/kvm/arm64/set_id_regs.c | 96 +++++- > 33 files changed, 1554 insertions(+), 367 deletions(-) > --- > base-commit: 8cdeaa50eae8dad34885515f62559ee83e7e8dda > change-id: 20230301-kvm-arm64-sme-06a1246d3636 > > Best regards, > -- > Mark Brown <[email protected]> >

