Re: [PATCH v12 00/29] KVM: arm64: Implement support for SME

From: Fuad Tabba

Date: Fri Jul 10 2026 - 04:50:45 EST


Hi Mark,

[snip]

>
> Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>

Gave this a spin on top of v7.2-rc2, applied cleanly and built fine.

Booted a host+guest with the host in VHE and in nVHE mode, and booted
both a normal guest and a protected guest under pKVM. All came up
cleanly. Note that a protected guest doesn't get SME, but it boots
fine without it.

Ran set_id_regs against a guest in all three host configurations (VHE,
nVHE, and protected/pKVM); all passed, with the new SME ID-register
checks actually executing rather than skipping, since QEMU's max CPU
exposes SME2.

Also ran get-reg-list, since patch 28 adds the SME registers to the
expected reg list, so it's the regression guard confirming the
guest-visible register set matches what the series intends to expose.
It passed too.

Will start reviewing soon. For now:
Tested-by: Fuad Tabba <fuad.tabba@xxxxxxxxx>

Cheers,
/fuad


> ---
> Changes in v12:
> - Resend with commit rather than tag object specified as the base.
> - Link to v11: https://patch.msgid.link/20260709-kvm-arm64-sme-v11-0-32799f66db9d@xxxxxxxxxx
>
> 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/20260306-kvm-arm64-sme-v10-0-43f7683a0fb7@xxxxxxxxxx
>
> 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/20251223-kvm-arm64-sme-v9-0-8be3867cb883@xxxxxxxxxx
>
> 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/20250902-kvm-arm64-sme-v8-0-2cb2199c656c@xxxxxxxxxx
>
> Changes in v8:
> - Small fixes in ABI documentation.
> - Link to v7: https://lore.kernel.org/r/20250822-kvm-arm64-sme-v7-0-7a65d82b8b10@xxxxxxxxxx
>
> 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/20250625-kvm-arm64-sme-v6-0-114cff4ffe04@xxxxxxxxxx
>
> Changes in v6:
> - Rebase onto v6.16-rc3.
> - Link to v5: https://lore.kernel.org/r/20250417-kvm-arm64-sme-v5-0-f469a2d5f574@xxxxxxxxxx
>
> Changes in v5:
> - Rebase onto v6.15-rc2.
> - Add pKVM guest support.
> - Always restore SVCR.
> - Link to v4: https://lore.kernel.org/r/20250214-kvm-arm64-sme-v4-0-d64a681adcc2@xxxxxxxxxx
>
> 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/20241220-kvm-arm64-sme-v3-0-05b018c1ffeb@xxxxxxxxxx
>
> Changes in v3:
> - Rebase onto v6.12-rc2.
> - Link to v2: https://lore.kernel.org/r/20231222-kvm-arm64-sme-v2-0-da226cb180bb@xxxxxxxxxx
>
> 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 <broonie@xxxxxxxxxx>
>