Skip to content

Commit 08d7153

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Fix FEAT_SPE_FnE to use PMSIDR_EL1.FnE, not PMSVer
FEAT_SPE_FnE is architecturally detected via PMSIDR_EL1.FnE [6], not ID_AA64DFR0_EL1.PMSVer. The FEAT_X macro form (register, field, value) cannot encode a PMSIDR_EL1-based feature, so FEAT_SPE_FnE was defined identically to FEAT_SPEv1p2 (ID_AA64DFR0_EL1, PMSVer, V1P2), producing a duplicate that used PMSVer >= V1P2 as a proxy. Replace the macro with feat_spe_fne(), following the same pattern as the sibling feat_spe_fds(): guard on FEAT_SPEv1p2 and read PMSIDR_EL1.FnE [6] directly. Wire the two NEEDS_FEAT consumers to use the new function. Remove the now-unused FEAT_SPE_FnE macro. Fixes: 63d423a ("KVM: arm64: Switch to table-driven FGU configuration") Signed-off-by: Fuad Tabba <tabba@google.com> Link: https://patch.msgid.link/20260424084908.370776-4-tabba@google.com Signed-off-by: Marc Zyngier <maz@kernel.org> Cc: stable@vger.kernel.org
1 parent 2a62340 commit 08d7153

1 file changed

Lines changed: 12 additions & 3 deletions

File tree

arch/arm64/kvm/config.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ struct reg_feat_map_desc {
131131
}
132132

133133
#define FEAT_SPE ID_AA64DFR0_EL1, PMSVer, IMP
134-
#define FEAT_SPE_FnE ID_AA64DFR0_EL1, PMSVer, V1P2
135134
#define FEAT_BRBE ID_AA64DFR0_EL1, BRBE, IMP
136135
#define FEAT_TRC_SR ID_AA64DFR0_EL1, TraceVer, IMP
137136
#define FEAT_PMUv3 ID_AA64DFR0_EL1, PMUVer, IMP
@@ -302,6 +301,16 @@ static bool feat_spe_fds(struct kvm *kvm)
302301
(read_sysreg_s(SYS_PMSIDR_EL1) & PMSIDR_EL1_FDS));
303302
}
304303

304+
static bool feat_spe_fne(struct kvm *kvm)
305+
{
306+
/*
307+
* Revisit this if KVM ever supports SPE -- this really should
308+
* look at the guest's view of PMSIDR_EL1.
309+
*/
310+
return (kvm_has_feat(kvm, FEAT_SPEv1p2) &&
311+
(read_sysreg_s(SYS_PMSIDR_EL1) & PMSIDR_EL1_FnE));
312+
}
313+
305314
static bool feat_trbe_mpam(struct kvm *kvm)
306315
{
307316
/*
@@ -537,7 +546,7 @@ static const struct reg_bits_to_feat_map hdfgrtr_feat_map[] = {
537546
HDFGRTR_EL2_PMBPTR_EL1 |
538547
HDFGRTR_EL2_PMBLIMITR_EL1,
539548
FEAT_SPE),
540-
NEEDS_FEAT(HDFGRTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
549+
NEEDS_FEAT(HDFGRTR_EL2_nPMSNEVFR_EL1, feat_spe_fne),
541550
NEEDS_FEAT(HDFGRTR_EL2_nBRBDATA |
542551
HDFGRTR_EL2_nBRBCTL |
543552
HDFGRTR_EL2_nBRBIDR,
@@ -605,7 +614,7 @@ static const struct reg_bits_to_feat_map hdfgwtr_feat_map[] = {
605614
HDFGWTR_EL2_PMBPTR_EL1 |
606615
HDFGWTR_EL2_PMBLIMITR_EL1,
607616
FEAT_SPE),
608-
NEEDS_FEAT(HDFGWTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
617+
NEEDS_FEAT(HDFGWTR_EL2_nPMSNEVFR_EL1, feat_spe_fne),
609618
NEEDS_FEAT(HDFGWTR_EL2_nBRBDATA |
610619
HDFGWTR_EL2_nBRBCTL,
611620
FEAT_BRBE),

0 commit comments

Comments
 (0)