Skip to content

Commit eb9d53d

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: nv: Fix RESx behaviour of disabled FGTs with negative polarity
The Fine Grained Trap extension is pretty messy as it doesn't consistently use the same polarity for all trap bits. A bunch of them, added later in the life of the architecture, have a *negative* priority. So if these bits are disabled, they must be RES1 and not RES0. But that's not what the code implements, making the traps for these negative trap bits being always on instead of disabled. Fix the relevant bits, and stick a brown paper bag on my head for the rest of the day... Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 0b5afe0 commit eb9d53d

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

arch/arm64/kvm/nested.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -328,21 +328,21 @@ int kvm_init_nv_sysregs(struct kvm *kvm)
328328
HFGxTR_EL2_ERXPFGF_EL1 | HFGxTR_EL2_ERXPFGCTL_EL1 |
329329
HFGxTR_EL2_ERXPFGCDN_EL1 | HFGxTR_EL2_ERXADDR_EL1);
330330
if (!kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_ACCDATA))
331-
res0 |= HFGxTR_EL2_nACCDATA_EL1;
331+
res1 |= HFGxTR_EL2_nACCDATA_EL1;
332332
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, GCS, IMP))
333-
res0 |= (HFGxTR_EL2_nGCS_EL0 | HFGxTR_EL2_nGCS_EL1);
333+
res1 |= (HFGxTR_EL2_nGCS_EL0 | HFGxTR_EL2_nGCS_EL1);
334334
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, SME, IMP))
335-
res0 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0);
335+
res1 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0);
336336
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, THE, IMP))
337-
res0 |= HFGxTR_EL2_nRCWMASK_EL1;
337+
res1 |= HFGxTR_EL2_nRCWMASK_EL1;
338338
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
339-
res0 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1);
339+
res1 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1);
340340
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP))
341-
res0 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1);
341+
res1 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1);
342342
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S2POE, IMP))
343-
res0 |= HFGxTR_EL2_nS2POR_EL1;
343+
res1 |= HFGxTR_EL2_nS2POR_EL1;
344344
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, AIE, IMP))
345-
res0 |= (HFGxTR_EL2_nMAIR2_EL1 | HFGxTR_EL2_nAMAIR2_EL1);
345+
res1 |= (HFGxTR_EL2_nMAIR2_EL1 | HFGxTR_EL2_nAMAIR2_EL1);
346346
set_sysreg_masks(kvm, HFGRTR_EL2, res0 | __HFGRTR_EL2_RES0, res1);
347347
set_sysreg_masks(kvm, HFGWTR_EL2, res0 | __HFGWTR_EL2_RES0, res1);
348348

@@ -378,10 +378,10 @@ int kvm_init_nv_sysregs(struct kvm *kvm)
378378
HDFGRTR_EL2_TRBPTR_EL1 | HDFGRTR_EL2_TRBSR_EL1 |
379379
HDFGRTR_EL2_TRBTRG_EL1);
380380
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, BRBE, IMP))
381-
res0 |= (HDFGRTR_EL2_nBRBIDR | HDFGRTR_EL2_nBRBCTL |
381+
res1 |= (HDFGRTR_EL2_nBRBIDR | HDFGRTR_EL2_nBRBCTL |
382382
HDFGRTR_EL2_nBRBDATA);
383383
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, V1P2))
384-
res0 |= HDFGRTR_EL2_nPMSNEVFR_EL1;
384+
res1 |= HDFGRTR_EL2_nPMSNEVFR_EL1;
385385
set_sysreg_masks(kvm, HDFGRTR_EL2, res0 | HDFGRTR_EL2_RES0, res1);
386386

387387
/* Reuse the bits from the read-side and add the write-specific stuff */
@@ -417,9 +417,9 @@ int kvm_init_nv_sysregs(struct kvm *kvm)
417417
res0 |= (HFGITR_EL2_CFPRCTX | HFGITR_EL2_DVPRCTX |
418418
HFGITR_EL2_CPPRCTX);
419419
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, BRBE, IMP))
420-
res0 |= (HFGITR_EL2_nBRBINJ | HFGITR_EL2_nBRBIALL);
420+
res1 |= (HFGITR_EL2_nBRBINJ | HFGITR_EL2_nBRBIALL);
421421
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, GCS, IMP))
422-
res0 |= (HFGITR_EL2_nGCSPUSHM_EL1 | HFGITR_EL2_nGCSSTR_EL1 |
422+
res1 |= (HFGITR_EL2_nGCSPUSHM_EL1 | HFGITR_EL2_nGCSSTR_EL1 |
423423
HFGITR_EL2_nGCSEPP);
424424
if (!kvm_has_feat(kvm, ID_AA64ISAR1_EL1, SPECRES, COSP_RCTX))
425425
res0 |= HFGITR_EL2_COSPRCTX;

0 commit comments

Comments
 (0)