Skip to content

Commit cb52b5c

Browse files
committed
Revert "KVM: arm64: nv: Fix RESx behaviour of disabled FGTs with negative polarity"
This reverts commit eb9d53d. As Marc pointed out on the list [*], this patch is wrong, and those who find themselves in the SOB chain should have their heads checked. Annoyingly, the architecture has some FGT trap bits that are negative (i.e. 0 implies trap), and there was some confusion how KVM handles this for nested guests. However, it is clear now that KVM honors the RES0-ness of FGT traps already, meaning traps for features never exposed to the guest hypervisor get handled at L0. As they should. Link: https://lore.kernel.org/kvmarm/[email protected]/T/#mb9abb3dd79f6a4544a91cb35676bd637c3a5e836 Signed-off-by: Oliver Upton <[email protected]>
1 parent 3dc14ee commit cb52b5c

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-
res1 |= HFGxTR_EL2_nACCDATA_EL1;
331+
res0 |= HFGxTR_EL2_nACCDATA_EL1;
332332
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, GCS, IMP))
333-
res1 |= (HFGxTR_EL2_nGCS_EL0 | HFGxTR_EL2_nGCS_EL1);
333+
res0 |= (HFGxTR_EL2_nGCS_EL0 | HFGxTR_EL2_nGCS_EL1);
334334
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, SME, IMP))
335-
res1 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0);
335+
res0 |= (HFGxTR_EL2_nSMPRI_EL1 | HFGxTR_EL2_nTPIDR2_EL0);
336336
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, THE, IMP))
337-
res1 |= HFGxTR_EL2_nRCWMASK_EL1;
337+
res0 |= HFGxTR_EL2_nRCWMASK_EL1;
338338
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1PIE, IMP))
339-
res1 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1);
339+
res0 |= (HFGxTR_EL2_nPIRE0_EL1 | HFGxTR_EL2_nPIR_EL1);
340340
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S1POE, IMP))
341-
res1 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1);
341+
res0 |= (HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nPOR_EL1);
342342
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, S2POE, IMP))
343-
res1 |= HFGxTR_EL2_nS2POR_EL1;
343+
res0 |= HFGxTR_EL2_nS2POR_EL1;
344344
if (!kvm_has_feat(kvm, ID_AA64MMFR3_EL1, AIE, IMP))
345-
res1 |= (HFGxTR_EL2_nMAIR2_EL1 | HFGxTR_EL2_nAMAIR2_EL1);
345+
res0 |= (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-
res1 |= (HDFGRTR_EL2_nBRBIDR | HDFGRTR_EL2_nBRBCTL |
381+
res0 |= (HDFGRTR_EL2_nBRBIDR | HDFGRTR_EL2_nBRBCTL |
382382
HDFGRTR_EL2_nBRBDATA);
383383
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, V1P2))
384-
res1 |= HDFGRTR_EL2_nPMSNEVFR_EL1;
384+
res0 |= 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-
res1 |= (HFGITR_EL2_nBRBINJ | HFGITR_EL2_nBRBIALL);
420+
res0 |= (HFGITR_EL2_nBRBINJ | HFGITR_EL2_nBRBIALL);
421421
if (!kvm_has_feat(kvm, ID_AA64PFR1_EL1, GCS, IMP))
422-
res1 |= (HFGITR_EL2_nGCSPUSHM_EL1 | HFGITR_EL2_nGCSSTR_EL1 |
422+
res0 |= (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)