Skip to content

Commit 4bc0fe0

Browse files
author
Marc Zyngier
committed
KVM: arm64: Add sanitisation for FEAT_FGT2 registers
Just like the FEAT_FGT registers, treat the FGT2 variant the same way. THis is a large update, but a fairly mechanical one. The config dependencies are extracted from the 2025-03 JSON drop. Reviewed-by: Joey Gouly <joey.gouly@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent df56f1c commit 4bc0fe0

File tree

7 files changed

+260
-0
lines changed

7 files changed

+260
-0
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ enum fgt_group_id {
279279
HDFGWTR_GROUP = HDFGRTR_GROUP,
280280
HFGITR_GROUP,
281281
HAFGRTR_GROUP,
282+
HFGRTR2_GROUP,
283+
HFGWTR2_GROUP = HFGRTR2_GROUP,
284+
HDFGRTR2_GROUP,
285+
HDFGWTR2_GROUP = HDFGRTR2_GROUP,
286+
HFGITR2_GROUP,
282287

283288
/* Must be last */
284289
__NR_FGT_GROUP_IDS__
@@ -625,13 +630,23 @@ extern struct fgt_masks hfgitr_masks;
625630
extern struct fgt_masks hdfgrtr_masks;
626631
extern struct fgt_masks hdfgwtr_masks;
627632
extern struct fgt_masks hafgrtr_masks;
633+
extern struct fgt_masks hfgrtr2_masks;
634+
extern struct fgt_masks hfgwtr2_masks;
635+
extern struct fgt_masks hfgitr2_masks;
636+
extern struct fgt_masks hdfgrtr2_masks;
637+
extern struct fgt_masks hdfgwtr2_masks;
628638

629639
extern struct fgt_masks kvm_nvhe_sym(hfgrtr_masks);
630640
extern struct fgt_masks kvm_nvhe_sym(hfgwtr_masks);
631641
extern struct fgt_masks kvm_nvhe_sym(hfgitr_masks);
632642
extern struct fgt_masks kvm_nvhe_sym(hdfgrtr_masks);
633643
extern struct fgt_masks kvm_nvhe_sym(hdfgwtr_masks);
634644
extern struct fgt_masks kvm_nvhe_sym(hafgrtr_masks);
645+
extern struct fgt_masks kvm_nvhe_sym(hfgrtr2_masks);
646+
extern struct fgt_masks kvm_nvhe_sym(hfgwtr2_masks);
647+
extern struct fgt_masks kvm_nvhe_sym(hfgitr2_masks);
648+
extern struct fgt_masks kvm_nvhe_sym(hdfgrtr2_masks);
649+
extern struct fgt_masks kvm_nvhe_sym(hdfgwtr2_masks);
635650

636651
struct kvm_cpu_context {
637652
struct user_pt_regs regs; /* sp = sp_el0 */

arch/arm64/kvm/arm.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2457,6 +2457,11 @@ static void kvm_hyp_init_symbols(void)
24572457
kvm_nvhe_sym(hdfgrtr_masks) = hdfgrtr_masks;
24582458
kvm_nvhe_sym(hdfgwtr_masks) = hdfgwtr_masks;
24592459
kvm_nvhe_sym(hafgrtr_masks) = hafgrtr_masks;
2460+
kvm_nvhe_sym(hfgrtr2_masks) = hfgrtr2_masks;
2461+
kvm_nvhe_sym(hfgwtr2_masks) = hfgwtr2_masks;
2462+
kvm_nvhe_sym(hfgitr2_masks) = hfgitr2_masks;
2463+
kvm_nvhe_sym(hdfgrtr2_masks)= hdfgrtr2_masks;
2464+
kvm_nvhe_sym(hdfgwtr2_masks)= hdfgwtr2_masks;
24602465

24612466
/*
24622467
* Flush entire BSS since part of its data containing init symbols is read

arch/arm64/kvm/config.c

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ struct reg_bits_to_feat_map {
6666
#define FEAT_BRBE ID_AA64DFR0_EL1, BRBE, IMP
6767
#define FEAT_TRC_SR ID_AA64DFR0_EL1, TraceVer, IMP
6868
#define FEAT_PMUv3 ID_AA64DFR0_EL1, PMUVer, IMP
69+
#define FEAT_PMUv3p9 ID_AA64DFR0_EL1, PMUVer, V3P9
6970
#define FEAT_TRBE ID_AA64DFR0_EL1, TraceBuffer, IMP
71+
#define FEAT_TRBEv1p1 ID_AA64DFR0_EL1, TraceBuffer, TRBE_V1P1
7072
#define FEAT_DoubleLock ID_AA64DFR0_EL1, DoubleLock, IMP
7173
#define FEAT_TRF ID_AA64DFR0_EL1, TraceFilt, IMP
7274
#define FEAT_AA32EL0 ID_AA64PFR0_EL1, EL0, AARCH32
@@ -84,8 +86,10 @@ struct reg_bits_to_feat_map {
8486
#define FEAT_LS64_V ID_AA64ISAR1_EL1, LS64, LS64_V
8587
#define FEAT_LS64_ACCDATA ID_AA64ISAR1_EL1, LS64, LS64_ACCDATA
8688
#define FEAT_RAS ID_AA64PFR0_EL1, RAS, IMP
89+
#define FEAT_RASv2 ID_AA64PFR0_EL1, RAS, V2
8790
#define FEAT_GICv3 ID_AA64PFR0_EL1, GIC, IMP
8891
#define FEAT_LOR ID_AA64MMFR1_EL1, LO, IMP
92+
#define FEAT_SPEv1p4 ID_AA64DFR0_EL1, PMSVer, V1P4
8993
#define FEAT_SPEv1p5 ID_AA64DFR0_EL1, PMSVer, V1P5
9094
#define FEAT_ATS1A ID_AA64ISAR2_EL1, ATS1A, IMP
9195
#define FEAT_SPECRES2 ID_AA64ISAR1_EL1, SPECRES, COSP_RCTX
@@ -110,10 +114,23 @@ struct reg_bits_to_feat_map {
110114
#define FEAT_EVT_TTLBxS ID_AA64MMFR2_EL1, EVT, TTLBxS
111115
#define FEAT_MTE2 ID_AA64PFR1_EL1, MTE, MTE2
112116
#define FEAT_RME ID_AA64PFR0_EL1, RME, IMP
117+
#define FEAT_MPAM ID_AA64PFR0_EL1, MPAM, 1
113118
#define FEAT_S2FWB ID_AA64MMFR2_EL1, FWB, IMP
114119
#define FEAT_TME ID_AA64ISAR0_EL1, TME, IMP
115120
#define FEAT_TWED ID_AA64MMFR1_EL1, TWED, IMP
116121
#define FEAT_E2H0 ID_AA64MMFR4_EL1, E2H0, IMP
122+
#define FEAT_SRMASK ID_AA64MMFR4_EL1, SRMASK, IMP
123+
#define FEAT_PoPS ID_AA64MMFR4_EL1, PoPS, IMP
124+
#define FEAT_PFAR ID_AA64PFR1_EL1, PFAR, IMP
125+
#define FEAT_Debugv8p9 ID_AA64DFR0_EL1, PMUVer, V3P9
126+
#define FEAT_PMUv3_SS ID_AA64DFR0_EL1, PMSS, IMP
127+
#define FEAT_SEBEP ID_AA64DFR0_EL1, SEBEP, IMP
128+
#define FEAT_EBEP ID_AA64DFR1_EL1, EBEP, IMP
129+
#define FEAT_ITE ID_AA64DFR1_EL1, ITE, IMP
130+
#define FEAT_PMUv3_ICNTR ID_AA64DFR1_EL1, PMICNTR, IMP
131+
#define FEAT_SPMU ID_AA64DFR1_EL1, SPMU, IMP
132+
#define FEAT_SPE_nVM ID_AA64DFR2_EL1, SPE_nVM, IMP
133+
#define FEAT_STEP2 ID_AA64DFR2_EL1, STEP, IMP
117134

118135
static bool not_feat_aa64el3(struct kvm *kvm)
119136
{
@@ -180,6 +197,32 @@ static bool feat_sme_smps(struct kvm *kvm)
180197
(read_sysreg_s(SYS_SMIDR_EL1) & SMIDR_EL1_SMPS));
181198
}
182199

200+
static bool feat_spe_fds(struct kvm *kvm)
201+
{
202+
/*
203+
* Revists this if KVM ever supports SPE -- this really should
204+
* look at the guest's view of PMSIDR_EL1.
205+
*/
206+
return (kvm_has_feat(kvm, FEAT_SPEv1p4) &&
207+
(read_sysreg_s(SYS_PMSIDR_EL1) & PMSIDR_EL1_FDS));
208+
}
209+
210+
static bool feat_trbe_mpam(struct kvm *kvm)
211+
{
212+
/*
213+
* Revists this if KVM ever supports both MPAM and TRBE --
214+
* this really should look at the guest's view of TRBIDR_EL1.
215+
*/
216+
return (kvm_has_feat(kvm, FEAT_TRBE) &&
217+
kvm_has_feat(kvm, FEAT_MPAM) &&
218+
(read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_MPAM));
219+
}
220+
221+
static bool feat_ebep_pmuv3_ss(struct kvm *kvm)
222+
{
223+
return kvm_has_feat(kvm, FEAT_EBEP) || kvm_has_feat(kvm, FEAT_PMUv3_SS);
224+
}
225+
183226
static bool compute_hcr_rw(struct kvm *kvm, u64 *bits)
184227
{
185228
/* This is purely academic: AArch32 and NV are mutually exclusive */
@@ -589,6 +632,106 @@ static const struct reg_bits_to_feat_map hafgrtr_feat_map[] = {
589632
FEAT_AMUv1),
590633
};
591634

635+
static const struct reg_bits_to_feat_map hfgitr2_feat_map[] = {
636+
NEEDS_FEAT(HFGITR2_EL2_nDCCIVAPS, FEAT_PoPS),
637+
NEEDS_FEAT(HFGITR2_EL2_TSBCSYNC, FEAT_TRBEv1p1)
638+
};
639+
640+
static const struct reg_bits_to_feat_map hfgrtr2_feat_map[] = {
641+
NEEDS_FEAT(HFGRTR2_EL2_nPFAR_EL1, FEAT_PFAR),
642+
NEEDS_FEAT(HFGRTR2_EL2_nERXGSR_EL1, FEAT_RASv2),
643+
NEEDS_FEAT(HFGRTR2_EL2_nACTLRALIAS_EL1 |
644+
HFGRTR2_EL2_nACTLRMASK_EL1 |
645+
HFGRTR2_EL2_nCPACRALIAS_EL1 |
646+
HFGRTR2_EL2_nCPACRMASK_EL1 |
647+
HFGRTR2_EL2_nSCTLR2MASK_EL1 |
648+
HFGRTR2_EL2_nSCTLRALIAS2_EL1 |
649+
HFGRTR2_EL2_nSCTLRALIAS_EL1 |
650+
HFGRTR2_EL2_nSCTLRMASK_EL1 |
651+
HFGRTR2_EL2_nTCR2ALIAS_EL1 |
652+
HFGRTR2_EL2_nTCR2MASK_EL1 |
653+
HFGRTR2_EL2_nTCRALIAS_EL1 |
654+
HFGRTR2_EL2_nTCRMASK_EL1,
655+
FEAT_SRMASK),
656+
NEEDS_FEAT(HFGRTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
657+
};
658+
659+
static const struct reg_bits_to_feat_map hfgwtr2_feat_map[] = {
660+
NEEDS_FEAT(HFGWTR2_EL2_nPFAR_EL1, FEAT_PFAR),
661+
NEEDS_FEAT(HFGWTR2_EL2_nACTLRALIAS_EL1 |
662+
HFGWTR2_EL2_nACTLRMASK_EL1 |
663+
HFGWTR2_EL2_nCPACRALIAS_EL1 |
664+
HFGWTR2_EL2_nCPACRMASK_EL1 |
665+
HFGWTR2_EL2_nSCTLR2MASK_EL1 |
666+
HFGWTR2_EL2_nSCTLRALIAS2_EL1 |
667+
HFGWTR2_EL2_nSCTLRALIAS_EL1 |
668+
HFGWTR2_EL2_nSCTLRMASK_EL1 |
669+
HFGWTR2_EL2_nTCR2ALIAS_EL1 |
670+
HFGWTR2_EL2_nTCR2MASK_EL1 |
671+
HFGWTR2_EL2_nTCRALIAS_EL1 |
672+
HFGWTR2_EL2_nTCRMASK_EL1,
673+
FEAT_SRMASK),
674+
NEEDS_FEAT(HFGWTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
675+
};
676+
677+
static const struct reg_bits_to_feat_map hdfgrtr2_feat_map[] = {
678+
NEEDS_FEAT(HDFGRTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
679+
NEEDS_FEAT(HDFGRTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
680+
NEEDS_FEAT(HDFGRTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
681+
NEEDS_FEAT(HDFGRTR2_EL2_nPMICFILTR_EL0 |
682+
HDFGRTR2_EL2_nPMICNTR_EL0,
683+
FEAT_PMUv3_ICNTR),
684+
NEEDS_FEAT(HDFGRTR2_EL2_nPMUACR_EL1, FEAT_PMUv3p9),
685+
NEEDS_FEAT(HDFGRTR2_EL2_nPMSSCR_EL1 |
686+
HDFGRTR2_EL2_nPMSSDATA,
687+
FEAT_PMUv3_SS),
688+
NEEDS_FEAT(HDFGRTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
689+
NEEDS_FEAT(HDFGRTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
690+
NEEDS_FEAT(HDFGRTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
691+
NEEDS_FEAT(HDFGRTR2_EL2_nSPMACCESSR_EL1 |
692+
HDFGRTR2_EL2_nSPMCNTEN |
693+
HDFGRTR2_EL2_nSPMCR_EL0 |
694+
HDFGRTR2_EL2_nSPMDEVAFF_EL1 |
695+
HDFGRTR2_EL2_nSPMEVCNTRn_EL0 |
696+
HDFGRTR2_EL2_nSPMEVTYPERn_EL0|
697+
HDFGRTR2_EL2_nSPMID |
698+
HDFGRTR2_EL2_nSPMINTEN |
699+
HDFGRTR2_EL2_nSPMOVS |
700+
HDFGRTR2_EL2_nSPMSCR_EL1 |
701+
HDFGRTR2_EL2_nSPMSELR_EL0,
702+
FEAT_SPMU),
703+
NEEDS_FEAT(HDFGRTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
704+
NEEDS_FEAT(HDFGRTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
705+
};
706+
707+
static const struct reg_bits_to_feat_map hdfgwtr2_feat_map[] = {
708+
NEEDS_FEAT(HDFGWTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
709+
NEEDS_FEAT(HDFGWTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
710+
NEEDS_FEAT(HDFGWTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
711+
NEEDS_FEAT(HDFGWTR2_EL2_nPMICFILTR_EL0 |
712+
HDFGWTR2_EL2_nPMICNTR_EL0,
713+
FEAT_PMUv3_ICNTR),
714+
NEEDS_FEAT(HDFGWTR2_EL2_nPMUACR_EL1 |
715+
HDFGWTR2_EL2_nPMZR_EL0,
716+
FEAT_PMUv3p9),
717+
NEEDS_FEAT(HDFGWTR2_EL2_nPMSSCR_EL1, FEAT_PMUv3_SS),
718+
NEEDS_FEAT(HDFGWTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
719+
NEEDS_FEAT(HDFGWTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
720+
NEEDS_FEAT(HDFGWTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
721+
NEEDS_FEAT(HDFGWTR2_EL2_nSPMACCESSR_EL1 |
722+
HDFGWTR2_EL2_nSPMCNTEN |
723+
HDFGWTR2_EL2_nSPMCR_EL0 |
724+
HDFGWTR2_EL2_nSPMEVCNTRn_EL0 |
725+
HDFGWTR2_EL2_nSPMEVTYPERn_EL0|
726+
HDFGWTR2_EL2_nSPMINTEN |
727+
HDFGWTR2_EL2_nSPMOVS |
728+
HDFGWTR2_EL2_nSPMSCR_EL1 |
729+
HDFGWTR2_EL2_nSPMSELR_EL0,
730+
FEAT_SPMU),
731+
NEEDS_FEAT(HDFGWTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
732+
NEEDS_FEAT(HDFGWTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
733+
};
734+
592735
static const struct reg_bits_to_feat_map hcrx_feat_map[] = {
593736
NEEDS_FEAT(HCRX_EL2_PACMEn, feat_pauth_lr),
594737
NEEDS_FEAT(HCRX_EL2_EnFPM, FEAT_FPMR),
@@ -820,6 +963,27 @@ void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt)
820963
ARRAY_SIZE(hafgrtr_feat_map),
821964
0, NEVER_FGU);
822965
break;
966+
case HFGRTR2_GROUP:
967+
val |= compute_res0_bits(kvm, hfgrtr2_feat_map,
968+
ARRAY_SIZE(hfgrtr2_feat_map),
969+
0, NEVER_FGU);
970+
val |= compute_res0_bits(kvm, hfgwtr2_feat_map,
971+
ARRAY_SIZE(hfgwtr2_feat_map),
972+
0, NEVER_FGU);
973+
break;
974+
case HFGITR2_GROUP:
975+
val |= compute_res0_bits(kvm, hfgitr2_feat_map,
976+
ARRAY_SIZE(hfgitr2_feat_map),
977+
0, NEVER_FGU);
978+
break;
979+
case HDFGRTR2_GROUP:
980+
val |= compute_res0_bits(kvm, hdfgrtr2_feat_map,
981+
ARRAY_SIZE(hdfgrtr2_feat_map),
982+
0, NEVER_FGU);
983+
val |= compute_res0_bits(kvm, hdfgwtr2_feat_map,
984+
ARRAY_SIZE(hdfgwtr2_feat_map),
985+
0, NEVER_FGU);
986+
break;
823987
default:
824988
BUG();
825989
}
@@ -868,6 +1032,36 @@ void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *r
8681032
*res0 |= hafgrtr_masks.res0;
8691033
*res1 = HAFGRTR_EL2_RES1;
8701034
break;
1035+
case HFGRTR2_EL2:
1036+
*res0 = compute_res0_bits(kvm, hfgrtr2_feat_map,
1037+
ARRAY_SIZE(hfgrtr2_feat_map), 0, 0);
1038+
*res0 |= hfgrtr2_masks.res0;
1039+
*res1 = HFGRTR2_EL2_RES1;
1040+
break;
1041+
case HFGWTR2_EL2:
1042+
*res0 = compute_res0_bits(kvm, hfgwtr2_feat_map,
1043+
ARRAY_SIZE(hfgwtr2_feat_map), 0, 0);
1044+
*res0 |= hfgwtr2_masks.res0;
1045+
*res1 = HFGWTR2_EL2_RES1;
1046+
break;
1047+
case HFGITR2_EL2:
1048+
*res0 = compute_res0_bits(kvm, hfgitr2_feat_map,
1049+
ARRAY_SIZE(hfgitr2_feat_map), 0, 0);
1050+
*res0 |= hfgitr2_masks.res0;
1051+
*res1 = HFGITR2_EL2_RES1;
1052+
break;
1053+
case HDFGRTR2_EL2:
1054+
*res0 = compute_res0_bits(kvm, hdfgrtr2_feat_map,
1055+
ARRAY_SIZE(hdfgrtr2_feat_map), 0, 0);
1056+
*res0 |= hdfgrtr2_masks.res0;
1057+
*res1 = HDFGRTR2_EL2_RES1;
1058+
break;
1059+
case HDFGWTR2_EL2:
1060+
*res0 = compute_res0_bits(kvm, hdfgwtr2_feat_map,
1061+
ARRAY_SIZE(hdfgwtr2_feat_map), 0, 0);
1062+
*res0 |= hdfgwtr2_masks.res0;
1063+
*res1 = HDFGWTR2_EL2_RES1;
1064+
break;
8711065
case HCRX_EL2:
8721066
*res0 = compute_res0_bits(kvm, hcrx_feat_map,
8731067
ARRAY_SIZE(hcrx_feat_map), 0, 0);

arch/arm64/kvm/emulate-nested.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,6 +2060,11 @@ FGT_MASKS(hfgitr_masks, HFGITR_EL2_RES0);
20602060
FGT_MASKS(hdfgrtr_masks, HDFGRTR_EL2_RES0);
20612061
FGT_MASKS(hdfgwtr_masks, HDFGWTR_EL2_RES0);
20622062
FGT_MASKS(hafgrtr_masks, HAFGRTR_EL2_RES0);
2063+
FGT_MASKS(hfgrtr2_masks, HFGRTR2_EL2_RES0);
2064+
FGT_MASKS(hfgwtr2_masks, HFGWTR2_EL2_RES0);
2065+
FGT_MASKS(hfgitr2_masks, HFGITR2_EL2_RES0);
2066+
FGT_MASKS(hdfgrtr2_masks, HDFGRTR2_EL2_RES0);
2067+
FGT_MASKS(hdfgwtr2_masks, HDFGWTR2_EL2_RES0);
20632068

20642069
static __init bool aggregate_fgt(union trap_config tc)
20652070
{
@@ -2082,6 +2087,18 @@ static __init bool aggregate_fgt(union trap_config tc)
20822087
rmasks = &hfgitr_masks;
20832088
wmasks = NULL;
20842089
break;
2090+
case HFGRTR2_GROUP:
2091+
rmasks = &hfgrtr2_masks;
2092+
wmasks = &hfgwtr2_masks;
2093+
break;
2094+
case HDFGRTR2_GROUP:
2095+
rmasks = &hdfgrtr2_masks;
2096+
wmasks = &hdfgwtr2_masks;
2097+
break;
2098+
case HFGITR2_GROUP:
2099+
rmasks = &hfgitr2_masks;
2100+
wmasks = NULL;
2101+
break;
20852102
}
20862103

20872104
/*
@@ -2141,6 +2158,11 @@ static __init int check_all_fgt_masks(int ret)
21412158
&hdfgrtr_masks,
21422159
&hdfgwtr_masks,
21432160
&hafgrtr_masks,
2161+
&hfgrtr2_masks,
2162+
&hfgwtr2_masks,
2163+
&hfgitr2_masks,
2164+
&hdfgrtr2_masks,
2165+
&hdfgwtr2_masks,
21442166
};
21452167
int err = 0;
21462168

arch/arm64/kvm/hyp/nvhe/switch.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ struct fgt_masks hfgitr_masks;
3939
struct fgt_masks hdfgrtr_masks;
4040
struct fgt_masks hdfgwtr_masks;
4141
struct fgt_masks hafgrtr_masks;
42+
struct fgt_masks hfgrtr2_masks;
43+
struct fgt_masks hfgwtr2_masks;
44+
struct fgt_masks hfgitr2_masks;
45+
struct fgt_masks hdfgrtr2_masks;
46+
struct fgt_masks hdfgwtr2_masks;
4247

4348
extern void kvm_nvhe_prepare_backtrace(unsigned long fp, unsigned long pc);
4449

arch/arm64/kvm/nested.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,22 @@ int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu)
10451045
get_reg_fixed_bits(kvm, HAFGRTR_EL2, &res0, &res1);
10461046
set_sysreg_masks(kvm, HAFGRTR_EL2, res0, res1);
10471047

1048+
/* HFG[RW]TR2_EL2 */
1049+
get_reg_fixed_bits(kvm, HFGRTR2_EL2, &res0, &res1);
1050+
set_sysreg_masks(kvm, HFGRTR2_EL2, res0, res1);
1051+
get_reg_fixed_bits(kvm, HFGWTR2_EL2, &res0, &res1);
1052+
set_sysreg_masks(kvm, HFGWTR2_EL2, res0, res1);
1053+
1054+
/* HDFG[RW]TR2_EL2 */
1055+
get_reg_fixed_bits(kvm, HDFGRTR2_EL2, &res0, &res1);
1056+
set_sysreg_masks(kvm, HDFGRTR2_EL2, res0, res1);
1057+
get_reg_fixed_bits(kvm, HDFGWTR2_EL2, &res0, &res1);
1058+
set_sysreg_masks(kvm, HDFGWTR2_EL2, res0, res1);
1059+
1060+
/* HFGITR2_EL2 */
1061+
get_reg_fixed_bits(kvm, HFGITR2_EL2, &res0, &res1);
1062+
set_sysreg_masks(kvm, HFGITR2_EL2, res0, res1);
1063+
10481064
/* TCR2_EL2 */
10491065
res0 = TCR2_EL2_RES0;
10501066
res1 = TCR2_EL2_RES1;

arch/arm64/kvm/sys_regs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5151,6 +5151,9 @@ void kvm_calculate_traps(struct kvm_vcpu *vcpu)
51515151
compute_fgu(kvm, HFGITR_GROUP);
51525152
compute_fgu(kvm, HDFGRTR_GROUP);
51535153
compute_fgu(kvm, HAFGRTR_GROUP);
5154+
compute_fgu(kvm, HFGRTR2_GROUP);
5155+
compute_fgu(kvm, HFGITR2_GROUP);
5156+
compute_fgu(kvm, HDFGRTR2_GROUP);
51545157

51555158
set_bit(KVM_ARCH_FLAG_FGU_INITIALIZED, &kvm->arch.flags);
51565159
out:

0 commit comments

Comments
 (0)