163d423a7SMarc Zyngier // SPDX-License-Identifier: GPL-2.0-only
263d423a7SMarc Zyngier /*
363d423a7SMarc Zyngier * Copyright (C) 2025 Google LLC
463d423a7SMarc Zyngier * Author: Marc Zyngier <maz@kernel.org>
563d423a7SMarc Zyngier */
663d423a7SMarc Zyngier
763d423a7SMarc Zyngier #include <linux/kvm_host.h>
863d423a7SMarc Zyngier #include <asm/sysreg.h>
963d423a7SMarc Zyngier
1063d423a7SMarc Zyngier struct reg_bits_to_feat_map {
1163d423a7SMarc Zyngier u64 bits;
1263d423a7SMarc Zyngier
1363d423a7SMarc Zyngier #define NEVER_FGU BIT(0) /* Can trap, but never UNDEF */
1463d423a7SMarc Zyngier #define CALL_FUNC BIT(1) /* Needs to evaluate tons of crap */
1563d423a7SMarc Zyngier #define FIXED_VALUE BIT(2) /* RAZ/WI or RAO/WI in KVM */
1663d423a7SMarc Zyngier unsigned long flags;
1763d423a7SMarc Zyngier
1863d423a7SMarc Zyngier union {
1963d423a7SMarc Zyngier struct {
2063d423a7SMarc Zyngier u8 regidx;
2163d423a7SMarc Zyngier u8 shift;
2263d423a7SMarc Zyngier u8 width;
2363d423a7SMarc Zyngier bool sign;
2463d423a7SMarc Zyngier s8 lo_lim;
2563d423a7SMarc Zyngier };
2663d423a7SMarc Zyngier bool (*match)(struct kvm *);
2763d423a7SMarc Zyngier bool (*fval)(struct kvm *, u64 *);
2863d423a7SMarc Zyngier };
2963d423a7SMarc Zyngier };
3063d423a7SMarc Zyngier
3163d423a7SMarc Zyngier #define __NEEDS_FEAT_3(m, f, id, fld, lim) \
3263d423a7SMarc Zyngier { \
3363d423a7SMarc Zyngier .bits = (m), \
3463d423a7SMarc Zyngier .flags = (f), \
3563d423a7SMarc Zyngier .regidx = IDREG_IDX(SYS_ ## id), \
3663d423a7SMarc Zyngier .shift = id ##_## fld ## _SHIFT, \
3763d423a7SMarc Zyngier .width = id ##_## fld ## _WIDTH, \
3863d423a7SMarc Zyngier .sign = id ##_## fld ## _SIGNED, \
3963d423a7SMarc Zyngier .lo_lim = id ##_## fld ##_## lim \
4063d423a7SMarc Zyngier }
4163d423a7SMarc Zyngier
4263d423a7SMarc Zyngier #define __NEEDS_FEAT_2(m, f, fun, dummy) \
4363d423a7SMarc Zyngier { \
4463d423a7SMarc Zyngier .bits = (m), \
4563d423a7SMarc Zyngier .flags = (f) | CALL_FUNC, \
4663d423a7SMarc Zyngier .fval = (fun), \
4763d423a7SMarc Zyngier }
4863d423a7SMarc Zyngier
4963d423a7SMarc Zyngier #define __NEEDS_FEAT_1(m, f, fun) \
5063d423a7SMarc Zyngier { \
5163d423a7SMarc Zyngier .bits = (m), \
5263d423a7SMarc Zyngier .flags = (f) | CALL_FUNC, \
5363d423a7SMarc Zyngier .match = (fun), \
5463d423a7SMarc Zyngier }
5563d423a7SMarc Zyngier
5663d423a7SMarc Zyngier #define NEEDS_FEAT_FLAG(m, f, ...) \
5763d423a7SMarc Zyngier CONCATENATE(__NEEDS_FEAT_, COUNT_ARGS(__VA_ARGS__))(m, f, __VA_ARGS__)
5863d423a7SMarc Zyngier
5963d423a7SMarc Zyngier #define NEEDS_FEAT_FIXED(m, ...) \
6063d423a7SMarc Zyngier NEEDS_FEAT_FLAG(m, FIXED_VALUE, __VA_ARGS__, 0)
6163d423a7SMarc Zyngier
6263d423a7SMarc Zyngier #define NEEDS_FEAT(m, ...) NEEDS_FEAT_FLAG(m, 0, __VA_ARGS__)
6363d423a7SMarc Zyngier
6463d423a7SMarc Zyngier #define FEAT_SPE ID_AA64DFR0_EL1, PMSVer, IMP
6563d423a7SMarc Zyngier #define FEAT_SPE_FnE ID_AA64DFR0_EL1, PMSVer, V1P2
6663d423a7SMarc Zyngier #define FEAT_BRBE ID_AA64DFR0_EL1, BRBE, IMP
6763d423a7SMarc Zyngier #define FEAT_TRC_SR ID_AA64DFR0_EL1, TraceVer, IMP
6863d423a7SMarc Zyngier #define FEAT_PMUv3 ID_AA64DFR0_EL1, PMUVer, IMP
69*4bc0fe08SMarc Zyngier #define FEAT_PMUv3p9 ID_AA64DFR0_EL1, PMUVer, V3P9
7063d423a7SMarc Zyngier #define FEAT_TRBE ID_AA64DFR0_EL1, TraceBuffer, IMP
71*4bc0fe08SMarc Zyngier #define FEAT_TRBEv1p1 ID_AA64DFR0_EL1, TraceBuffer, TRBE_V1P1
7263d423a7SMarc Zyngier #define FEAT_DoubleLock ID_AA64DFR0_EL1, DoubleLock, IMP
7363d423a7SMarc Zyngier #define FEAT_TRF ID_AA64DFR0_EL1, TraceFilt, IMP
74b2a324ffSMarc Zyngier #define FEAT_AA32EL0 ID_AA64PFR0_EL1, EL0, AARCH32
75b2a324ffSMarc Zyngier #define FEAT_AA32EL1 ID_AA64PFR0_EL1, EL1, AARCH32
7663d423a7SMarc Zyngier #define FEAT_AA64EL1 ID_AA64PFR0_EL1, EL1, IMP
77b2a324ffSMarc Zyngier #define FEAT_AA64EL3 ID_AA64PFR0_EL1, EL3, IMP
7863d423a7SMarc Zyngier #define FEAT_AIE ID_AA64MMFR3_EL1, AIE, IMP
7963d423a7SMarc Zyngier #define FEAT_S2POE ID_AA64MMFR3_EL1, S2POE, IMP
8063d423a7SMarc Zyngier #define FEAT_S1POE ID_AA64MMFR3_EL1, S1POE, IMP
8163d423a7SMarc Zyngier #define FEAT_S1PIE ID_AA64MMFR3_EL1, S1PIE, IMP
8263d423a7SMarc Zyngier #define FEAT_THE ID_AA64PFR1_EL1, THE, IMP
8363d423a7SMarc Zyngier #define FEAT_SME ID_AA64PFR1_EL1, SME, IMP
8463d423a7SMarc Zyngier #define FEAT_GCS ID_AA64PFR1_EL1, GCS, IMP
85beed4448SMarc Zyngier #define FEAT_LS64 ID_AA64ISAR1_EL1, LS64, LS64
86beed4448SMarc Zyngier #define FEAT_LS64_V ID_AA64ISAR1_EL1, LS64, LS64_V
8763d423a7SMarc Zyngier #define FEAT_LS64_ACCDATA ID_AA64ISAR1_EL1, LS64, LS64_ACCDATA
8863d423a7SMarc Zyngier #define FEAT_RAS ID_AA64PFR0_EL1, RAS, IMP
89*4bc0fe08SMarc Zyngier #define FEAT_RASv2 ID_AA64PFR0_EL1, RAS, V2
9063d423a7SMarc Zyngier #define FEAT_GICv3 ID_AA64PFR0_EL1, GIC, IMP
9163d423a7SMarc Zyngier #define FEAT_LOR ID_AA64MMFR1_EL1, LO, IMP
92*4bc0fe08SMarc Zyngier #define FEAT_SPEv1p4 ID_AA64DFR0_EL1, PMSVer, V1P4
9363d423a7SMarc Zyngier #define FEAT_SPEv1p5 ID_AA64DFR0_EL1, PMSVer, V1P5
9463d423a7SMarc Zyngier #define FEAT_ATS1A ID_AA64ISAR2_EL1, ATS1A, IMP
9563d423a7SMarc Zyngier #define FEAT_SPECRES2 ID_AA64ISAR1_EL1, SPECRES, COSP_RCTX
9663d423a7SMarc Zyngier #define FEAT_SPECRES ID_AA64ISAR1_EL1, SPECRES, IMP
9763d423a7SMarc Zyngier #define FEAT_TLBIRANGE ID_AA64ISAR0_EL1, TLB, RANGE
9863d423a7SMarc Zyngier #define FEAT_TLBIOS ID_AA64ISAR0_EL1, TLB, OS
9963d423a7SMarc Zyngier #define FEAT_PAN2 ID_AA64MMFR1_EL1, PAN, PAN2
10063d423a7SMarc Zyngier #define FEAT_DPB2 ID_AA64ISAR1_EL1, DPB, DPB2
10163d423a7SMarc Zyngier #define FEAT_AMUv1 ID_AA64PFR0_EL1, AMU, IMP
102b2a324ffSMarc Zyngier #define FEAT_AMUv1p1 ID_AA64PFR0_EL1, AMU, V1P1
103beed4448SMarc Zyngier #define FEAT_CMOW ID_AA64MMFR1_EL1, CMOW, IMP
104beed4448SMarc Zyngier #define FEAT_D128 ID_AA64MMFR3_EL1, D128, IMP
105beed4448SMarc Zyngier #define FEAT_DoubleFault2 ID_AA64PFR1_EL1, DF2, IMP
106beed4448SMarc Zyngier #define FEAT_FPMR ID_AA64PFR2_EL1, FPMR, IMP
107beed4448SMarc Zyngier #define FEAT_MOPS ID_AA64ISAR2_EL1, MOPS, IMP
108beed4448SMarc Zyngier #define FEAT_NMI ID_AA64PFR1_EL1, NMI, IMP
109beed4448SMarc Zyngier #define FEAT_SCTLR2 ID_AA64MMFR3_EL1, SCTLRX, IMP
110beed4448SMarc Zyngier #define FEAT_SYSREG128 ID_AA64ISAR2_EL1, SYSREG_128, IMP
111beed4448SMarc Zyngier #define FEAT_TCR2 ID_AA64MMFR3_EL1, TCRX, IMP
112beed4448SMarc Zyngier #define FEAT_XS ID_AA64ISAR1_EL1, XS, IMP
113b2a324ffSMarc Zyngier #define FEAT_EVT ID_AA64MMFR2_EL1, EVT, IMP
114b2a324ffSMarc Zyngier #define FEAT_EVT_TTLBxS ID_AA64MMFR2_EL1, EVT, TTLBxS
115b2a324ffSMarc Zyngier #define FEAT_MTE2 ID_AA64PFR1_EL1, MTE, MTE2
116b2a324ffSMarc Zyngier #define FEAT_RME ID_AA64PFR0_EL1, RME, IMP
117*4bc0fe08SMarc Zyngier #define FEAT_MPAM ID_AA64PFR0_EL1, MPAM, 1
118b2a324ffSMarc Zyngier #define FEAT_S2FWB ID_AA64MMFR2_EL1, FWB, IMP
119b2a324ffSMarc Zyngier #define FEAT_TME ID_AA64ISAR0_EL1, TME, IMP
120b2a324ffSMarc Zyngier #define FEAT_TWED ID_AA64MMFR1_EL1, TWED, IMP
121b2a324ffSMarc Zyngier #define FEAT_E2H0 ID_AA64MMFR4_EL1, E2H0, IMP
122*4bc0fe08SMarc Zyngier #define FEAT_SRMASK ID_AA64MMFR4_EL1, SRMASK, IMP
123*4bc0fe08SMarc Zyngier #define FEAT_PoPS ID_AA64MMFR4_EL1, PoPS, IMP
124*4bc0fe08SMarc Zyngier #define FEAT_PFAR ID_AA64PFR1_EL1, PFAR, IMP
125*4bc0fe08SMarc Zyngier #define FEAT_Debugv8p9 ID_AA64DFR0_EL1, PMUVer, V3P9
126*4bc0fe08SMarc Zyngier #define FEAT_PMUv3_SS ID_AA64DFR0_EL1, PMSS, IMP
127*4bc0fe08SMarc Zyngier #define FEAT_SEBEP ID_AA64DFR0_EL1, SEBEP, IMP
128*4bc0fe08SMarc Zyngier #define FEAT_EBEP ID_AA64DFR1_EL1, EBEP, IMP
129*4bc0fe08SMarc Zyngier #define FEAT_ITE ID_AA64DFR1_EL1, ITE, IMP
130*4bc0fe08SMarc Zyngier #define FEAT_PMUv3_ICNTR ID_AA64DFR1_EL1, PMICNTR, IMP
131*4bc0fe08SMarc Zyngier #define FEAT_SPMU ID_AA64DFR1_EL1, SPMU, IMP
132*4bc0fe08SMarc Zyngier #define FEAT_SPE_nVM ID_AA64DFR2_EL1, SPE_nVM, IMP
133*4bc0fe08SMarc Zyngier #define FEAT_STEP2 ID_AA64DFR2_EL1, STEP, IMP
134b2a324ffSMarc Zyngier
not_feat_aa64el3(struct kvm * kvm)135b2a324ffSMarc Zyngier static bool not_feat_aa64el3(struct kvm *kvm)
136b2a324ffSMarc Zyngier {
137b2a324ffSMarc Zyngier return !kvm_has_feat(kvm, FEAT_AA64EL3);
138b2a324ffSMarc Zyngier }
139b2a324ffSMarc Zyngier
feat_nv2(struct kvm * kvm)140b2a324ffSMarc Zyngier static bool feat_nv2(struct kvm *kvm)
141b2a324ffSMarc Zyngier {
142b2a324ffSMarc Zyngier return ((kvm_has_feat(kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY) &&
143b2a324ffSMarc Zyngier kvm_has_feat_enum(kvm, ID_AA64MMFR2_EL1, NV, NI)) ||
144b2a324ffSMarc Zyngier kvm_has_feat(kvm, ID_AA64MMFR2_EL1, NV, NV2));
145b2a324ffSMarc Zyngier }
146b2a324ffSMarc Zyngier
feat_nv2_e2h0_ni(struct kvm * kvm)147b2a324ffSMarc Zyngier static bool feat_nv2_e2h0_ni(struct kvm *kvm)
148b2a324ffSMarc Zyngier {
149b2a324ffSMarc Zyngier return feat_nv2(kvm) && !kvm_has_feat(kvm, FEAT_E2H0);
150b2a324ffSMarc Zyngier }
15163d423a7SMarc Zyngier
feat_rasv1p1(struct kvm * kvm)15263d423a7SMarc Zyngier static bool feat_rasv1p1(struct kvm *kvm)
15363d423a7SMarc Zyngier {
15463d423a7SMarc Zyngier return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, V1P1) ||
15563d423a7SMarc Zyngier (kvm_has_feat_enum(kvm, ID_AA64PFR0_EL1, RAS, IMP) &&
15663d423a7SMarc Zyngier kvm_has_feat(kvm, ID_AA64PFR1_EL1, RAS_frac, RASv1p1)));
15763d423a7SMarc Zyngier }
15863d423a7SMarc Zyngier
feat_csv2_2_csv2_1p2(struct kvm * kvm)15963d423a7SMarc Zyngier static bool feat_csv2_2_csv2_1p2(struct kvm *kvm)
16063d423a7SMarc Zyngier {
16163d423a7SMarc Zyngier return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, CSV2, CSV2_2) ||
16263d423a7SMarc Zyngier (kvm_has_feat(kvm, ID_AA64PFR1_EL1, CSV2_frac, CSV2_1p2) &&
16363d423a7SMarc Zyngier kvm_has_feat_enum(kvm, ID_AA64PFR0_EL1, CSV2, IMP)));
16463d423a7SMarc Zyngier }
16563d423a7SMarc Zyngier
feat_pauth(struct kvm * kvm)16663d423a7SMarc Zyngier static bool feat_pauth(struct kvm *kvm)
16763d423a7SMarc Zyngier {
16863d423a7SMarc Zyngier return kvm_has_pauth(kvm, PAuth);
16963d423a7SMarc Zyngier }
17063d423a7SMarc Zyngier
feat_pauth_lr(struct kvm * kvm)171beed4448SMarc Zyngier static bool feat_pauth_lr(struct kvm *kvm)
172beed4448SMarc Zyngier {
173beed4448SMarc Zyngier return kvm_has_pauth(kvm, PAuth_LR);
174beed4448SMarc Zyngier }
175beed4448SMarc Zyngier
feat_aderr(struct kvm * kvm)176beed4448SMarc Zyngier static bool feat_aderr(struct kvm *kvm)
177beed4448SMarc Zyngier {
178beed4448SMarc Zyngier return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ADERR, FEAT_ADERR) &&
179beed4448SMarc Zyngier kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SDERR, FEAT_ADERR));
180beed4448SMarc Zyngier }
181beed4448SMarc Zyngier
feat_anerr(struct kvm * kvm)182beed4448SMarc Zyngier static bool feat_anerr(struct kvm *kvm)
183beed4448SMarc Zyngier {
184beed4448SMarc Zyngier return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ANERR, FEAT_ANERR) &&
185beed4448SMarc Zyngier kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SNERR, FEAT_ANERR));
186beed4448SMarc Zyngier }
187beed4448SMarc Zyngier
feat_sme_smps(struct kvm * kvm)188beed4448SMarc Zyngier static bool feat_sme_smps(struct kvm *kvm)
189beed4448SMarc Zyngier {
190beed4448SMarc Zyngier /*
191beed4448SMarc Zyngier * Revists this if KVM ever supports SME -- this really should
192beed4448SMarc Zyngier * look at the guest's view of SMIDR_EL1. Funnily enough, this
193beed4448SMarc Zyngier * is not captured in the JSON file, but only as a note in the
194beed4448SMarc Zyngier * ARM ARM.
195beed4448SMarc Zyngier */
196beed4448SMarc Zyngier return (kvm_has_feat(kvm, FEAT_SME) &&
197beed4448SMarc Zyngier (read_sysreg_s(SYS_SMIDR_EL1) & SMIDR_EL1_SMPS));
198beed4448SMarc Zyngier }
199beed4448SMarc Zyngier
feat_spe_fds(struct kvm * kvm)200*4bc0fe08SMarc Zyngier static bool feat_spe_fds(struct kvm *kvm)
201*4bc0fe08SMarc Zyngier {
202*4bc0fe08SMarc Zyngier /*
203*4bc0fe08SMarc Zyngier * Revists this if KVM ever supports SPE -- this really should
204*4bc0fe08SMarc Zyngier * look at the guest's view of PMSIDR_EL1.
205*4bc0fe08SMarc Zyngier */
206*4bc0fe08SMarc Zyngier return (kvm_has_feat(kvm, FEAT_SPEv1p4) &&
207*4bc0fe08SMarc Zyngier (read_sysreg_s(SYS_PMSIDR_EL1) & PMSIDR_EL1_FDS));
208*4bc0fe08SMarc Zyngier }
209*4bc0fe08SMarc Zyngier
feat_trbe_mpam(struct kvm * kvm)210*4bc0fe08SMarc Zyngier static bool feat_trbe_mpam(struct kvm *kvm)
211*4bc0fe08SMarc Zyngier {
212*4bc0fe08SMarc Zyngier /*
213*4bc0fe08SMarc Zyngier * Revists this if KVM ever supports both MPAM and TRBE --
214*4bc0fe08SMarc Zyngier * this really should look at the guest's view of TRBIDR_EL1.
215*4bc0fe08SMarc Zyngier */
216*4bc0fe08SMarc Zyngier return (kvm_has_feat(kvm, FEAT_TRBE) &&
217*4bc0fe08SMarc Zyngier kvm_has_feat(kvm, FEAT_MPAM) &&
218*4bc0fe08SMarc Zyngier (read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_MPAM));
219*4bc0fe08SMarc Zyngier }
220*4bc0fe08SMarc Zyngier
feat_ebep_pmuv3_ss(struct kvm * kvm)221*4bc0fe08SMarc Zyngier static bool feat_ebep_pmuv3_ss(struct kvm *kvm)
222*4bc0fe08SMarc Zyngier {
223*4bc0fe08SMarc Zyngier return kvm_has_feat(kvm, FEAT_EBEP) || kvm_has_feat(kvm, FEAT_PMUv3_SS);
224*4bc0fe08SMarc Zyngier }
225*4bc0fe08SMarc Zyngier
compute_hcr_rw(struct kvm * kvm,u64 * bits)226b2a324ffSMarc Zyngier static bool compute_hcr_rw(struct kvm *kvm, u64 *bits)
227b2a324ffSMarc Zyngier {
228b2a324ffSMarc Zyngier /* This is purely academic: AArch32 and NV are mutually exclusive */
229b2a324ffSMarc Zyngier if (bits) {
230b2a324ffSMarc Zyngier if (kvm_has_feat(kvm, FEAT_AA32EL1))
231b2a324ffSMarc Zyngier *bits &= ~HCR_EL2_RW;
232b2a324ffSMarc Zyngier else
233b2a324ffSMarc Zyngier *bits |= HCR_EL2_RW;
234b2a324ffSMarc Zyngier }
235b2a324ffSMarc Zyngier
236b2a324ffSMarc Zyngier return true;
237b2a324ffSMarc Zyngier }
238b2a324ffSMarc Zyngier
compute_hcr_e2h(struct kvm * kvm,u64 * bits)239b2a324ffSMarc Zyngier static bool compute_hcr_e2h(struct kvm *kvm, u64 *bits)
240b2a324ffSMarc Zyngier {
241b2a324ffSMarc Zyngier if (bits) {
242b2a324ffSMarc Zyngier if (kvm_has_feat(kvm, FEAT_E2H0))
243b2a324ffSMarc Zyngier *bits &= ~HCR_EL2_E2H;
244b2a324ffSMarc Zyngier else
245b2a324ffSMarc Zyngier *bits |= HCR_EL2_E2H;
246b2a324ffSMarc Zyngier }
247b2a324ffSMarc Zyngier
248b2a324ffSMarc Zyngier return true;
249b2a324ffSMarc Zyngier }
250b2a324ffSMarc Zyngier
25163d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hfgrtr_feat_map[] = {
25263d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nAMAIR2_EL1 |
25363d423a7SMarc Zyngier HFGRTR_EL2_nMAIR2_EL1,
25463d423a7SMarc Zyngier FEAT_AIE),
25563d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nS2POR_EL1, FEAT_S2POE),
25663d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nPOR_EL1 |
25763d423a7SMarc Zyngier HFGRTR_EL2_nPOR_EL0,
25863d423a7SMarc Zyngier FEAT_S1POE),
25963d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nPIR_EL1 |
26063d423a7SMarc Zyngier HFGRTR_EL2_nPIRE0_EL1,
26163d423a7SMarc Zyngier FEAT_S1PIE),
26263d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nRCWMASK_EL1, FEAT_THE),
26363d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nTPIDR2_EL0 |
26463d423a7SMarc Zyngier HFGRTR_EL2_nSMPRI_EL1,
26563d423a7SMarc Zyngier FEAT_SME),
26663d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nGCS_EL1 |
26763d423a7SMarc Zyngier HFGRTR_EL2_nGCS_EL0,
26863d423a7SMarc Zyngier FEAT_GCS),
26963d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_nACCDATA_EL1, FEAT_LS64_ACCDATA),
27063d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_ERXADDR_EL1 |
27163d423a7SMarc Zyngier HFGRTR_EL2_ERXMISCn_EL1 |
27263d423a7SMarc Zyngier HFGRTR_EL2_ERXSTATUS_EL1 |
27363d423a7SMarc Zyngier HFGRTR_EL2_ERXCTLR_EL1 |
27463d423a7SMarc Zyngier HFGRTR_EL2_ERXFR_EL1 |
27563d423a7SMarc Zyngier HFGRTR_EL2_ERRSELR_EL1 |
27663d423a7SMarc Zyngier HFGRTR_EL2_ERRIDR_EL1,
27763d423a7SMarc Zyngier FEAT_RAS),
27863d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_ERXPFGCDN_EL1 |
27963d423a7SMarc Zyngier HFGRTR_EL2_ERXPFGCTL_EL1 |
28063d423a7SMarc Zyngier HFGRTR_EL2_ERXPFGF_EL1,
28163d423a7SMarc Zyngier feat_rasv1p1),
28263d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_ICC_IGRPENn_EL1, FEAT_GICv3),
28363d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_SCXTNUM_EL0 |
28463d423a7SMarc Zyngier HFGRTR_EL2_SCXTNUM_EL1,
28563d423a7SMarc Zyngier feat_csv2_2_csv2_1p2),
28663d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_LORSA_EL1 |
28763d423a7SMarc Zyngier HFGRTR_EL2_LORN_EL1 |
28863d423a7SMarc Zyngier HFGRTR_EL2_LORID_EL1 |
28963d423a7SMarc Zyngier HFGRTR_EL2_LOREA_EL1 |
29063d423a7SMarc Zyngier HFGRTR_EL2_LORC_EL1,
29163d423a7SMarc Zyngier FEAT_LOR),
29263d423a7SMarc Zyngier NEEDS_FEAT(HFGRTR_EL2_APIBKey |
29363d423a7SMarc Zyngier HFGRTR_EL2_APIAKey |
29463d423a7SMarc Zyngier HFGRTR_EL2_APGAKey |
29563d423a7SMarc Zyngier HFGRTR_EL2_APDBKey |
29663d423a7SMarc Zyngier HFGRTR_EL2_APDAKey,
29763d423a7SMarc Zyngier feat_pauth),
29863d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HFGRTR_EL2_VBAR_EL1 |
29963d423a7SMarc Zyngier HFGRTR_EL2_TTBR1_EL1 |
30063d423a7SMarc Zyngier HFGRTR_EL2_TTBR0_EL1 |
30163d423a7SMarc Zyngier HFGRTR_EL2_TPIDR_EL0 |
30263d423a7SMarc Zyngier HFGRTR_EL2_TPIDRRO_EL0 |
30363d423a7SMarc Zyngier HFGRTR_EL2_TPIDR_EL1 |
30463d423a7SMarc Zyngier HFGRTR_EL2_TCR_EL1 |
30563d423a7SMarc Zyngier HFGRTR_EL2_SCTLR_EL1 |
30663d423a7SMarc Zyngier HFGRTR_EL2_REVIDR_EL1 |
30763d423a7SMarc Zyngier HFGRTR_EL2_PAR_EL1 |
30863d423a7SMarc Zyngier HFGRTR_EL2_MPIDR_EL1 |
30963d423a7SMarc Zyngier HFGRTR_EL2_MIDR_EL1 |
31063d423a7SMarc Zyngier HFGRTR_EL2_MAIR_EL1 |
31163d423a7SMarc Zyngier HFGRTR_EL2_ISR_EL1 |
31263d423a7SMarc Zyngier HFGRTR_EL2_FAR_EL1 |
31363d423a7SMarc Zyngier HFGRTR_EL2_ESR_EL1 |
31463d423a7SMarc Zyngier HFGRTR_EL2_DCZID_EL0 |
31563d423a7SMarc Zyngier HFGRTR_EL2_CTR_EL0 |
31663d423a7SMarc Zyngier HFGRTR_EL2_CSSELR_EL1 |
31763d423a7SMarc Zyngier HFGRTR_EL2_CPACR_EL1 |
31863d423a7SMarc Zyngier HFGRTR_EL2_CONTEXTIDR_EL1|
31963d423a7SMarc Zyngier HFGRTR_EL2_CLIDR_EL1 |
32063d423a7SMarc Zyngier HFGRTR_EL2_CCSIDR_EL1 |
32163d423a7SMarc Zyngier HFGRTR_EL2_AMAIR_EL1 |
32263d423a7SMarc Zyngier HFGRTR_EL2_AIDR_EL1 |
32363d423a7SMarc Zyngier HFGRTR_EL2_AFSR1_EL1 |
32463d423a7SMarc Zyngier HFGRTR_EL2_AFSR0_EL1,
32563d423a7SMarc Zyngier NEVER_FGU, FEAT_AA64EL1),
32663d423a7SMarc Zyngier };
32763d423a7SMarc Zyngier
32863d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hfgwtr_feat_map[] = {
32963d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nAMAIR2_EL1 |
33063d423a7SMarc Zyngier HFGWTR_EL2_nMAIR2_EL1,
33163d423a7SMarc Zyngier FEAT_AIE),
33263d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nS2POR_EL1, FEAT_S2POE),
33363d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nPOR_EL1 |
33463d423a7SMarc Zyngier HFGWTR_EL2_nPOR_EL0,
33563d423a7SMarc Zyngier FEAT_S1POE),
33663d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nPIR_EL1 |
33763d423a7SMarc Zyngier HFGWTR_EL2_nPIRE0_EL1,
33863d423a7SMarc Zyngier FEAT_S1PIE),
33963d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nRCWMASK_EL1, FEAT_THE),
34063d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nTPIDR2_EL0 |
34163d423a7SMarc Zyngier HFGWTR_EL2_nSMPRI_EL1,
34263d423a7SMarc Zyngier FEAT_SME),
34363d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nGCS_EL1 |
34463d423a7SMarc Zyngier HFGWTR_EL2_nGCS_EL0,
34563d423a7SMarc Zyngier FEAT_GCS),
34663d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_nACCDATA_EL1, FEAT_LS64_ACCDATA),
34763d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_ERXADDR_EL1 |
34863d423a7SMarc Zyngier HFGWTR_EL2_ERXMISCn_EL1 |
34963d423a7SMarc Zyngier HFGWTR_EL2_ERXSTATUS_EL1 |
35063d423a7SMarc Zyngier HFGWTR_EL2_ERXCTLR_EL1 |
35163d423a7SMarc Zyngier HFGWTR_EL2_ERRSELR_EL1,
35263d423a7SMarc Zyngier FEAT_RAS),
35363d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_ERXPFGCDN_EL1 |
35463d423a7SMarc Zyngier HFGWTR_EL2_ERXPFGCTL_EL1,
35563d423a7SMarc Zyngier feat_rasv1p1),
35663d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_ICC_IGRPENn_EL1, FEAT_GICv3),
35763d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_SCXTNUM_EL0 |
35863d423a7SMarc Zyngier HFGWTR_EL2_SCXTNUM_EL1,
35963d423a7SMarc Zyngier feat_csv2_2_csv2_1p2),
36063d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_LORSA_EL1 |
36163d423a7SMarc Zyngier HFGWTR_EL2_LORN_EL1 |
36263d423a7SMarc Zyngier HFGWTR_EL2_LOREA_EL1 |
36363d423a7SMarc Zyngier HFGWTR_EL2_LORC_EL1,
36463d423a7SMarc Zyngier FEAT_LOR),
36563d423a7SMarc Zyngier NEEDS_FEAT(HFGWTR_EL2_APIBKey |
36663d423a7SMarc Zyngier HFGWTR_EL2_APIAKey |
36763d423a7SMarc Zyngier HFGWTR_EL2_APGAKey |
36863d423a7SMarc Zyngier HFGWTR_EL2_APDBKey |
36963d423a7SMarc Zyngier HFGWTR_EL2_APDAKey,
37063d423a7SMarc Zyngier feat_pauth),
37163d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HFGWTR_EL2_VBAR_EL1 |
37263d423a7SMarc Zyngier HFGWTR_EL2_TTBR1_EL1 |
37363d423a7SMarc Zyngier HFGWTR_EL2_TTBR0_EL1 |
37463d423a7SMarc Zyngier HFGWTR_EL2_TPIDR_EL0 |
37563d423a7SMarc Zyngier HFGWTR_EL2_TPIDRRO_EL0 |
37663d423a7SMarc Zyngier HFGWTR_EL2_TPIDR_EL1 |
37763d423a7SMarc Zyngier HFGWTR_EL2_TCR_EL1 |
37863d423a7SMarc Zyngier HFGWTR_EL2_SCTLR_EL1 |
37963d423a7SMarc Zyngier HFGWTR_EL2_PAR_EL1 |
38063d423a7SMarc Zyngier HFGWTR_EL2_MAIR_EL1 |
38163d423a7SMarc Zyngier HFGWTR_EL2_FAR_EL1 |
38263d423a7SMarc Zyngier HFGWTR_EL2_ESR_EL1 |
38363d423a7SMarc Zyngier HFGWTR_EL2_CSSELR_EL1 |
38463d423a7SMarc Zyngier HFGWTR_EL2_CPACR_EL1 |
38563d423a7SMarc Zyngier HFGWTR_EL2_CONTEXTIDR_EL1|
38663d423a7SMarc Zyngier HFGWTR_EL2_AMAIR_EL1 |
38763d423a7SMarc Zyngier HFGWTR_EL2_AFSR1_EL1 |
38863d423a7SMarc Zyngier HFGWTR_EL2_AFSR0_EL1,
38963d423a7SMarc Zyngier NEVER_FGU, FEAT_AA64EL1),
39063d423a7SMarc Zyngier };
39163d423a7SMarc Zyngier
39263d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hdfgrtr_feat_map[] = {
39363d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_PMBIDR_EL1 |
39463d423a7SMarc Zyngier HDFGRTR_EL2_PMSLATFR_EL1 |
39563d423a7SMarc Zyngier HDFGRTR_EL2_PMSIRR_EL1 |
39663d423a7SMarc Zyngier HDFGRTR_EL2_PMSIDR_EL1 |
39763d423a7SMarc Zyngier HDFGRTR_EL2_PMSICR_EL1 |
39863d423a7SMarc Zyngier HDFGRTR_EL2_PMSFCR_EL1 |
39963d423a7SMarc Zyngier HDFGRTR_EL2_PMSEVFR_EL1 |
40063d423a7SMarc Zyngier HDFGRTR_EL2_PMSCR_EL1 |
40163d423a7SMarc Zyngier HDFGRTR_EL2_PMBSR_EL1 |
40263d423a7SMarc Zyngier HDFGRTR_EL2_PMBPTR_EL1 |
40363d423a7SMarc Zyngier HDFGRTR_EL2_PMBLIMITR_EL1,
40463d423a7SMarc Zyngier FEAT_SPE),
40563d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
40663d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_nBRBDATA |
40763d423a7SMarc Zyngier HDFGRTR_EL2_nBRBCTL |
40863d423a7SMarc Zyngier HDFGRTR_EL2_nBRBIDR,
40963d423a7SMarc Zyngier FEAT_BRBE),
41063d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_TRCVICTLR |
41163d423a7SMarc Zyngier HDFGRTR_EL2_TRCSTATR |
41263d423a7SMarc Zyngier HDFGRTR_EL2_TRCSSCSRn |
41363d423a7SMarc Zyngier HDFGRTR_EL2_TRCSEQSTR |
41463d423a7SMarc Zyngier HDFGRTR_EL2_TRCPRGCTLR |
41563d423a7SMarc Zyngier HDFGRTR_EL2_TRCOSLSR |
41663d423a7SMarc Zyngier HDFGRTR_EL2_TRCIMSPECn |
41763d423a7SMarc Zyngier HDFGRTR_EL2_TRCID |
41863d423a7SMarc Zyngier HDFGRTR_EL2_TRCCNTVRn |
41963d423a7SMarc Zyngier HDFGRTR_EL2_TRCCLAIM |
42063d423a7SMarc Zyngier HDFGRTR_EL2_TRCAUXCTLR |
42163d423a7SMarc Zyngier HDFGRTR_EL2_TRCAUTHSTATUS |
42263d423a7SMarc Zyngier HDFGRTR_EL2_TRC,
42363d423a7SMarc Zyngier FEAT_TRC_SR),
42463d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_PMCEIDn_EL0 |
42563d423a7SMarc Zyngier HDFGRTR_EL2_PMUSERENR_EL0 |
42663d423a7SMarc Zyngier HDFGRTR_EL2_PMMIR_EL1 |
42763d423a7SMarc Zyngier HDFGRTR_EL2_PMSELR_EL0 |
42863d423a7SMarc Zyngier HDFGRTR_EL2_PMOVS |
42963d423a7SMarc Zyngier HDFGRTR_EL2_PMINTEN |
43063d423a7SMarc Zyngier HDFGRTR_EL2_PMCNTEN |
43163d423a7SMarc Zyngier HDFGRTR_EL2_PMCCNTR_EL0 |
43263d423a7SMarc Zyngier HDFGRTR_EL2_PMCCFILTR_EL0 |
43363d423a7SMarc Zyngier HDFGRTR_EL2_PMEVTYPERn_EL0 |
43463d423a7SMarc Zyngier HDFGRTR_EL2_PMEVCNTRn_EL0,
43563d423a7SMarc Zyngier FEAT_PMUv3),
43663d423a7SMarc Zyngier NEEDS_FEAT(HDFGRTR_EL2_TRBTRG_EL1 |
43763d423a7SMarc Zyngier HDFGRTR_EL2_TRBSR_EL1 |
43863d423a7SMarc Zyngier HDFGRTR_EL2_TRBPTR_EL1 |
43963d423a7SMarc Zyngier HDFGRTR_EL2_TRBMAR_EL1 |
44063d423a7SMarc Zyngier HDFGRTR_EL2_TRBLIMITR_EL1 |
44163d423a7SMarc Zyngier HDFGRTR_EL2_TRBIDR_EL1 |
44263d423a7SMarc Zyngier HDFGRTR_EL2_TRBBASER_EL1,
44363d423a7SMarc Zyngier FEAT_TRBE),
44463d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HDFGRTR_EL2_OSDLR_EL1, NEVER_FGU,
44563d423a7SMarc Zyngier FEAT_DoubleLock),
44663d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HDFGRTR_EL2_OSECCR_EL1 |
44763d423a7SMarc Zyngier HDFGRTR_EL2_OSLSR_EL1 |
44863d423a7SMarc Zyngier HDFGRTR_EL2_DBGPRCR_EL1 |
44963d423a7SMarc Zyngier HDFGRTR_EL2_DBGAUTHSTATUS_EL1|
45063d423a7SMarc Zyngier HDFGRTR_EL2_DBGCLAIM |
45163d423a7SMarc Zyngier HDFGRTR_EL2_MDSCR_EL1 |
45263d423a7SMarc Zyngier HDFGRTR_EL2_DBGWVRn_EL1 |
45363d423a7SMarc Zyngier HDFGRTR_EL2_DBGWCRn_EL1 |
45463d423a7SMarc Zyngier HDFGRTR_EL2_DBGBVRn_EL1 |
45563d423a7SMarc Zyngier HDFGRTR_EL2_DBGBCRn_EL1,
45663d423a7SMarc Zyngier NEVER_FGU, FEAT_AA64EL1)
45763d423a7SMarc Zyngier };
45863d423a7SMarc Zyngier
45963d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hdfgwtr_feat_map[] = {
46063d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_PMSLATFR_EL1 |
46163d423a7SMarc Zyngier HDFGWTR_EL2_PMSIRR_EL1 |
46263d423a7SMarc Zyngier HDFGWTR_EL2_PMSICR_EL1 |
46363d423a7SMarc Zyngier HDFGWTR_EL2_PMSFCR_EL1 |
46463d423a7SMarc Zyngier HDFGWTR_EL2_PMSEVFR_EL1 |
46563d423a7SMarc Zyngier HDFGWTR_EL2_PMSCR_EL1 |
46663d423a7SMarc Zyngier HDFGWTR_EL2_PMBSR_EL1 |
46763d423a7SMarc Zyngier HDFGWTR_EL2_PMBPTR_EL1 |
46863d423a7SMarc Zyngier HDFGWTR_EL2_PMBLIMITR_EL1,
46963d423a7SMarc Zyngier FEAT_SPE),
47063d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
47163d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_nBRBDATA |
47263d423a7SMarc Zyngier HDFGWTR_EL2_nBRBCTL,
47363d423a7SMarc Zyngier FEAT_BRBE),
47463d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_TRCVICTLR |
47563d423a7SMarc Zyngier HDFGWTR_EL2_TRCSSCSRn |
47663d423a7SMarc Zyngier HDFGWTR_EL2_TRCSEQSTR |
47763d423a7SMarc Zyngier HDFGWTR_EL2_TRCPRGCTLR |
47863d423a7SMarc Zyngier HDFGWTR_EL2_TRCOSLAR |
47963d423a7SMarc Zyngier HDFGWTR_EL2_TRCIMSPECn |
48063d423a7SMarc Zyngier HDFGWTR_EL2_TRCCNTVRn |
48163d423a7SMarc Zyngier HDFGWTR_EL2_TRCCLAIM |
48263d423a7SMarc Zyngier HDFGWTR_EL2_TRCAUXCTLR |
48363d423a7SMarc Zyngier HDFGWTR_EL2_TRC,
48463d423a7SMarc Zyngier FEAT_TRC_SR),
48563d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_PMUSERENR_EL0 |
48663d423a7SMarc Zyngier HDFGWTR_EL2_PMCR_EL0 |
48763d423a7SMarc Zyngier HDFGWTR_EL2_PMSWINC_EL0 |
48863d423a7SMarc Zyngier HDFGWTR_EL2_PMSELR_EL0 |
48963d423a7SMarc Zyngier HDFGWTR_EL2_PMOVS |
49063d423a7SMarc Zyngier HDFGWTR_EL2_PMINTEN |
49163d423a7SMarc Zyngier HDFGWTR_EL2_PMCNTEN |
49263d423a7SMarc Zyngier HDFGWTR_EL2_PMCCNTR_EL0 |
49363d423a7SMarc Zyngier HDFGWTR_EL2_PMCCFILTR_EL0 |
49463d423a7SMarc Zyngier HDFGWTR_EL2_PMEVTYPERn_EL0 |
49563d423a7SMarc Zyngier HDFGWTR_EL2_PMEVCNTRn_EL0,
49663d423a7SMarc Zyngier FEAT_PMUv3),
49763d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_TRBTRG_EL1 |
49863d423a7SMarc Zyngier HDFGWTR_EL2_TRBSR_EL1 |
49963d423a7SMarc Zyngier HDFGWTR_EL2_TRBPTR_EL1 |
50063d423a7SMarc Zyngier HDFGWTR_EL2_TRBMAR_EL1 |
50163d423a7SMarc Zyngier HDFGWTR_EL2_TRBLIMITR_EL1 |
50263d423a7SMarc Zyngier HDFGWTR_EL2_TRBBASER_EL1,
50363d423a7SMarc Zyngier FEAT_TRBE),
50463d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HDFGWTR_EL2_OSDLR_EL1,
50563d423a7SMarc Zyngier NEVER_FGU, FEAT_DoubleLock),
50663d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HDFGWTR_EL2_OSECCR_EL1 |
50763d423a7SMarc Zyngier HDFGWTR_EL2_OSLAR_EL1 |
50863d423a7SMarc Zyngier HDFGWTR_EL2_DBGPRCR_EL1 |
50963d423a7SMarc Zyngier HDFGWTR_EL2_DBGCLAIM |
51063d423a7SMarc Zyngier HDFGWTR_EL2_MDSCR_EL1 |
51163d423a7SMarc Zyngier HDFGWTR_EL2_DBGWVRn_EL1 |
51263d423a7SMarc Zyngier HDFGWTR_EL2_DBGWCRn_EL1 |
51363d423a7SMarc Zyngier HDFGWTR_EL2_DBGBVRn_EL1 |
51463d423a7SMarc Zyngier HDFGWTR_EL2_DBGBCRn_EL1,
51563d423a7SMarc Zyngier NEVER_FGU, FEAT_AA64EL1),
51663d423a7SMarc Zyngier NEEDS_FEAT(HDFGWTR_EL2_TRFCR_EL1, FEAT_TRF),
51763d423a7SMarc Zyngier };
51863d423a7SMarc Zyngier
51963d423a7SMarc Zyngier
52063d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hfgitr_feat_map[] = {
52163d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_PSBCSYNC, FEAT_SPEv1p5),
52263d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_ATS1E1A, FEAT_ATS1A),
52363d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_COSPRCTX, FEAT_SPECRES2),
52463d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_nGCSEPP |
52563d423a7SMarc Zyngier HFGITR_EL2_nGCSSTR_EL1 |
52663d423a7SMarc Zyngier HFGITR_EL2_nGCSPUSHM_EL1,
52763d423a7SMarc Zyngier FEAT_GCS),
52863d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_nBRBIALL |
52963d423a7SMarc Zyngier HFGITR_EL2_nBRBINJ,
53063d423a7SMarc Zyngier FEAT_BRBE),
53163d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_CPPRCTX |
53263d423a7SMarc Zyngier HFGITR_EL2_DVPRCTX |
53363d423a7SMarc Zyngier HFGITR_EL2_CFPRCTX,
53463d423a7SMarc Zyngier FEAT_SPECRES),
53563d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_TLBIRVAALE1 |
53663d423a7SMarc Zyngier HFGITR_EL2_TLBIRVALE1 |
53763d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAAE1 |
53863d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAE1 |
53963d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAALE1IS |
54063d423a7SMarc Zyngier HFGITR_EL2_TLBIRVALE1IS |
54163d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAAE1IS |
54263d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAE1IS |
54363d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAALE1OS |
54463d423a7SMarc Zyngier HFGITR_EL2_TLBIRVALE1OS |
54563d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAAE1OS |
54663d423a7SMarc Zyngier HFGITR_EL2_TLBIRVAE1OS,
54763d423a7SMarc Zyngier FEAT_TLBIRANGE),
54863d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_TLBIVAALE1OS |
54963d423a7SMarc Zyngier HFGITR_EL2_TLBIVALE1OS |
55063d423a7SMarc Zyngier HFGITR_EL2_TLBIVAAE1OS |
55163d423a7SMarc Zyngier HFGITR_EL2_TLBIASIDE1OS |
55263d423a7SMarc Zyngier HFGITR_EL2_TLBIVAE1OS |
55363d423a7SMarc Zyngier HFGITR_EL2_TLBIVMALLE1OS,
55463d423a7SMarc Zyngier FEAT_TLBIOS),
55563d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_ATS1E1WP |
55663d423a7SMarc Zyngier HFGITR_EL2_ATS1E1RP,
55763d423a7SMarc Zyngier FEAT_PAN2),
55863d423a7SMarc Zyngier NEEDS_FEAT(HFGITR_EL2_DCCVADP, FEAT_DPB2),
55963d423a7SMarc Zyngier NEEDS_FEAT_FLAG(HFGITR_EL2_DCCVAC |
56063d423a7SMarc Zyngier HFGITR_EL2_SVC_EL1 |
56163d423a7SMarc Zyngier HFGITR_EL2_SVC_EL0 |
56263d423a7SMarc Zyngier HFGITR_EL2_ERET |
56363d423a7SMarc Zyngier HFGITR_EL2_TLBIVAALE1 |
56463d423a7SMarc Zyngier HFGITR_EL2_TLBIVALE1 |
56563d423a7SMarc Zyngier HFGITR_EL2_TLBIVAAE1 |
56663d423a7SMarc Zyngier HFGITR_EL2_TLBIASIDE1 |
56763d423a7SMarc Zyngier HFGITR_EL2_TLBIVAE1 |
56863d423a7SMarc Zyngier HFGITR_EL2_TLBIVMALLE1 |
56963d423a7SMarc Zyngier HFGITR_EL2_TLBIVAALE1IS |
57063d423a7SMarc Zyngier HFGITR_EL2_TLBIVALE1IS |
57163d423a7SMarc Zyngier HFGITR_EL2_TLBIVAAE1IS |
57263d423a7SMarc Zyngier HFGITR_EL2_TLBIASIDE1IS |
57363d423a7SMarc Zyngier HFGITR_EL2_TLBIVAE1IS |
57463d423a7SMarc Zyngier HFGITR_EL2_TLBIVMALLE1IS|
57563d423a7SMarc Zyngier HFGITR_EL2_ATS1E0W |
57663d423a7SMarc Zyngier HFGITR_EL2_ATS1E0R |
57763d423a7SMarc Zyngier HFGITR_EL2_ATS1E1W |
57863d423a7SMarc Zyngier HFGITR_EL2_ATS1E1R |
57963d423a7SMarc Zyngier HFGITR_EL2_DCZVA |
58063d423a7SMarc Zyngier HFGITR_EL2_DCCIVAC |
58163d423a7SMarc Zyngier HFGITR_EL2_DCCVAP |
58263d423a7SMarc Zyngier HFGITR_EL2_DCCVAU |
58363d423a7SMarc Zyngier HFGITR_EL2_DCCISW |
58463d423a7SMarc Zyngier HFGITR_EL2_DCCSW |
58563d423a7SMarc Zyngier HFGITR_EL2_DCISW |
58663d423a7SMarc Zyngier HFGITR_EL2_DCIVAC |
58763d423a7SMarc Zyngier HFGITR_EL2_ICIVAU |
58863d423a7SMarc Zyngier HFGITR_EL2_ICIALLU |
58963d423a7SMarc Zyngier HFGITR_EL2_ICIALLUIS,
59063d423a7SMarc Zyngier NEVER_FGU, FEAT_AA64EL1),
59163d423a7SMarc Zyngier };
59263d423a7SMarc Zyngier
59363d423a7SMarc Zyngier static const struct reg_bits_to_feat_map hafgrtr_feat_map[] = {
59463d423a7SMarc Zyngier NEEDS_FEAT(HAFGRTR_EL2_AMEVTYPER115_EL0 |
59563d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER114_EL0 |
59663d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER113_EL0 |
59763d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER112_EL0 |
59863d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER111_EL0 |
59963d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER110_EL0 |
60063d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER19_EL0 |
60163d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER18_EL0 |
60263d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER17_EL0 |
60363d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER16_EL0 |
60463d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER15_EL0 |
60563d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER14_EL0 |
60663d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER13_EL0 |
60763d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER12_EL0 |
60863d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER11_EL0 |
60963d423a7SMarc Zyngier HAFGRTR_EL2_AMEVTYPER10_EL0 |
61063d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR115_EL0 |
61163d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR114_EL0 |
61263d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR113_EL0 |
61363d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR112_EL0 |
61463d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR111_EL0 |
61563d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR110_EL0 |
61663d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR19_EL0 |
61763d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR18_EL0 |
61863d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR17_EL0 |
61963d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR16_EL0 |
62063d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR15_EL0 |
62163d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR14_EL0 |
62263d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR13_EL0 |
62363d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR12_EL0 |
62463d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR11_EL0 |
62563d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR10_EL0 |
62663d423a7SMarc Zyngier HAFGRTR_EL2_AMCNTEN1 |
62763d423a7SMarc Zyngier HAFGRTR_EL2_AMCNTEN0 |
62863d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR03_EL0 |
62963d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR02_EL0 |
63063d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR01_EL0 |
63163d423a7SMarc Zyngier HAFGRTR_EL2_AMEVCNTR00_EL0,
63263d423a7SMarc Zyngier FEAT_AMUv1),
63363d423a7SMarc Zyngier };
63463d423a7SMarc Zyngier
635*4bc0fe08SMarc Zyngier static const struct reg_bits_to_feat_map hfgitr2_feat_map[] = {
636*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGITR2_EL2_nDCCIVAPS, FEAT_PoPS),
637*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGITR2_EL2_TSBCSYNC, FEAT_TRBEv1p1)
638*4bc0fe08SMarc Zyngier };
639*4bc0fe08SMarc Zyngier
640*4bc0fe08SMarc Zyngier static const struct reg_bits_to_feat_map hfgrtr2_feat_map[] = {
641*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGRTR2_EL2_nPFAR_EL1, FEAT_PFAR),
642*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGRTR2_EL2_nERXGSR_EL1, FEAT_RASv2),
643*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGRTR2_EL2_nACTLRALIAS_EL1 |
644*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nACTLRMASK_EL1 |
645*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nCPACRALIAS_EL1 |
646*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nCPACRMASK_EL1 |
647*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nSCTLR2MASK_EL1 |
648*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nSCTLRALIAS2_EL1 |
649*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nSCTLRALIAS_EL1 |
650*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nSCTLRMASK_EL1 |
651*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nTCR2ALIAS_EL1 |
652*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nTCR2MASK_EL1 |
653*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nTCRALIAS_EL1 |
654*4bc0fe08SMarc Zyngier HFGRTR2_EL2_nTCRMASK_EL1,
655*4bc0fe08SMarc Zyngier FEAT_SRMASK),
656*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGRTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
657*4bc0fe08SMarc Zyngier };
658*4bc0fe08SMarc Zyngier
659*4bc0fe08SMarc Zyngier static const struct reg_bits_to_feat_map hfgwtr2_feat_map[] = {
660*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGWTR2_EL2_nPFAR_EL1, FEAT_PFAR),
661*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGWTR2_EL2_nACTLRALIAS_EL1 |
662*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nACTLRMASK_EL1 |
663*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nCPACRALIAS_EL1 |
664*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nCPACRMASK_EL1 |
665*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nSCTLR2MASK_EL1 |
666*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nSCTLRALIAS2_EL1 |
667*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nSCTLRALIAS_EL1 |
668*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nSCTLRMASK_EL1 |
669*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nTCR2ALIAS_EL1 |
670*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nTCR2MASK_EL1 |
671*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nTCRALIAS_EL1 |
672*4bc0fe08SMarc Zyngier HFGWTR2_EL2_nTCRMASK_EL1,
673*4bc0fe08SMarc Zyngier FEAT_SRMASK),
674*4bc0fe08SMarc Zyngier NEEDS_FEAT(HFGWTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
675*4bc0fe08SMarc Zyngier };
676*4bc0fe08SMarc Zyngier
677*4bc0fe08SMarc Zyngier static const struct reg_bits_to_feat_map hdfgrtr2_feat_map[] = {
678*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
679*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
680*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
681*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMICFILTR_EL0 |
682*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nPMICNTR_EL0,
683*4bc0fe08SMarc Zyngier FEAT_PMUv3_ICNTR),
684*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMUACR_EL1, FEAT_PMUv3p9),
685*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMSSCR_EL1 |
686*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nPMSSDATA,
687*4bc0fe08SMarc Zyngier FEAT_PMUv3_SS),
688*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
689*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
690*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
691*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nSPMACCESSR_EL1 |
692*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMCNTEN |
693*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMCR_EL0 |
694*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMDEVAFF_EL1 |
695*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMEVCNTRn_EL0 |
696*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMEVTYPERn_EL0|
697*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMID |
698*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMINTEN |
699*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMOVS |
700*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMSCR_EL1 |
701*4bc0fe08SMarc Zyngier HDFGRTR2_EL2_nSPMSELR_EL0,
702*4bc0fe08SMarc Zyngier FEAT_SPMU),
703*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
704*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGRTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
705*4bc0fe08SMarc Zyngier };
706*4bc0fe08SMarc Zyngier
707*4bc0fe08SMarc Zyngier static const struct reg_bits_to_feat_map hdfgwtr2_feat_map[] = {
708*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
709*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
710*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
711*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMICFILTR_EL0 |
712*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nPMICNTR_EL0,
713*4bc0fe08SMarc Zyngier FEAT_PMUv3_ICNTR),
714*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMUACR_EL1 |
715*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nPMZR_EL0,
716*4bc0fe08SMarc Zyngier FEAT_PMUv3p9),
717*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMSSCR_EL1, FEAT_PMUv3_SS),
718*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
719*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
720*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
721*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nSPMACCESSR_EL1 |
722*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMCNTEN |
723*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMCR_EL0 |
724*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMEVCNTRn_EL0 |
725*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMEVTYPERn_EL0|
726*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMINTEN |
727*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMOVS |
728*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMSCR_EL1 |
729*4bc0fe08SMarc Zyngier HDFGWTR2_EL2_nSPMSELR_EL0,
730*4bc0fe08SMarc Zyngier FEAT_SPMU),
731*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
732*4bc0fe08SMarc Zyngier NEEDS_FEAT(HDFGWTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
733*4bc0fe08SMarc Zyngier };
734*4bc0fe08SMarc Zyngier
735beed4448SMarc Zyngier static const struct reg_bits_to_feat_map hcrx_feat_map[] = {
736beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_PACMEn, feat_pauth_lr),
737beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnFPM, FEAT_FPMR),
738beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_GCSEn, FEAT_GCS),
739beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnIDCP128, FEAT_SYSREG128),
740beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnSDERR, feat_aderr),
741beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_TMEA, FEAT_DoubleFault2),
742beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnSNERR, feat_anerr),
743beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_D128En, FEAT_D128),
744beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_PTTWI, FEAT_THE),
745beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_SCTLR2En, FEAT_SCTLR2),
746beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_TCR2En, FEAT_TCR2),
747beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_MSCEn |
748beed4448SMarc Zyngier HCRX_EL2_MCE2,
749beed4448SMarc Zyngier FEAT_MOPS),
750beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_CMOW, FEAT_CMOW),
751beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_VFNMI |
752beed4448SMarc Zyngier HCRX_EL2_VINMI |
753beed4448SMarc Zyngier HCRX_EL2_TALLINT,
754beed4448SMarc Zyngier FEAT_NMI),
755beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_SMPME, feat_sme_smps),
756beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_FGTnXS |
757beed4448SMarc Zyngier HCRX_EL2_FnXS,
758beed4448SMarc Zyngier FEAT_XS),
759beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnASR, FEAT_LS64_V),
760beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnALS, FEAT_LS64),
761beed4448SMarc Zyngier NEEDS_FEAT(HCRX_EL2_EnAS0, FEAT_LS64_ACCDATA),
762beed4448SMarc Zyngier };
763beed4448SMarc Zyngier
764b2a324ffSMarc Zyngier static const struct reg_bits_to_feat_map hcr_feat_map[] = {
765b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TID0, FEAT_AA32EL0),
766b2a324ffSMarc Zyngier NEEDS_FEAT_FIXED(HCR_EL2_RW, compute_hcr_rw),
767b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_HCD, not_feat_aa64el3),
768b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_AMO |
769b2a324ffSMarc Zyngier HCR_EL2_BSU |
770b2a324ffSMarc Zyngier HCR_EL2_CD |
771b2a324ffSMarc Zyngier HCR_EL2_DC |
772b2a324ffSMarc Zyngier HCR_EL2_FB |
773b2a324ffSMarc Zyngier HCR_EL2_FMO |
774b2a324ffSMarc Zyngier HCR_EL2_ID |
775b2a324ffSMarc Zyngier HCR_EL2_IMO |
776b2a324ffSMarc Zyngier HCR_EL2_MIOCNCE |
777b2a324ffSMarc Zyngier HCR_EL2_PTW |
778b2a324ffSMarc Zyngier HCR_EL2_SWIO |
779b2a324ffSMarc Zyngier HCR_EL2_TACR |
780b2a324ffSMarc Zyngier HCR_EL2_TDZ |
781b2a324ffSMarc Zyngier HCR_EL2_TGE |
782b2a324ffSMarc Zyngier HCR_EL2_TID1 |
783b2a324ffSMarc Zyngier HCR_EL2_TID2 |
784b2a324ffSMarc Zyngier HCR_EL2_TID3 |
785b2a324ffSMarc Zyngier HCR_EL2_TIDCP |
786b2a324ffSMarc Zyngier HCR_EL2_TPCP |
787b2a324ffSMarc Zyngier HCR_EL2_TPU |
788b2a324ffSMarc Zyngier HCR_EL2_TRVM |
789b2a324ffSMarc Zyngier HCR_EL2_TSC |
790b2a324ffSMarc Zyngier HCR_EL2_TSW |
791b2a324ffSMarc Zyngier HCR_EL2_TTLB |
792b2a324ffSMarc Zyngier HCR_EL2_TVM |
793b2a324ffSMarc Zyngier HCR_EL2_TWE |
794b2a324ffSMarc Zyngier HCR_EL2_TWI |
795b2a324ffSMarc Zyngier HCR_EL2_VF |
796b2a324ffSMarc Zyngier HCR_EL2_VI |
797b2a324ffSMarc Zyngier HCR_EL2_VM |
798b2a324ffSMarc Zyngier HCR_EL2_VSE,
799b2a324ffSMarc Zyngier FEAT_AA64EL1),
800b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_AMVOFFEN, FEAT_AMUv1p1),
801b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_EnSCXT, feat_csv2_2_csv2_1p2),
802b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TICAB |
803b2a324ffSMarc Zyngier HCR_EL2_TID4 |
804b2a324ffSMarc Zyngier HCR_EL2_TOCU,
805b2a324ffSMarc Zyngier FEAT_EVT),
806b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TTLBIS |
807b2a324ffSMarc Zyngier HCR_EL2_TTLBOS,
808b2a324ffSMarc Zyngier FEAT_EVT_TTLBxS),
809b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TLOR, FEAT_LOR),
810b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_ATA |
811b2a324ffSMarc Zyngier HCR_EL2_DCT |
812b2a324ffSMarc Zyngier HCR_EL2_TID5,
813b2a324ffSMarc Zyngier FEAT_MTE2),
814b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_AT | /* Ignore the original FEAT_NV */
815b2a324ffSMarc Zyngier HCR_EL2_NV2 |
816b2a324ffSMarc Zyngier HCR_EL2_NV,
817b2a324ffSMarc Zyngier feat_nv2),
818b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_NV1, feat_nv2_e2h0_ni), /* Missing from JSON */
819b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_API |
820b2a324ffSMarc Zyngier HCR_EL2_APK,
821b2a324ffSMarc Zyngier feat_pauth),
822b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TEA |
823b2a324ffSMarc Zyngier HCR_EL2_TERR,
824b2a324ffSMarc Zyngier FEAT_RAS),
825b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_FIEN, feat_rasv1p1),
826b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_GPF, FEAT_RME),
827b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_FWB, FEAT_S2FWB),
828b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TME, FEAT_TME),
829b2a324ffSMarc Zyngier NEEDS_FEAT(HCR_EL2_TWEDEL |
830b2a324ffSMarc Zyngier HCR_EL2_TWEDEn,
831b2a324ffSMarc Zyngier FEAT_TWED),
832b2a324ffSMarc Zyngier NEEDS_FEAT_FIXED(HCR_EL2_E2H, compute_hcr_e2h),
833b2a324ffSMarc Zyngier };
834b2a324ffSMarc Zyngier
check_feat_map(const struct reg_bits_to_feat_map * map,int map_size,u64 res0,const char * str)835938a79d0SMarc Zyngier static void __init check_feat_map(const struct reg_bits_to_feat_map *map,
836938a79d0SMarc Zyngier int map_size, u64 res0, const char *str)
837938a79d0SMarc Zyngier {
838938a79d0SMarc Zyngier u64 mask = 0;
839938a79d0SMarc Zyngier
840938a79d0SMarc Zyngier for (int i = 0; i < map_size; i++)
841938a79d0SMarc Zyngier mask |= map[i].bits;
842938a79d0SMarc Zyngier
843938a79d0SMarc Zyngier if (mask != ~res0)
844938a79d0SMarc Zyngier kvm_err("Undefined %s behaviour, bits %016llx\n",
845938a79d0SMarc Zyngier str, mask ^ ~res0);
846938a79d0SMarc Zyngier }
847938a79d0SMarc Zyngier
check_feature_map(void)848938a79d0SMarc Zyngier void __init check_feature_map(void)
849938a79d0SMarc Zyngier {
850938a79d0SMarc Zyngier check_feat_map(hfgrtr_feat_map, ARRAY_SIZE(hfgrtr_feat_map),
851938a79d0SMarc Zyngier hfgrtr_masks.res0, hfgrtr_masks.str);
852938a79d0SMarc Zyngier check_feat_map(hfgwtr_feat_map, ARRAY_SIZE(hfgwtr_feat_map),
853938a79d0SMarc Zyngier hfgwtr_masks.res0, hfgwtr_masks.str);
854938a79d0SMarc Zyngier check_feat_map(hfgitr_feat_map, ARRAY_SIZE(hfgitr_feat_map),
855938a79d0SMarc Zyngier hfgitr_masks.res0, hfgitr_masks.str);
856938a79d0SMarc Zyngier check_feat_map(hdfgrtr_feat_map, ARRAY_SIZE(hdfgrtr_feat_map),
857938a79d0SMarc Zyngier hdfgrtr_masks.res0, hdfgrtr_masks.str);
858938a79d0SMarc Zyngier check_feat_map(hdfgwtr_feat_map, ARRAY_SIZE(hdfgwtr_feat_map),
859938a79d0SMarc Zyngier hdfgwtr_masks.res0, hdfgwtr_masks.str);
860938a79d0SMarc Zyngier check_feat_map(hafgrtr_feat_map, ARRAY_SIZE(hafgrtr_feat_map),
861938a79d0SMarc Zyngier hafgrtr_masks.res0, hafgrtr_masks.str);
862beed4448SMarc Zyngier check_feat_map(hcrx_feat_map, ARRAY_SIZE(hcrx_feat_map),
863beed4448SMarc Zyngier __HCRX_EL2_RES0, "HCRX_EL2");
864b2a324ffSMarc Zyngier check_feat_map(hcr_feat_map, ARRAY_SIZE(hcr_feat_map),
865b2a324ffSMarc Zyngier HCR_EL2_RES0, "HCR_EL2");
866938a79d0SMarc Zyngier }
867938a79d0SMarc Zyngier
idreg_feat_match(struct kvm * kvm,const struct reg_bits_to_feat_map * map)86863d423a7SMarc Zyngier static bool idreg_feat_match(struct kvm *kvm, const struct reg_bits_to_feat_map *map)
86963d423a7SMarc Zyngier {
87063d423a7SMarc Zyngier u64 regval = kvm->arch.id_regs[map->regidx];
87163d423a7SMarc Zyngier u64 regfld = (regval >> map->shift) & GENMASK(map->width - 1, 0);
87263d423a7SMarc Zyngier
87363d423a7SMarc Zyngier if (map->sign) {
87463d423a7SMarc Zyngier s64 sfld = sign_extend64(regfld, map->width - 1);
87563d423a7SMarc Zyngier s64 slim = sign_extend64(map->lo_lim, map->width - 1);
87663d423a7SMarc Zyngier return sfld >= slim;
87763d423a7SMarc Zyngier } else {
87863d423a7SMarc Zyngier return regfld >= map->lo_lim;
87963d423a7SMarc Zyngier }
88063d423a7SMarc Zyngier }
88163d423a7SMarc Zyngier
__compute_fixed_bits(struct kvm * kvm,const struct reg_bits_to_feat_map * map,int map_size,u64 * fixed_bits,unsigned long require,unsigned long exclude)88263d423a7SMarc Zyngier static u64 __compute_fixed_bits(struct kvm *kvm,
88363d423a7SMarc Zyngier const struct reg_bits_to_feat_map *map,
88463d423a7SMarc Zyngier int map_size,
88563d423a7SMarc Zyngier u64 *fixed_bits,
88663d423a7SMarc Zyngier unsigned long require,
88763d423a7SMarc Zyngier unsigned long exclude)
88863d423a7SMarc Zyngier {
88963d423a7SMarc Zyngier u64 val = 0;
89063d423a7SMarc Zyngier
89163d423a7SMarc Zyngier for (int i = 0; i < map_size; i++) {
89263d423a7SMarc Zyngier bool match;
89363d423a7SMarc Zyngier
89463d423a7SMarc Zyngier if ((map[i].flags & require) != require)
89563d423a7SMarc Zyngier continue;
89663d423a7SMarc Zyngier
89763d423a7SMarc Zyngier if (map[i].flags & exclude)
89863d423a7SMarc Zyngier continue;
89963d423a7SMarc Zyngier
90063d423a7SMarc Zyngier if (map[i].flags & CALL_FUNC)
90163d423a7SMarc Zyngier match = (map[i].flags & FIXED_VALUE) ?
90263d423a7SMarc Zyngier map[i].fval(kvm, fixed_bits) :
90363d423a7SMarc Zyngier map[i].match(kvm);
90463d423a7SMarc Zyngier else
90563d423a7SMarc Zyngier match = idreg_feat_match(kvm, &map[i]);
90663d423a7SMarc Zyngier
90763d423a7SMarc Zyngier if (!match || (map[i].flags & FIXED_VALUE))
90863d423a7SMarc Zyngier val |= map[i].bits;
90963d423a7SMarc Zyngier }
91063d423a7SMarc Zyngier
91163d423a7SMarc Zyngier return val;
91263d423a7SMarc Zyngier }
91363d423a7SMarc Zyngier
compute_res0_bits(struct kvm * kvm,const struct reg_bits_to_feat_map * map,int map_size,unsigned long require,unsigned long exclude)91463d423a7SMarc Zyngier static u64 compute_res0_bits(struct kvm *kvm,
91563d423a7SMarc Zyngier const struct reg_bits_to_feat_map *map,
91663d423a7SMarc Zyngier int map_size,
91763d423a7SMarc Zyngier unsigned long require,
91863d423a7SMarc Zyngier unsigned long exclude)
91963d423a7SMarc Zyngier {
92063d423a7SMarc Zyngier return __compute_fixed_bits(kvm, map, map_size, NULL,
92163d423a7SMarc Zyngier require, exclude | FIXED_VALUE);
92263d423a7SMarc Zyngier }
92363d423a7SMarc Zyngier
compute_fixed_bits(struct kvm * kvm,const struct reg_bits_to_feat_map * map,int map_size,u64 * fixed_bits,unsigned long require,unsigned long exclude)924b2a324ffSMarc Zyngier static u64 compute_fixed_bits(struct kvm *kvm,
925b2a324ffSMarc Zyngier const struct reg_bits_to_feat_map *map,
926b2a324ffSMarc Zyngier int map_size,
927b2a324ffSMarc Zyngier u64 *fixed_bits,
928b2a324ffSMarc Zyngier unsigned long require,
929b2a324ffSMarc Zyngier unsigned long exclude)
930b2a324ffSMarc Zyngier {
931b2a324ffSMarc Zyngier return __compute_fixed_bits(kvm, map, map_size, fixed_bits,
932b2a324ffSMarc Zyngier require | FIXED_VALUE, exclude);
933b2a324ffSMarc Zyngier }
934b2a324ffSMarc Zyngier
compute_fgu(struct kvm * kvm,enum fgt_group_id fgt)93563d423a7SMarc Zyngier void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt)
93663d423a7SMarc Zyngier {
93763d423a7SMarc Zyngier u64 val = 0;
93863d423a7SMarc Zyngier
93963d423a7SMarc Zyngier switch (fgt) {
94063d423a7SMarc Zyngier case HFGRTR_GROUP:
94163d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hfgrtr_feat_map,
94263d423a7SMarc Zyngier ARRAY_SIZE(hfgrtr_feat_map),
94363d423a7SMarc Zyngier 0, NEVER_FGU);
94463d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hfgwtr_feat_map,
94563d423a7SMarc Zyngier ARRAY_SIZE(hfgwtr_feat_map),
94663d423a7SMarc Zyngier 0, NEVER_FGU);
94763d423a7SMarc Zyngier break;
94863d423a7SMarc Zyngier case HFGITR_GROUP:
94963d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hfgitr_feat_map,
95063d423a7SMarc Zyngier ARRAY_SIZE(hfgitr_feat_map),
95163d423a7SMarc Zyngier 0, NEVER_FGU);
95263d423a7SMarc Zyngier break;
95363d423a7SMarc Zyngier case HDFGRTR_GROUP:
95463d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hdfgrtr_feat_map,
95563d423a7SMarc Zyngier ARRAY_SIZE(hdfgrtr_feat_map),
95663d423a7SMarc Zyngier 0, NEVER_FGU);
95763d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hdfgwtr_feat_map,
95863d423a7SMarc Zyngier ARRAY_SIZE(hdfgwtr_feat_map),
95963d423a7SMarc Zyngier 0, NEVER_FGU);
96063d423a7SMarc Zyngier break;
96163d423a7SMarc Zyngier case HAFGRTR_GROUP:
96263d423a7SMarc Zyngier val |= compute_res0_bits(kvm, hafgrtr_feat_map,
96363d423a7SMarc Zyngier ARRAY_SIZE(hafgrtr_feat_map),
96463d423a7SMarc Zyngier 0, NEVER_FGU);
96563d423a7SMarc Zyngier break;
966*4bc0fe08SMarc Zyngier case HFGRTR2_GROUP:
967*4bc0fe08SMarc Zyngier val |= compute_res0_bits(kvm, hfgrtr2_feat_map,
968*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgrtr2_feat_map),
969*4bc0fe08SMarc Zyngier 0, NEVER_FGU);
970*4bc0fe08SMarc Zyngier val |= compute_res0_bits(kvm, hfgwtr2_feat_map,
971*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgwtr2_feat_map),
972*4bc0fe08SMarc Zyngier 0, NEVER_FGU);
973*4bc0fe08SMarc Zyngier break;
974*4bc0fe08SMarc Zyngier case HFGITR2_GROUP:
975*4bc0fe08SMarc Zyngier val |= compute_res0_bits(kvm, hfgitr2_feat_map,
976*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgitr2_feat_map),
977*4bc0fe08SMarc Zyngier 0, NEVER_FGU);
978*4bc0fe08SMarc Zyngier break;
979*4bc0fe08SMarc Zyngier case HDFGRTR2_GROUP:
980*4bc0fe08SMarc Zyngier val |= compute_res0_bits(kvm, hdfgrtr2_feat_map,
981*4bc0fe08SMarc Zyngier ARRAY_SIZE(hdfgrtr2_feat_map),
982*4bc0fe08SMarc Zyngier 0, NEVER_FGU);
983*4bc0fe08SMarc Zyngier val |= compute_res0_bits(kvm, hdfgwtr2_feat_map,
984*4bc0fe08SMarc Zyngier ARRAY_SIZE(hdfgwtr2_feat_map),
985*4bc0fe08SMarc Zyngier 0, NEVER_FGU);
986*4bc0fe08SMarc Zyngier break;
98763d423a7SMarc Zyngier default:
98863d423a7SMarc Zyngier BUG();
98963d423a7SMarc Zyngier }
99063d423a7SMarc Zyngier
99163d423a7SMarc Zyngier kvm->arch.fgu[fgt] = val;
99263d423a7SMarc Zyngier }
993c6cbe6a4SMarc Zyngier
get_reg_fixed_bits(struct kvm * kvm,enum vcpu_sysreg reg,u64 * res0,u64 * res1)994c6cbe6a4SMarc Zyngier void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *res1)
995c6cbe6a4SMarc Zyngier {
996b2a324ffSMarc Zyngier u64 fixed = 0, mask;
997b2a324ffSMarc Zyngier
998c6cbe6a4SMarc Zyngier switch (reg) {
999c6cbe6a4SMarc Zyngier case HFGRTR_EL2:
1000c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgrtr_feat_map,
1001c6cbe6a4SMarc Zyngier ARRAY_SIZE(hfgrtr_feat_map), 0, 0);
1002c6cbe6a4SMarc Zyngier *res0 |= hfgrtr_masks.res0;
1003c6cbe6a4SMarc Zyngier *res1 = HFGRTR_EL2_RES1;
1004c6cbe6a4SMarc Zyngier break;
1005c6cbe6a4SMarc Zyngier case HFGWTR_EL2:
1006c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgwtr_feat_map,
1007c6cbe6a4SMarc Zyngier ARRAY_SIZE(hfgwtr_feat_map), 0, 0);
1008c6cbe6a4SMarc Zyngier *res0 |= hfgwtr_masks.res0;
1009c6cbe6a4SMarc Zyngier *res1 = HFGWTR_EL2_RES1;
1010c6cbe6a4SMarc Zyngier break;
1011c6cbe6a4SMarc Zyngier case HFGITR_EL2:
1012c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgitr_feat_map,
1013c6cbe6a4SMarc Zyngier ARRAY_SIZE(hfgitr_feat_map), 0, 0);
1014c6cbe6a4SMarc Zyngier *res0 |= hfgitr_masks.res0;
1015c6cbe6a4SMarc Zyngier *res1 = HFGITR_EL2_RES1;
1016c6cbe6a4SMarc Zyngier break;
1017c6cbe6a4SMarc Zyngier case HDFGRTR_EL2:
1018c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hdfgrtr_feat_map,
1019c6cbe6a4SMarc Zyngier ARRAY_SIZE(hdfgrtr_feat_map), 0, 0);
1020c6cbe6a4SMarc Zyngier *res0 |= hdfgrtr_masks.res0;
1021c6cbe6a4SMarc Zyngier *res1 = HDFGRTR_EL2_RES1;
1022c6cbe6a4SMarc Zyngier break;
1023c6cbe6a4SMarc Zyngier case HDFGWTR_EL2:
1024c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hdfgwtr_feat_map,
1025c6cbe6a4SMarc Zyngier ARRAY_SIZE(hdfgwtr_feat_map), 0, 0);
1026c6cbe6a4SMarc Zyngier *res0 |= hdfgwtr_masks.res0;
1027c6cbe6a4SMarc Zyngier *res1 = HDFGWTR_EL2_RES1;
1028c6cbe6a4SMarc Zyngier break;
1029c6cbe6a4SMarc Zyngier case HAFGRTR_EL2:
1030c6cbe6a4SMarc Zyngier *res0 = compute_res0_bits(kvm, hafgrtr_feat_map,
1031c6cbe6a4SMarc Zyngier ARRAY_SIZE(hafgrtr_feat_map), 0, 0);
1032c6cbe6a4SMarc Zyngier *res0 |= hafgrtr_masks.res0;
1033c6cbe6a4SMarc Zyngier *res1 = HAFGRTR_EL2_RES1;
1034c6cbe6a4SMarc Zyngier break;
1035*4bc0fe08SMarc Zyngier case HFGRTR2_EL2:
1036*4bc0fe08SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgrtr2_feat_map,
1037*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgrtr2_feat_map), 0, 0);
1038*4bc0fe08SMarc Zyngier *res0 |= hfgrtr2_masks.res0;
1039*4bc0fe08SMarc Zyngier *res1 = HFGRTR2_EL2_RES1;
1040*4bc0fe08SMarc Zyngier break;
1041*4bc0fe08SMarc Zyngier case HFGWTR2_EL2:
1042*4bc0fe08SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgwtr2_feat_map,
1043*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgwtr2_feat_map), 0, 0);
1044*4bc0fe08SMarc Zyngier *res0 |= hfgwtr2_masks.res0;
1045*4bc0fe08SMarc Zyngier *res1 = HFGWTR2_EL2_RES1;
1046*4bc0fe08SMarc Zyngier break;
1047*4bc0fe08SMarc Zyngier case HFGITR2_EL2:
1048*4bc0fe08SMarc Zyngier *res0 = compute_res0_bits(kvm, hfgitr2_feat_map,
1049*4bc0fe08SMarc Zyngier ARRAY_SIZE(hfgitr2_feat_map), 0, 0);
1050*4bc0fe08SMarc Zyngier *res0 |= hfgitr2_masks.res0;
1051*4bc0fe08SMarc Zyngier *res1 = HFGITR2_EL2_RES1;
1052*4bc0fe08SMarc Zyngier break;
1053*4bc0fe08SMarc Zyngier case HDFGRTR2_EL2:
1054*4bc0fe08SMarc Zyngier *res0 = compute_res0_bits(kvm, hdfgrtr2_feat_map,
1055*4bc0fe08SMarc Zyngier ARRAY_SIZE(hdfgrtr2_feat_map), 0, 0);
1056*4bc0fe08SMarc Zyngier *res0 |= hdfgrtr2_masks.res0;
1057*4bc0fe08SMarc Zyngier *res1 = HDFGRTR2_EL2_RES1;
1058*4bc0fe08SMarc Zyngier break;
1059*4bc0fe08SMarc Zyngier case HDFGWTR2_EL2:
1060*4bc0fe08SMarc Zyngier *res0 = compute_res0_bits(kvm, hdfgwtr2_feat_map,
1061*4bc0fe08SMarc Zyngier ARRAY_SIZE(hdfgwtr2_feat_map), 0, 0);
1062*4bc0fe08SMarc Zyngier *res0 |= hdfgwtr2_masks.res0;
1063*4bc0fe08SMarc Zyngier *res1 = HDFGWTR2_EL2_RES1;
1064*4bc0fe08SMarc Zyngier break;
1065beed4448SMarc Zyngier case HCRX_EL2:
1066beed4448SMarc Zyngier *res0 = compute_res0_bits(kvm, hcrx_feat_map,
1067beed4448SMarc Zyngier ARRAY_SIZE(hcrx_feat_map), 0, 0);
1068beed4448SMarc Zyngier *res0 |= __HCRX_EL2_RES0;
1069beed4448SMarc Zyngier *res1 = __HCRX_EL2_RES1;
1070beed4448SMarc Zyngier break;
1071b2a324ffSMarc Zyngier case HCR_EL2:
1072b2a324ffSMarc Zyngier mask = compute_fixed_bits(kvm, hcr_feat_map,
1073b2a324ffSMarc Zyngier ARRAY_SIZE(hcr_feat_map), &fixed,
1074b2a324ffSMarc Zyngier 0, 0);
1075b2a324ffSMarc Zyngier *res0 = compute_res0_bits(kvm, hcr_feat_map,
1076b2a324ffSMarc Zyngier ARRAY_SIZE(hcr_feat_map), 0, 0);
1077b2a324ffSMarc Zyngier *res0 |= HCR_EL2_RES0 | (mask & ~fixed);
1078b2a324ffSMarc Zyngier *res1 = HCR_EL2_RES1 | (mask & fixed);
1079b2a324ffSMarc Zyngier break;
1080c6cbe6a4SMarc Zyngier default:
1081c6cbe6a4SMarc Zyngier WARN_ON_ONCE(1);
1082c6cbe6a4SMarc Zyngier *res0 = *res1 = 0;
1083c6cbe6a4SMarc Zyngier break;
1084c6cbe6a4SMarc Zyngier }
1085c6cbe6a4SMarc Zyngier }
1086